现象:发现设置了缓存,但是很快就失效了,使用Redis可视化工具(RedisDesktopManager)查看key-value的存储情况,发现还没到过期时间,大批的key-value对被移除掉了。查看内存的使用情况,发现内存占用很高,几乎吃光了所有内存。
分析过程:
内存大量的被占用,需要分析当前情况下有哪些键值对占用了大量的内存, 由于直接一个个看不便于找出每个键值对具体的内存使用情况,于是我采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析。
以下是内存分析的过程:
1. BGSAVE:在后台异步(Asynchronously)保存当前数据库的数据到磁盘。
BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
生成的dump.rdb文件路径:可以连接到redis之后,使用CONFIG GET dir命令找到redis的根目录,一般文件默认存在该路径下。
2. 因为我们的redis是用k8s容器部署的,所以在容器内生成dump.rdb文件后,需要把它从容器内拷出来到指定目录,使用如下命令,(如果直接在服务器上部署可直接跳过该步骤):
kubectl cp -n kube-system redis-release-master-0:/bitnami/redis/data/dump.rdb filepath
3.生成内存快照:redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,主要用它生成内存快照。
redis-rdb-tools 安装:
1)使用 PYPI 安装:
pip install rdbtools
2)使用 源码安装:
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 和其他值。
内存使用量是理论上的近似值,在一般情况下,略低于实际值。
注:若csv文件不大,可直接用相关软件打开,以size_in_bytes列排序,可以看到大致内存使用。
可以看到最大的一条数据占用了将近800M的内存空间,现在我们就可以主要针对占用内存较大的缓存数据做相应的优化了。
网友评论