服务器CPU长期高负载排查思路详解
概述
服务器CPU长期居高不下会直接影响业务响应速度与稳定性。本文将系统梳理从现象到根因的排查流程,帮助运维人员快速定位问题。
初步诊断:获取CPU状态
使用top/htop命令
通过top或htop查看CPU整体占用率及进程占用排行,重点关注%CPU列。记录占用最高的进程PID。
检查CPU负载均衡
使用mpstat -P ALL查看各核心负载是否均匀,若某核心满载则可能存在中断或线程绑定问题。
定位高消耗进程
进程级分析
- ps -eo pid,user,%cpu,comm --sort=-%cpu | head -20 列出前20个高CPU进程。
- 使用pidstat -p [PID] 1持续观察目标进程CPU变化。
线程级分析
使用top -H -p [PID]查看进程内各线程的CPU占用,定位具体线程ID。
深入排查:根据进程类型选择工具
Java应用
- 使用jstack [PID] > stack.log获取线程栈。
- 将高CPU线程ID转为十六进制(printf '%x\n' [TID]),在栈日志中搜索对应nid,定位代码位置。
数据库服务(MySQL/PostgreSQL)
使用SHOW PROCESSLIST;或pg_stat_activity查找长时间运行的查询,结合EXPLAIN分析慢SQL。
Web服务器(Nginx/Apache)
检查access日志,使用ab或wrk进行压力测试,观察是否因并发过高导致CPU耗尽。
系统级排查
中断与上下文切换
使用vmstat 1观察in(中断)和cs(上下文切换)列,若数值持续偏高,可能是硬件中断或锁竞争导致。
IO等待影响
使用iostat -x 1检查%iowait,高I/O等待可能使CPU利用率虚高(实际上CPU在等待I/O)。
内存或SWAP异常
使用free -h和vmstat查看内存使用率,SWAP频繁换入换出会导致CPU繁忙。
其他常见原因及对策
- 死循环或无限递归:检查代码逻辑,尤其是在更新或定时任务模块。
- 日志过度输出:控制日志级别,避免在生产环境打印DEBUG日志。
- 资源竞争(锁):使用strace或perf分析系统调用,定位锁等待热点。
总结
CPU长期居高不下的排查应遵循“整体→进程→线程→代码”的递进路径,结合top、pidstat、jstack、strace等工具。定期监控核心指标并建立基线,有助于快速识别异常波动。若排查后仍无法定位,可考虑升级硬件或优化架构。