【记一次CPU 使用率低、LOAD持续高的问题排查】
1.问题背景
最近有RD反馈自己的业务有一台高配服务器用户反馈非常卡顿,看看是不是需要扩容,但是说CPU使用率其实不算很高,不知道为啥总是卡顿。经过核实资源,发现机器配置非常高,64C256G内存的服务器,使用率在30~40%左右,通过经验判断应该不是服务器CPU不够导致的卡顿,单纯的扩容应该也解决不了,决定综合分析,看看问题根源并解决。
2.分析问题
通常这类性能问题,我们就要去看性能的监控,首先我们查看了最近1个月的情况
指标 | 使用情况 | 分析 |
CPU USAGE | 30%~40% | 从监控看一直很均衡,而且是64C,基本可以排除CPU性能不够问题 |
MEM USE | 100% | 均衡在100%状态,从这看内存使用率异常,可能是内存分配不合理,也有可能是内存使用不合理(外部代码基本不可能修改) |
NET IO IN | 50Mbps | 入带宽基本可以忽略不记,服务器网卡为千兆网卡 |
NET IO OUT | 250Mbps | 出带宽虽然量不小,但是还没到导致阻塞的状态 |
CPU LOAD | 12~14 | 持续12~14,非常异常,由于CPU配置高,这块很容易忽略,需要重点关注 |
DISK.IO | 100% | 大量的100%状态,结合LOAD和IO使用率,可以定位问题出在磁盘性能 |
总结分析:
从目前的分析结果看,异常数据主要体现在3个方面:
- 1.CPU LOAD 持续飙高,说明服务器的负载高(等待运行和正在运行的进程过多)但CPU 使用率不高,说明服务器运算能力没有问题(64C)。
- 2.内存使用率持续100%,表示内存大量数据不能正常释放,或者启动分配了异常内存。
- 3.磁盘IO使用率持续100%,说明大量数据写入磁盘,导致磁盘性能不足,另外结合监控图发现,IO阻塞和CPU LOAD高正相关。
从以上分析结果,我们可以考虑优化下面方向:
- 1.分析内存大量数据来源和服务器分配内存的策略(内存虽然使用率越高越好,但过高溢出会导致OOM,理想状态是在80%左右稳定运行)
- 2.提高磁盘的写入能力,减少IO等待(分析看,这个最有效)
- 3.减少磁盘写入数据,减少IO等待(看起来可行,但实施成本最高)
3.优化方案
经过和RD一起排查和综合当前的系统情况,最终确定了短期和长期方案,短期方案是从系统层解决IO阻塞问题,长期从代码层优化内存使用、IO写入问题,这里我就说一下系统层优化方案,主要考虑2个点:
- 1.服务器使用率(目前的服务器CPU浪费严重、磁盘使用率低)
- 2.提高系统的IO能力(从目前看主要是磁盘写入能力不够)
最终的优化方案:
- 1.把服务器从高计算型服务器改成内存型服务器(从64C156G变成16C256G)
- 2.减少磁盘大小并更换为SSD磁盘(从高效云盘变更为SSD磁盘)
- 3.平滑迁移(保持旧服务器不变的情况下,新增服务器做对比)
4.最终效果
- 1.CPU 使用率从之前的30%~40% 提升到70%~80%
- 2.磁盘IO 100%使用率减少50%左右
- 3.CPU LOAD 减少50%左右
- 4.费用减少2234元/月
- 5.系统卡顿有明显提升
附图,蓝色为优化前的服务器运行情况,黄色为优化后的服务器运行情况