今天发现测试环境Redis进程被OOM killer了,所以,直觉就是优先找出消耗内存的罪魁祸首key。
redis-rdb-tools 是专门用来干这活的,我们先来了解下:
一、rdbtools工具介绍
源码地址:https://github.com/sripathikrishnan/redis-rdb-tools/
redis-rdb-tools 是一个 用python开发的用于解析 rdb 文件的工具,在解析的时候,它会生成类似于xml sax解析器的事件,在内存检测方面非常有效
它主要有以下三个功能:
- 生成内存快照
- 转储成 json 格式
- 使用标准的 diff 工具比较两个 dump 文件
市面上有用其他语言开发的类似的工具,Rdbtools用Python开发,安装时最好用3以上版本,我这边用的是3.6+,你可以从https://rdbtools.com 中了解到更多的关于管理redis的界面RedisInsight,商业支持,和其他企业级特性
如何安装:
1.python-lzf 是可选安装,但强烈建议你安装,因为它可以加速解析的过程
2.redis-py 是可选的,只是在跑测试的时候有用
建议用pip3安装
pip3 install rdbtools python-lzf
生成内存报告,列出大小大于128字节的,内存占用最大的前10的key的详情,可惜未有经过排序,并生成redis.csv文件
注意:内存使用量是近似的。在一般情况下,略低于实际值。可以根据key或数据库ID或数据类型对报告的内容进行过滤。
内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。
./rdb -c memory -l 10 /data/redis/6386/dump.rdb --bytes 128 >/tmp/redis.csv
结果为:
database | type | key | size_in_bytes | encoding | num_elements | len_largest_element | expiry |
0 | hash | user_record:251932 | 26940 | hashtable | 604 | 13 | |
0 | string | record:277 | 6232 | string | 5529 | 5529 | 2037-06-26T13:43:49.117000 |
0 | string | record:278 | 6232 | string | 5544 | 5544 | 2037-06-26T13:59:38.661000 |
0 | string | record:420 | 6232 | string | 5522 | 5522 | 2037-03-19T13:33:49.059000 |
0 | string | record:526 | 6232 | string | 5687 | 5687 | 2037-03-26T14:30:06.601000 |
0 | string | record:244 | 7256 | string | 6276 | 6276 | 2037-06-23T15:02:49.080000 |
0 | string | record:3151 | 8280 | string | 7872 | 7872 | 2039-09-01T13:21:30.615000 |
0 | string | record:445 | 10328 | string | 8374 | 8374 | 2037-08-18T08:06:48.196000 |
0 | string | record:447 | 10328 | string | 8375 | 8375 | 2037-08-18T08:16:48.038000 |
0 | hash | user_record:126661 | 25476 | hashtable | 543 | 13 |
输出字段说明:
database :key在redis的db type :key类型 key :key值 size_in_bytes :key的内存大小(byte) encoding :value的存储编码形式 num_elements :key中的value的个数 len_largest_element :key中的value的最大长度 expiry :key过期时间
按键值大小排序(TODO...)
awk -F',' '{print $4,$2,$3,$1}' /tmp/redis.csv | sort > /tmp/redis_sort.csv
如何输出某个key的占用大小?
./redis-memory-for-key -p 6386 -a ooxx user_record:251932
输出:
Key user_record:251932 Bytes 26940.0 Type hash Encoding hashtable Number of Elements 604 Length of Largest Element 13
RedisTimeSeries是一个Redis模块,向Redis添加了时间序列数据结构。
他有如下的功能:
在此处 阅读有关v1.0 GA功能的更多信息 。
- 高容量插入,低延迟读取
- 按开始时间和结束时间查询
- 任何时间段的汇总查询(最小,最大,平均,总和,范围,计数,第一,最后,STD.P,STD.S,Var.P,Var.S)
- 可配置的最大保留期限
- 下采样/压缩-自动更新汇总的时间序列
- 次要索引-每个时间序列都有标签(字段值对),可以按标签查询
下载:https://redislabs.com/download-center/modules/
启动:
redis-server /data/redis/6385/6385.conf --loadmodule /usr/local/redis-5.0.9/redistimeseries.so
这样