当前位置:网站首页>一次生产环境redis内存占用居高不下问题排查
一次生产环境redis内存占用居高不下问题排查
2022-07-05 11:31:00 【我们一直在路上】
服务器在一次常规发布上线后,发现缓存过期速度远远小于配置的10min过期。
现象:刚刚登录进系统后台,过了1分钟就发现缓存过期,登录不上后台,进到阿里云的redis服务器,发现登录的key没有了,期间还遇到各种诡异的问题,莫名其妙登录进系统但过一会儿掉线,后来进入阿里云后台发现redis内存占用高达100%。我就猜到可能是有线程在大量的写缓存,然后把redis空间给吃满了,由于redis服务器配置的是volatile-lru策略:当内存要满的时候,又有大量缓存写入的时候,就删除设置了过期时间的key中的最近最久没有用的key。

然后我就跑到redis服务器把当前的rdb(内存快照) 下载一份到本地来分析到底是那个key 在疯狂写数据,找到了这个key,我就可以去程序中查找到使用这个key的代码,然后进行相应的处理。
登录进阿里云,下到到一个最新的备份

1、下载到一份全量key的rdb文件

然后执行以下命令需要安装python2.7并且加载rdb插件,生成csv文档。
2、将此rdb文件使用rdbTools转化成csv文档。
-
pip install rdb
# 安装rdb
-
rdb -c memory hins8714399_data_20191015223705.rdb > memory.csv
# 将redis内存快照文件,存储到csv文档中

3、将改csv文档直接可以导入到mysql数据库中,然后使用mysql的查询,可以查询出内存占用最大的key

注意一点的是 通过csv导入mysql默认生成字段类型都是varchar,我们这里需要把类型改为int类型,用于排序查询。

4、mysql中生成了一个memory库,然后执行
SELECT * from memory ORDER BY size_in_bytes desc LIMIT 0, 10
按照使用内存从大到小,查询到占用内存前10的key

找到了这些过期时间为null的key,发现 代码中没有针对这些key设置过期时间,是永久key,还有一些redis设置的队列进行消费的队列,写了大量的数据到永不过期的队列中,然后消费线程只有2个,倒是往队列加的快,队列消费的慢,后台我把消费redis队列的线程调成20、10、5找到一个最佳的线程数,CPU占用不太高,队列也没有堆积、充分利用了机器的性能,解决了实际需求。
总结:通过一番折腾,学会了如果解析redis的rdb快照文件,分析redis内存分布,内存占用,那个key占得多,那个key占得少,还有内存淘汰策略,为什么这个key要先过期,另一个要后过期。
扩展1:有兴趣的同学可以查看更多的redis内存淘汰策略
- volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
- volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
- volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;
- allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;
- allkeys-random:从数据集中任意挑选数据 淘汰;
- no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误);
关于maxmemory设置,通过在redis.conf中maxmemory参数设置,或者通过命令CONFIG SET动态修改
关于数据淘汰策略的设置,通过在redis.conf中的maxmemory-policy参数设置,或者通过命令CONFIG SET动态修改
</article>
边栏推荐
- Unity Xlua MonoProxy Mono代理类
- 技术分享 | 常见接口协议解析
- 13. (map data) conversion between Baidu coordinate (bd09), national survey of China coordinate (Mars coordinate, gcj02), and WGS84 coordinate system
- Question and answer 45: application of performance probe monitoring principle node JS probe
- Spark Tuning (I): from HQL to code
- [there may be no default font]warning: imagettfbbox() [function.imagettfbbox]: invalid font filename
- Cron表达式(七子表达式)
- Shell script file traversal STR to array string splicing
- go语言学习笔记-分析第一个程序
- Implementation of array hash function in PHP
猜你喜欢

XML解析

龙蜥社区第九次运营委员会会议顺利召开

技术管理进阶——什么是管理者之体力、脑力、心力

How did the situation that NFT trading market mainly uses eth standard for trading come into being?

Summary of thread and thread synchronization under window

Harbor image warehouse construction

Evolution of multi-objective sorting model for classified tab commodity flow

11. (map data section) how to download and use OSM data

13.(地图数据篇)百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

In the last process before the use of the risk control model, 80% of children's shoes are trampled here
随机推荐
POJ 3176 cow bowling (DP | memory search)
Install esxi 6.0 interactively
Empêcher le navigateur de reculer
Basics - rest style development
shell脚本文件遍历 str转数组 字符串拼接
AUTOCAD——遮罩命令、如何使用CAD对图纸进行局部放大
12.(地图数据篇)cesium城市建筑物贴图
Lombok makes ⽤ @data and @builder's pit at the same time. Are you hit?
Spark Tuning (I): from HQL to code
iTOP-3568开发板NPU使用安装RKNN Toolkit Lite2
NFT 交易市场主要使用 ETH 本位进行交易的局面是如何形成的?
Advanced technology management - what is the physical, mental and mental strength of managers
COMSOL -- three-dimensional graphics random drawing -- rotation
Characteristics and electrical parameters of DDR4
[office] eight usages of if function in Excel
我用开天平台做了一个城市防疫政策查询系统【开天aPaaS大作战】
idea设置打开文件窗口个数
Solve readobjectstart: expect {or N, but found n, error found in 1 byte of
程序员内卷和保持行业竞争力
Zcmu--1390: queue problem (1)