[转帖]Redis集群实例内存使用率飙升排查

redis,集群,实例,内存,使用率,飙升,排查 · 浏览次数 : 0

小编点评

**问题:** 缓存实例内存使用率超过了90%,其中从节点内存使用率却很低。 **分析:** * 问题首先想到是大key导致集群倾斜,但分析发现该分片的高内存使用率与其他分片低内存使用率无关。 * 另外,使用bgsave工具分析dump文件,发现一个拥有360多万个元素的List,但分析结果只显示130多M,远少于实际内存占用量。 * 进一步测试发现,使用info命令查看实例信息,也看不出问题。 **结论:** 该问题可能与缓存实例中List类型的key导致的内存泄漏有关,但分析结果相对有限,缺乏进一步确认。

正文

在一个阳光明媚的下午,突然生产环境有一个缓存实例发出内存使用率超过90%的告警,然后立刻和小伙伴们一起看是什么情况。

现象是这样的,集群里的一个实例的内存使用率超过了90%,而这个实例的从节点,内存使用率却很低。而且其他分片的内存使用率都很低,只有这个分片高。见下图cachecloud实例状态图。

首先想到的肯定是大key导致的集群倾斜了,于是就先把这个分片的数据dump出来,然后使用rdbtools工具分析下dump文件,把大key找出来,再联系业务人员。

在做rdb分析的同时,也考虑到,会不会是有人偷偷连接了实例,然后使用了monitor忘记关掉,于是另外登录到该实例所在的服务器并连接实例后使用client list命令查看客户端的连接,看是否有带monitor相关命令的。发现并没有。

~]$ redis-cli -p 9999 client list | grep monitor
~]$ 
  • 1
  • 2

另一方面使用连接实例使用bgsave命令生成dump数据文件的同事也发现,生成的数据文件的大小只有130多M,分析虽然也分析出来了一个大key,但是大小也只有130多M,是一个拥有360多万个元素的List

但是这应该完全不足以造成9个G的内存使用量。我还以为是bgsave命令没正常执行?我又重新执行了一次bgsave命令,查看执行时间和dump数据确认确实是130多M。使用info命令查看实例的信息,也看不出问题。

一筹莫展之际,同事亮哥从实例的client list命令的结果看出了所以然。

]$ redis-cli -p 9012 client list | grep -v "omem=0" 
id=11164727 addr=10.4.7.48:50478 fd=458 name= age=4230 idle=303 flags=c db=0 sub=0 psub=0 multi=-1 qbuf=163072064 qbuf-free=0 obl=0 oll=659943 omem=8546641352 events=rw cmd=lrange
  • 1
  • 2

这个被筛选出来的客户端链接,omem怎么有8个G。omem是什么值。它是redis服务对客户端连接输出缓存的内存占用量。

查看redis实例的慢日志,可以看到如下的结果,相同List key的lrange查询,参数是0 -1。

经过思考,大概可以这样理解,使用这个缓存的实例有一个List类型的大key,有360多万个元素,大概是130多M,然后客户端频繁的通过 lrange keyname 0 -1 的方式全量获取所有元素。缓存服务端接收到指令,耗时700000多微秒(700多毫秒)把对应的数据给扔到输出缓冲区中,然后接着处理别的指令去了,然后因为这个指令调用的很频繁,输出缓冲区的数据就越积越多,但客户端接收数据的速度有限。形象点可以理解为一个池子一边接水一边放水,放水速度小于接水速度,接水的就是Redis服务处理指令获取到的结果,放水的就是客户端接收返回结果,这个池子就是输出缓存区,也是要占用Redis实例的内存的,时间足够,池子迟早会满。这也就是Redis实例内存不断增长的原因。

因为Redis实例内的数据的数量并没有改变,所以该实例的Slave实例的内存并没有变化。

回过头来看,如果master实例的内存暴涨,但是slave实例的内存与master实例的内存差距很大的情况下,就很可能是monitor命令未关或者输出缓冲区积压导致的。

最终我们手动将对应的客户端连接kill掉,然后内存唰的一下就降下来了。

~]$ redis-cli -p 9012 client list | grep -v "omem=0"
id=2253936 addr=10.4.7.48:52303 fd=276 name= age=7580 idle=36 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=1581 omem=20931976 events=rw cmd=lrange
id=2252693 addr=10.4.7.48:51712 fd=252 name= age=9268 idle=230 flags=c db=0 sub=0 psub=0 multi=-1 qbuf=79914221 qbuf-free=0 obl=0 oll=504978 omem=6682230512 events=rw cmd=lrange
id=2258097 addr=10.4.7.48:54497 fd=345 name= age=1172 idle=194 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=254068 omem=3361306536 events=rw cmd=lrange
id=2257345 addr=10.4.7.48:54063 fd=401 name= age=2438 idle=167 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=1642 omem=21713784 events=rw cmd=lrange
~]$ redis-cli -p 9012 client kill 10.4.7.48:51712
OK
~]$ redis-cli -p 9012 client kill 10.4.7.48:54497
OK
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树数据库组成30077 人正在系统学习中

与[转帖]Redis集群实例内存使用率飙升排查相似的内容:

[转帖]Redis集群实例内存使用率飙升排查

在一个阳光明媚的下午,突然生产环境有一个缓存实例发出内存使用率超过90%的告警,然后立刻和小伙伴们一起看是什么情况。 现象是这样的,集群里的一个实例的内存使用率超过了90%,而这个实例的从节点,内存使用率却很低。而且其他分片的内存使用率都很低,只有这个分片高。见下图cachecloud实例状态图。

[转帖]优雅的分析redis中的内存数据之RCT

https://www.zhihu.com/column/c_1087047428959608832?utm_id=0 目前我们EC Bigdata team 运维公司 4个 Redis 集群,300+ Redis 实例,500G+ 的内存数据,我们想要分析业务是否有误用,以提高资源利用率。伴随着业

[转帖]Redis性能之内部阻塞式操作及应对方法

文章目录 Redis实例都有哪些阻塞点和客户端交互的阻塞点集合的全量查询和聚合操作bigkey删除操作清空数据库 磁盘交互的阻塞点主从节点交互时的阻塞点切片集群实例交互时的阻塞点可以异步执行的阻塞点异步的子线程总结 Redis的网络IO和键值对读写都是由主线程完成的。 Redis实例都有哪些阻塞点

[转帖]Redis 运维实战 第02期:Redis Cluster

https://cloud.tencent.com/developer/article/1986819 Redis 最为突出的特性就是:执行命令的速度非常快(原因是所有数据都存放在内存中)。但是单机 Redis 总会遇到瓶颈的,比如:并发、流量、内存等。在 Redis 3.0 之前,官方并没有提供集

[转帖]Redis进阶实践之十 Redis主从复制的集群模式

https://www.cnblogs.com/PatrickLiu/p/8426610.html 一、引言 Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习。从今天开始来讲一下有关Redis的集群模

[转帖]Redis进阶实践之十 Redis哨兵集群模式

Redis进阶实践之十 Redis哨兵集群模式 一、引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一点,Master和Slave两个节点的持久化配置尽量保持一致,否则会有奇怪的

[转帖]Redis大集群扩容性能优化实践

https://www.jianshu.com/p/1f5d2abbee7f 一、背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作。 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在访问时延增长明显。 某

[转帖]Redis进阶实践之十二 Redis的Cluster集群动态扩容

https://www.cnblogs.com/PatrickLiu/p/8473135.html 一、引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境。当然,大家可以使用 Cluster info 命令查看Cluste

[转帖]一文搞懂不同方式Redis集群搭建

https://bbs.huaweicloud.com/blogs/380521 【摘要】 1 实验环境准备 1.1 构建Redis的Docker镜像[root@iZ2ze4m2ri7irkf6h6n8zoZ redis]# docker pull redis[root@iZ2ze4m2ri7irk

[转帖]docker 搭建 redis 伪分布式集群

https://www.jianshu.com/p/453a2d70a5de 建议阅读方式 可前往语雀阅读,体验更好:docker 搭建 redis 伪分布式集群 背景介绍 该实验主要来源于《Docker 容器与容器云 第2版》一书的 2.3 节:“搭建你的第一个 Docker 应用栈”中的一小步,