在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量。
稍加思索,应该是某些Key的Value数据体量过大,占用了过多的内存空间,我们在使用Redis的过程中,单个Value或者单个集合中的元素应该保证不超过10KB,已获取最佳的实践体验。
网上搜索了一番,关于分析大Key的工具还挺多,分为Redis官网工具和第三方工具。
经过一番比对,不同的工具都体验了一下,这里跳过工具之间的对比过程,直接给结论:redis data reveal。
大家可以在releases中下载打包成的应用程序,这里也给个国内加速下载地址:蓝奏云。
因为线上已经开启了Redis的RDB和AOF持久化策略,直接把RDB文件拉到本地。
如果没有开启RDB可以使用
bgsave
命令导出
执行RDB文件分析命令:
chmod +x rdr-linux
./rdr-linux show -p 8099 dump.rdb
分析完成后会在设置的端口打开web服务,我们的RDB文件有4GB,分析耗时大概5分钟,分析过程日志如下:
start parsing...
parse dump.rdb done
parsing finished, please access http://{$IP}:8099
打开分析报告页面,查看到的queue:sdk:audit:log
占用了17GB内存,经分析后发现是由于下游消费服务未部署导致队列数据积压所致:
通过Redis集群的Slave节点,再次查看对应的key大小(字节数):
127.0.0.1:9532> memory usage queue:sdk:audit:log
(integer) 18124761989