背景:
1.redis集群从IDC机房迁移至公有云;
2.该集群业务访问量大,峰值超过200万TPS,节点CPU使用率偏大;
问题:
凌晨变更对接公有云集群之后,次日白天监控发现redis节点平均CPU使用率(avgcpu)从30%增长到40%,节点最大CPU使用率(maxcpu)峰值能达到98%,与IDC相比差异较大,IDC为(avgcpu:30%,maxcpu:50-60%,由于业务特性决定也存在一定差异)
定位思路:
1.考虑到单节点CPU使用率接近100%,首先怀疑业务存在热点数据,对单个节点的TPS异常高,但和业务侧确认,业务侧并无任何变更,正常来讲不会突然出现过热数据;又希望找到CPU使用率最高的节点,发现并非固定的,与热点数据的现象不吻合,热点数据正常只会存在某单一节点上;
2.怀疑物理机到虚拟机的主机差异,内核参数物理机历史上调优过,主要包括以下几项:
关闭大页:echo never > /sys/kernel/mm/transparent_hugepage/enable
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn=10000" >> /etc/sysctl.conf
修改端口区间:echo "net.ipv4_local_port_range = 20000 65535" >> /etc/sysctl.conf
对虚拟机也进行修改,观察平均CPU使用率有一定下降,但是效果并不明显;
3.考虑到业务TPS高,怀疑软中断分布不均导致使用到虚拟机上软中断集中的CPU的redis节点的异常,查看top,发现CPU0的软中断高达25%,其他CPU都是0,虚拟机都为16C,因为这部分虚拟机比较老,没有默认打开软中断均衡,使用以下方式打开:
安装:sudo yum -y install irqbalance.x86_64
启动:sudo systemctl start irqbalance.service
检查systemctl list-unit-files|grep irqbalance.service 或者 ps -ef|grep irqbalance
观察一段时间,发现avgcpu和maxcpu都有下降,已恢复至和IDC机房相当。