一、背景引入
生产环境中,服务器CPU飙升是运维人员最常遇到的故障之一。可能突然某个服务响应变慢,监控报警CPU使用率超过80%,甚至达到100%。这时候需要快速定位原因并采取优化措施。
本文将从实战角度出发,结合原理讲解,研究了一下完整的CPU性能排查方法。
二、问题分析
CPU飙升的常见原因
- 1. 进程异常:死循环、逻辑错误导致CPU占用过高
排查思路
排查CPU问题需要遵循由外到内、由宏观到微观的原则:
监控报警 → 确认影响范围 → 定位高CPU进程 → 分析进程行为 → 找到根因 → 制定优化方案
三、实战操作:CPU性能排查五步法
步骤一:确认当前CPU状态
使用top命令查看系统整体CPU使用情况:
top
关键字段解读:
- • %ni:用户空间内改变过优先级的进程占用CPU百分比
- • %st:被虚拟机占用的CPU百分比(虚拟化环境)
实战技巧:按P键按CPU使用率排序,按Shift+P反向排序。
步骤二:定位高CPU进程
如果top显示某个进程CPU占用高,记录其PID:
# 方法1:top命令中查看top# 方法2:使用pidstat实时监控,每隔1s输出一次,一共输出5次pidstat -u 1 5
步骤三:深入分析进程
使用ps命令查看进程详细信息:
# 查看特定进程的CPU和内存使用情况ps aux | grep <PID># 查看进程树,找出父进程pstree -p <PID>
步骤四:分析进程行为
方法1:strace追踪系统调用
# 追踪进程的系统调用(谨慎使用,可能影响性能)strace -p <PID> -c
方法2:perf分析CPU热点
# 分析进程的CPU性能事件perf top -p <PID>
方法3:查看进程线程
# Linux中线程即轻量级进程ps -eLf | grep <PID># 查看线程CPU使用情况pidstat -t -p <PID> 1 5
步骤五:查看系统日志
# 查看系统日志dmesg | tail -50# 查看内核日志grep -i "error\|warning" /var/log/messages | tail -20
四、常见场景与解决方案
场景一:Java进程CPU占用高
现象:Java应用CPU突然飙升到100%
排查:
# 1. 找到Java进程PIDjps -l# 2. 查看Java线程CPU占用top -H -p <PID># 3. 将线程ID转换为16进制printf "%x\n" <THREAD_ID> //ps -T -p pid 查看的SPID就是THREAD_ID# 4. 查看线程堆栈jstack <PID> | grep <16进制THREAD_ID> -A 20
常见原因:
解决方案:
场景二:Nginx worker进程CPU高
现象:Nginx多个worker进程CPU占用高
排查:
# 查看Nginx连接数ss -ant | grep :80 | wc -l# 查看Nginx状态curl http://localhost/nginx_status
常见原因:
解决方案:
# 调整worker进程数(一般设为CPU核心数)worker_processes auto;# 关闭日志或异步写入access_log off;
场景三:挖矿病毒导致CPU高
现象:CPU占用高,但找不到明显进程
排查:
# 查看隐藏进程ps auxf | head -30# 查看网络连接netstat -antp# 查看定时任务crontab -l
解决方案:
# 1. 查找并终止挖矿进程ps aux | grep -E 'xmrig|minerd|kdevtmpfsi' | grep -v grep# 2. 清理挖矿程序rm -f /tmp/xmrig /tmp/minerd# 3. 清理定时任务crontab -r
五、原理讲解:CPU使用率计算
用户态 vs 内核态
用户态(%us):应用程序代码执行内核态(%sy):系统调用、内核线程执行空闲(%id):CPU无事可做等待IO(%wa):CPU等待I/O完成
上下文切换
进程切换需要保存当前进程状态、加载新进程状态,这个过程中CPU不执行用户代码,但会消耗资源。
# 查看上下文切换次数vmstat 1 5
当cs(context switches)数值很高时,说明进程切换频繁,可能是线程数过多或锁竞争严重。
负载与CPU的关系
# 查看系统负载uptime
负载(load average)表示平均活跃进程数,包括:
经验法则:负载 > CPU核心数 × 0.7 时,需要关注性能。
六、注意事项
1. 排查时的注意事项
2. 安全建议
3. 性能调优建议
七、总结
CPU性能排查是运维必备技能,掌握这套五步法可以快速定位问题: