一次redis诡异的连接超时问题排查与解决

1 问题分析

CleverCode公司部署的redis是集群模式,使用的是3主3从,部分redis集群直接部署在物理机上面。为了充分利用物理机资源。物理机上面还跑着fastdfs进程。这样redis使用物理机的内存。fastdfs使用物理机的磁盘。
但是跑了一段时间后发现redis经常会有连接超时情况。如下出现Connection timed out [tcp://10.x.x.74:6416],
Error while reading line from the server. [tcp://10.x.x.74:6392]

某一天的报错情况:
在这里插入图片描述
很多天的报错情况:
在这里插入图片描述
从zabbix里面查找内存的使用监控:发现11月17号redis开始使用后,Mem_used会周期性的接近94.37G(物理内存最大值)。每次Mem_use接近到达94.37G后,发现会有一次内存回收释放操作,Mem_cached减少,Mem_free开始增加。
在这里插入图片描述

2 难道是zone_reclaim_mode?

2.1 NUMA是什么?

经过一顿排查,发现我们系统内核参数里面 /etc/sysctl.conf 配置的vm.zone_reclaim_mode=1
在这里插入图片描述
vm.zone_reclaim_mode=1是什么东西?这个参数是控制NUMA开关的。NUMA又是什么?

NUMA(Non-Uniform Memory Access)是相对UMA来说的,两者都是CPU的设计架构,早期CPU设计为UMA结构,如下图(图片来自网络)所示:
在这里插入图片描述
为了缓解多核CPU读取同一块内存所遇到的通道瓶颈问题,芯片工程师又设计了NUMA结构,如下图(图片来自网络)所示:
在这里插入图片描述
这种架构可以很好解决UMA的问题,即不同CPU有专属内存区,为了实现CPU之间的”内存隔离”,还需要软件层面两点支持:

内存分配需要在请求线程当前所处CPU的专属内存区域进行分配。如果分配到其他CPU专属内存区,势必隔离性会受到一定影响,并且跨越总线的内存访问性能必然会有一定程度降低。

另外,一旦local内存(专属内存)不够用,优先淘汰local内存中的内存页,而不是去查看远程内存区是否会有空闲内存借用。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值