diff options
author | Matt Stancliff <matt@genges.com> | 2014-12-19 10:41:52 -0500 |
---|---|---|
committer | Matt Stancliff <matt@genges.com> | 2014-12-23 09:31:13 -0500 |
commit | 32266be29033ba5866bd8d83ffeb63402e45145f (patch) | |
tree | 9f4e8fb38919a89900b4a4a4903357c6b416279a | |
parent | 919e8c3021259a75161d20d68b695e153766e693 (diff) | |
download | redis-32266be29033ba5866bd8d83ffeb63402e45145f.tar.gz |
Add more quicklist info to DEBUG OBJECT
Adds: ql_compressed (boolean, 1 if compression enabled for list, 0
otherwise)
Adds: ql_uncompressed_size (actual uncompressed size of all quicklistNodes)
Adds: ql_ziplist_max (quicklist max ziplist fill factor)
Compression ratio of the list is then ql_uncompressed_size / serializedlength
We report ql_uncompressed_size for all quicklists because serializedlength
is a _compressed_ representation anyway.
Sample output from a large list:
127.0.0.1:6379> llen abc
(integer) 38370061
127.0.0.1:6379> debug object abc
Value at:0x7ff97b51d140 refcount:1 encoding:quicklist serializedlength:19878335 lru:9718164 lru_seconds_idle:5 ql_nodes:21945 ql_avg_node:1748.46 ql_ziplist_max:-2 ql_compressed:0 ql_uncompressed_size:1643187761
(1.36s)
The 1.36s result time is because rdbSavedObjectLen() is serializing the
object, not because of any new stats reporting.
If we run DEBUG OBJECT on a compressed list, DEBUG OBJECT takes almost *zero*
time because rdbSavedObjectLen() reuses already-compressed ziplists:
127.0.0.1:6379> debug object abc
Value at:0x7fe5c5800040 refcount:1 encoding:quicklist serializedlength:19878335 lru:9718109 lru_seconds_idle:5 ql_nodes:21945 ql_avg_node:1748.46 ql_ziplist_max:-2 ql_compressed:1 ql_uncompressed_size:1643187761
-rw-r--r-- | src/debug.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/debug.c b/src/debug.c index d11e3f037..7783196a0 100644 --- a/src/debug.c +++ b/src/debug.c @@ -306,11 +306,32 @@ void debugCommand(redisClient *c) { char *nextra = extra; int remaining = sizeof(extra); quicklist *ql = val->ptr; - double avg = (double)ql->count/ql->len; + /* Add number of quicklist nodes */ int used = snprintf(nextra, remaining, " ql_nodes:%u", ql->len); nextra += used; remaining -= used; - snprintf(nextra, remaining, " ql_avg_node:%.2f", avg); + /* Add average quicklist fill factor */ + double avg = (double)ql->count/ql->len; + used = snprintf(nextra, remaining, " ql_avg_node:%.2f", avg); + nextra += used; + remaining -= used; + /* Add quicklist fill level / max ziplist size */ + used = snprintf(nextra, remaining, " ql_ziplist_max:%d", ql->fill); + nextra += used; + remaining -= used; + /* Add isCompressed? */ + int compressed = ql->compress != 0; + used = snprintf(nextra, remaining, " ql_compressed:%d", compressed); + nextra += used; + remaining -= used; + /* Add total uncompressed size */ + unsigned long sz = 0; + for (quicklistNode *node = ql->head; node; node = node->next) { + sz += node->sz; + } + used = snprintf(nextra, remaining, " ql_uncompressed_size:%lu", sz); + nextra += used; + remaining -= used; } addReplyStatusFormat(c, |