月度归档:2019年01月

线上Redis 内存分析方法


2019年1月09日 14:31:00   1,592 次浏览

吃过午饭正准备午睡会呢,结果收到了redis内存不足的告警通知,第一时间登录监控平台查看详情,内存使用率居然上升了80%究竟是什么原因导致的呢?接下来便开始分析问题原因。

线上经常遇到用户想知道自己 Redis 实例中数据的内存分布情况。为了不影响线上实例的使用,我们一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析。总的来说,整个分析的过程简单而实用,是每一个使用 Redis 的用户都非常值得掌握的一个方法。

生成内存快照

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。主要有以下三个功能:

  • 生成内存快照
  • 转储成 json 格式
  • 使用标准的 diff 工具比较两个 dump 文件

redis-rdb-tools 安装

redis-rdb-tools 有两种安装方式,任选其一即可。

使用 PYPI 安装

pip install rdbtools

从源码安装

git clone https://github.com/sripathikrishnan/redis-rdb-tools

cd redis-rdb-tools

sudo python setup.py install

使用 redis-rdb-tools 生成内存快照

生成内存快照的命令为:

rdb -c memory dump.rdb > memory.csv

生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值。memory.csv 例子:

$head memory.csv

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,string,"orderAt:377671748",96,string,8,8
0,string,"orderAt:413052773",96,string,8,8
0,sortedset,"Artical:Comments:7386",81740,skiplist,479,41
0,sortedset,"pay:id:18029",2443,ziplist,84,16
0,string,"orderAt:452389458",96,string,8,8

打开生成的memory.csv文件,找出占用内存最大的key,可以发现很多的key都没有设置过期时间,然后找开发确认把相应的key设置过期时间以减少内存使用率。

开发确认后表明有些key并未设置过期时间,需要手动清除缓存。清除之后内存使用率从80%下降到40%, 后续让开发优化业务代码,合理设置过期时间。