服务器卡顿、面板显示 CPU 100%,第一反应别慌。按下面的顺序排查,几分钟内定位到是哪个进程(甚至哪行代码)在吃资源。
1. 先看整体负载
uptime # 负载: load average 三数值
vmstat 1 3 # 看 r列(运行队列) procs 与 us/sy
free -h # 内存余量
load average 三值持续高于 CPU 核数说明过载;r(运行中进程数) 长期大于核数也说明 CPU 不够用。
2. 锁定 TOP 进程
top -b -n 1 | head -20 # 一次快照
ps aux --sort=-%cpu | head -10 # 按CPU排序
ps aux --sort=-%mem | head -10 # 按内存排序
PHP-FPM 和 Nginx 正常情况各占几个百分点,某个进程持续 99% 就是元凶。
3. 钻到线程和调用栈
# 查看进程内哪个线程最忙(%CPU 为 100 的线程id)
top -H -p PID
# 把线程id转16进制 (如 12345 -> 0x3039)
printf '%x\n' 12345
# PHP-FPM: 本质是单线程,CPU高基本是业务代码问题,直接看慢请求日志
# Java/Node: 结合当前线程的堆栈分析
4. 分时统计定位规律
# pidstat 每2秒采样5次,看趋势(无法安装在宝塔环境时用top代替)
pidstat -p PID 2 5
5. 对症下药
- 某个 PHP 接口吃满 CPU:查慢日志、加缓存、看是不是死循环或大数组
- MySQL 占用高:见慢查询那套排查
- 多进程同时跑(采集/爬虫):限制并发,加队列
记住:排查顺序永远是 负载 → 进程 → 线程 → 调优,别跳过中间步骤一上来就重启,那样只治标不治本。