我在生产中有一个 20GB+ 的 rdb 转储。我怀疑有一组特定的键使其膨胀。我希望有一种方法可以始终从静态转储分析中发现前 100 个最大的对象,或者将其询问给服务器本身,顺便说一下,服务器本身有超过 7M 的对象。
像 rdbtools 这样的转储分析工具在这个(我认为)非常常见的用例中没有帮助!
我正在考虑编写一个脚本并使用“redis-cli 调试对象”迭代整个键集,但我觉得一定有一些我缺少的工具。
我在生产中有一个 20GB+ 的 rdb 转储。我怀疑有一组特定的键使其膨胀。我希望有一种方法可以始终从静态转储分析中发现前 100 个最大的对象,或者将其询问给服务器本身,顺便说一下,服务器本身有超过 7M 的对象。
像 rdbtools 这样的转储分析工具在这个(我认为)非常常见的用例中没有帮助!
我正在考虑编写一个脚本并使用“redis-cli 调试对象”迭代整个键集,但我觉得一定有一些我缺少的工具。
redis-cli 添加了一个选项:redis-cli --bigkeys
基于https://gist.github.com/michael-grunder/9257326的示例输出
$ ./redis-cli --bigkeys
# Press ctrl+c when you have had enough of it... :)
# You can use -i 0.1 to sleep 0.1 sec every 100 sampled keys
# in order to reduce server load (usually not needed).
Biggest string so far: day:uv:483:1201737600, size: 2
Biggest string so far: day:pv:2013:1315267200, size: 3
Biggest string so far: day:pv:3:1290297600, size: 5
Biggest zset so far: day:topref:2734:1289433600, size: 3
Biggest zset so far: day:topkw:2236:1318723200, size: 7
Biggest zset so far: day:topref:651:1320364800, size: 20
Biggest string so far: uid:3467:auth, size: 32
Biggest set so far: uid:3029:allowed, size: 1
Biggest list so far: last:175, size: 51
-------- summary -------
Sampled 329 keys in the keyspace!
Total key length in bytes is 15172 (avg len 46.12)
Biggest list found 'day:uv:483:1201737600' has 5235597 items
Biggest set found 'day:uvx:555:1201737600' has 47 members
Biggest hash found 'day:uvy:131:1201737600' has 2888 fields
Biggest zset found 'day:uvz:777:1201737600' has 1000 members
0 strings with 0 bytes (00.00% of keys, avg size 0.00)
19 lists with 5236744 items (05.78% of keys, avg size 275618.11)
50 sets with 112 members (15.20% of keys, avg size 2.24)
250 hashs with 6915 fields (75.99% of keys, avg size 27.66)
10 zsets with 1294 members (03.04% of keys, avg size 129.40)
redis-rdb-tools确实有一个内存报告,可以完全满足您的需求。它会生成一个 CSV 文件,其中包含每个键使用的内存。然后,您可以对其进行排序并找到前 x 个键。
还有一个实验性的内存分析器可以开始做你需要的事情。它尚未完成,因此没有记录。但是你可以试试 - https://github.com/sripathikrishnan/redis-rdb-tools/tree/master/rdbtools/cli。当然,我也鼓励你做出贡献!
免责声明:我是这个工具的作者。
我对 bash 脚本很陌生。我提出了这个:
for line in $(redis-cli keys '*' | awk '{print $1}'); do echo `redis-cli DEBUG OBJECT $line | awk '{print $5}' | sed 's/serializedlength://g'` $line; done; | sort -h
这个脚本
redis-cli keys "*"
redis-cli DEBUG OBJECT
这可能非常慢,因为 bash 循环遍历每个 redis 键。您有 7m 个密钥,您可能需要将密钥的输出缓存到文件中。
如果您有遵循这种模式“A:B”或“A:B:*”的键,我编写了一个工具来分析现有内容以及诸如命中率、获取/设置数、网络流量等内容的监视器,寿命等。输出类似于下面的输出。
https://github.com/alexdicianu/redis_toolkit
$ ./redis-toolkit report -type memory -name NAME
+----------------------------------------+----------+-----------+----------+
| KEY | NR KEYS | SIZE (MB) | SIZE (%) |
+----------------------------------------+----------+-----------+----------+
| posts:* | 500 | 0.56 | 2.79 |
| post_meta:* | 440 | 18.48 | 92.78 |
| terms:* | 192 | 0.12 | 0.63 |
| options:* | 109 | 0.52 | 2.59 |
试试redis-memory-analyzer - 一个实时扫描 Redis 键空间并按键模式聚合内存使用统计的控制台工具。您可以在生产服务器上使用此工具而无需维护。它向您显示有关 Redis 服务中每个键模式的详细统计信息。
您还可以按所有或选定的 Redis 类型扫描 Redis 数据库,例如“string”、“hash”、“list”、“set”、“zset”。还支持匹配模式。
RMA 还尝试通过模式识别键名,例如,如果您有像“user:100”和“user:101”这样的键,应用程序会在输出中挑选出常见的模式“user:*”,这样您就可以在你的实例。