mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Adds memory information about the script's cache to INFO
Implementation notes: as INFO is "already broken", I didn't want to break it further. Instead of computing the server.lua_script dict size on every call, I'm keeping a running sum of the body's length and dict overheads. This implementation is naive as it **does not** take into consideration dict rehashing, but that inaccuracy pays off in speed ;) Demo time: ```bash $ redis-cli info memory | grep "script" used_memory_scripts:96 used_memory_scripts_human:96B number_of_cached_scripts:0 $ redis-cli eval "" 0 ; redis-cli info memory | grep "script" (nil) used_memory_scripts:120 used_memory_scripts_human:120B number_of_cached_scripts:1 $ redis-cli script flush ; redis-cli info memory | grep "script" OK used_memory_scripts:96 used_memory_scripts_human:96B number_of_cached_scripts:0 $ redis-cli eval "return('Hello, Script Cache :)')" 0 ; redis-cli info memory | grep "script" "Hello, Script Cache :)" used_memory_scripts:152 used_memory_scripts_human:152B number_of_cached_scripts:1 $ redis-cli eval "return redis.sha1hex(\"return('Hello, Script Cache :)')\")" 0 ; redis-cli info memory | grep "script" "1be72729d43da5114929c1260a749073732dc822" used_memory_scripts:232 used_memory_scripts_human:232B number_of_cached_scripts:2 ✔ 19:03:54 redis [lua_scripts-in-info-memory L ✚…⚑] $ redis-cli evalsha 1be72729d43da5114929c1260a749073732dc822 0 "Hello, Script Cache :)" ```
This commit is contained in:
parent
404160a271
commit
49890c8ee9
@ -919,6 +919,7 @@ void scriptingInit(int setup) {
|
|||||||
* This is useful for replication, as we need to replicate EVALSHA
|
* This is useful for replication, as we need to replicate EVALSHA
|
||||||
* as EVAL, so we need to remember the associated script. */
|
* as EVAL, so we need to remember the associated script. */
|
||||||
server.lua_scripts = dictCreate(&shaScriptObjectDictType,NULL);
|
server.lua_scripts = dictCreate(&shaScriptObjectDictType,NULL);
|
||||||
|
server.lua_scripts_mem = sizeof(dict);
|
||||||
|
|
||||||
/* Register the redis commands table and fields */
|
/* Register the redis commands table and fields */
|
||||||
lua_newtable(lua);
|
lua_newtable(lua);
|
||||||
@ -1073,6 +1074,7 @@ void scriptingInit(int setup) {
|
|||||||
* This function is used in order to reset the scripting environment. */
|
* This function is used in order to reset the scripting environment. */
|
||||||
void scriptingRelease(void) {
|
void scriptingRelease(void) {
|
||||||
dictRelease(server.lua_scripts);
|
dictRelease(server.lua_scripts);
|
||||||
|
server.lua_scripts_mem = 0;
|
||||||
lua_close(server.lua);
|
lua_close(server.lua);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1207,6 +1209,7 @@ sds luaCreateFunction(client *c, lua_State *lua, robj *body) {
|
|||||||
* EVALSHA commands as EVAL using the original script. */
|
* EVALSHA commands as EVAL using the original script. */
|
||||||
int retval = dictAdd(server.lua_scripts,sha,body);
|
int retval = dictAdd(server.lua_scripts,sha,body);
|
||||||
serverAssertWithInfo(c ? c : server.lua_client,NULL,retval == DICT_OK);
|
serverAssertWithInfo(c ? c : server.lua_client,NULL,retval == DICT_OK);
|
||||||
|
server.lua_scripts_mem += sdslen(body->ptr) + sizeof(dictEntry);
|
||||||
incrRefCount(body);
|
incrRefCount(body);
|
||||||
return sha;
|
return sha;
|
||||||
}
|
}
|
||||||
|
@ -2994,6 +2994,7 @@ sds genRedisInfoString(char *section) {
|
|||||||
char peak_hmem[64];
|
char peak_hmem[64];
|
||||||
char total_system_hmem[64];
|
char total_system_hmem[64];
|
||||||
char used_memory_lua_hmem[64];
|
char used_memory_lua_hmem[64];
|
||||||
|
char used_memory_scripts_hmem[64];
|
||||||
char used_memory_rss_hmem[64];
|
char used_memory_rss_hmem[64];
|
||||||
char maxmemory_hmem[64];
|
char maxmemory_hmem[64];
|
||||||
size_t zmalloc_used = zmalloc_used_memory();
|
size_t zmalloc_used = zmalloc_used_memory();
|
||||||
@ -3013,6 +3014,7 @@ sds genRedisInfoString(char *section) {
|
|||||||
bytesToHuman(peak_hmem,server.stat_peak_memory);
|
bytesToHuman(peak_hmem,server.stat_peak_memory);
|
||||||
bytesToHuman(total_system_hmem,total_system_mem);
|
bytesToHuman(total_system_hmem,total_system_mem);
|
||||||
bytesToHuman(used_memory_lua_hmem,memory_lua);
|
bytesToHuman(used_memory_lua_hmem,memory_lua);
|
||||||
|
bytesToHuman(used_memory_scripts_hmem,server.lua_scripts_mem);
|
||||||
bytesToHuman(used_memory_rss_hmem,server.cron_malloc_stats.process_rss);
|
bytesToHuman(used_memory_rss_hmem,server.cron_malloc_stats.process_rss);
|
||||||
bytesToHuman(maxmemory_hmem,server.maxmemory);
|
bytesToHuman(maxmemory_hmem,server.maxmemory);
|
||||||
|
|
||||||
@ -3037,6 +3039,9 @@ sds genRedisInfoString(char *section) {
|
|||||||
"total_system_memory_human:%s\r\n"
|
"total_system_memory_human:%s\r\n"
|
||||||
"used_memory_lua:%lld\r\n"
|
"used_memory_lua:%lld\r\n"
|
||||||
"used_memory_lua_human:%s\r\n"
|
"used_memory_lua_human:%s\r\n"
|
||||||
|
"used_memory_scripts:%lld\r\n"
|
||||||
|
"used_memory_scripts_human:%s\r\n"
|
||||||
|
"number_of_cached_scripts:%lu\r\n"
|
||||||
"maxmemory:%lld\r\n"
|
"maxmemory:%lld\r\n"
|
||||||
"maxmemory_human:%s\r\n"
|
"maxmemory_human:%s\r\n"
|
||||||
"maxmemory_policy:%s\r\n"
|
"maxmemory_policy:%s\r\n"
|
||||||
@ -3069,6 +3074,9 @@ sds genRedisInfoString(char *section) {
|
|||||||
total_system_hmem,
|
total_system_hmem,
|
||||||
memory_lua,
|
memory_lua,
|
||||||
used_memory_lua_hmem,
|
used_memory_lua_hmem,
|
||||||
|
server.lua_scripts_mem,
|
||||||
|
used_memory_scripts_hmem,
|
||||||
|
dictSize(server.lua_scripts),
|
||||||
server.maxmemory,
|
server.maxmemory,
|
||||||
maxmemory_hmem,
|
maxmemory_hmem,
|
||||||
evict_policy,
|
evict_policy,
|
||||||
|
@ -1203,6 +1203,7 @@ struct redisServer {
|
|||||||
client *lua_client; /* The "fake client" to query Redis from Lua */
|
client *lua_client; /* The "fake client" to query Redis from Lua */
|
||||||
client *lua_caller; /* The client running EVAL right now, or NULL */
|
client *lua_caller; /* The client running EVAL right now, or NULL */
|
||||||
dict *lua_scripts; /* A dictionary of SHA1 -> Lua scripts */
|
dict *lua_scripts; /* A dictionary of SHA1 -> Lua scripts */
|
||||||
|
unsigned long long lua_scripts_mem; /* Cached scripts' memory + oh */
|
||||||
mstime_t lua_time_limit; /* Script timeout in milliseconds */
|
mstime_t lua_time_limit; /* Script timeout in milliseconds */
|
||||||
mstime_t lua_time_start; /* Start time of script, milliseconds time */
|
mstime_t lua_time_start; /* Start time of script, milliseconds time */
|
||||||
int lua_write_dirty; /* True if a write command was called during the
|
int lua_write_dirty; /* True if a write command was called during the
|
||||||
|
Loading…
Reference in New Issue
Block a user