Linux 服务器 CPU 飙高怎么办?5 分钟定位问题

CPU 100% 了,别慌。按这 5 步来,5 分钟内找到元凶。

第一步:看整体情况

top

看看哪个进程的 %CPU 最高。按 P(大写)可以按 CPU 使用率排序。

第二步:确认是不是负载真的高

uptime

看 load average 的三个值,分别对应 1 分钟、5 分钟、15 分钟的平均负载。如果 1 分钟远高于 15 分钟,说明是刚发生的。

第三步:定位具体线程

找到高 CPU 的 PID 后,看它的线程:

top -H -p <PID>

或者用:

ps -Lp <PID> -o pid,tid,%cpu,comm

第四步:看系统调用

如果是 Java 或 Python 应用,用 strace 看它在干什么:

strace -p <PID> -c -S time

按 Ctrl+C 停止后能看到各系统调用的耗时分布。

第五步:看磁盘和网络

CPU 高有时候是 IO 在等导致的:

iostat -x 1

如果 %iowait 很高,问题可能不是 CPU 不够,是磁盘太慢。

ss -tpln

连接数异常也可能导致 CPU 飙升,比如被 CC 攻击了。

快速排查脚本

#!/bin/bash
echo "=== CPU 占用 TOP 10 ==="
ps aux --sort=-%cpu | head -11
echo "=== 负载 ==="
uptime
echo "=== 内存 ==="
free -h
echo "=== IO ==="
iostat -x 1 2

常见的 CPU 高原因

  • 死循环:应用代码里有个 while(true) 没退出条件
  • 大量请求:被攻击或者业务突然暴增
  • 频繁 GC:Java 应用内存不够,GC 线程满负荷
  • 进程卡住:数据库连接池耗尽,线程不断重试
  • 挖矿病毒:看看有没有可疑进程,留意陌生的二进制名

先找到哪个进程、哪个线程、它在调用什么,然后再决定是重启、修代码还是加机器。不要一看 CPU 高就重启,那是临时止疼不是治病。