首先需明确 “谁在消耗 CPU”,常用工具如下:
top命令(实时监控,最常用)执行
top后,按P键按 CPU 使用率排序,重点关注:PID:进程 ID%CPU:进程占用 CPU 的百分比(超过 100% 可能是多线程进程,如 Java 服务)COMMAND:进程名称(如java、mysql、nginx)示例:若
PID=1234的java进程 % CPU 持续 90% 以上,即为重点分析对象。
ps命令(静态快照,适合脚本批量筛选)ps aux --sort=-%cpu | head -n 10 # 按CPU降序显示前10个进程
分析进程内的高 CPU 线程(top -Hp/pstack)
Java 进程:用
jstack <PID> | grep <十六进制TID> -A 30查看线程堆栈,判断是否有死循环、阻塞、频繁 GC 等(例如:RUNNABLE状态的线程长期占用 CPU,可能是死循环)。C/C++ 进程:用
pstack <PID> | grep <十六进制TID> -A 30查看函数调用栈,定位到具体函数(如频繁调用的计算函数)。
top中%us(用户态 CPU)和%sy(内核态 CPU)的占比可辅助判断原因:
%us高:用户进程消耗 CPU(如应用程序逻辑、计算密集型任务)。%sy高:内核态消耗 CPU(如频繁系统调用、上下文切换、驱动问题)。
常见高 CPU 原因及解决方案
1. 应用程序逻辑问题(最常见,%us高)
典型场景:代码中存在死循环、无限递归、频繁创建销毁对象(如 Java 的频繁 GC)、计算密集型任务未做优化。
解决措施:
结合线程栈分析(如
jstack)定位具体代码块,修复死循环或冗余逻辑。优化计算逻辑:例如用缓存减少重复计算,异步处理非实时任务。
若为 Java 进程,检查 GC 日志(
-XX:+PrintGCDetails),若频繁 Full GC 导致 CPU 高,调整 JVM 参数(如增大堆内存-Xmx,优化垃圾收集器-XX:+UseG1GC)。
2. 数据库 / 中间件异常(%us高)
典型场景:MySQL 慢查询、Redis 大 key 操作、Elasticsearch 聚合查询过多。
解决措施:
MySQL:用
show processlist查看活跃连接,explain分析慢查询,优化 SQL(加索引、拆分大表),限制单表查询行数。Redis:用
redis-cli info stats查看keyspace_hits/misses,检查是否有大 key(redis-cli --bigkeys),拆分大 key 或改用哈希结构。中间件:减少同步调用,增加缓存层,或扩容实例分担压力。
3. 系统进程 / 内核问题(%sy高)
典型场景:
kworker(内核工作线程)占用高(可能是硬件中断、驱动 bug)、kswapd0(内存交换线程)高(内存不足导致频繁 swap)。解决措施:
内存不足:通过
free -h确认,清理缓存(echo 3 > /proc/sys/vm/drop_caches),或扩容内存、关闭 swap(swapoff -a)。硬件 / 驱动问题:查看
dmesg日志是否有硬件错误(如磁盘 IO 错误),更新内核或驱动(yum update kernel),排查是否有故障硬件(如网卡、磁盘)。
4. 恶意进程 / 资源竞争
典型场景:挖矿程序、未授权进程抢占资源。
解决措施:
用
ps -ef查看进程路径,若为陌生路径(如/tmp/下的可疑程序),直接kill -9 <PID>终止,删除文件。检查定时任务(
crontab -l、/etc/cron.d/)和开机启动项(systemctl list-unit-files),清除恶意启动配置,排查入侵原因(如弱密码、漏洞)。