服务器动不动 100% CPU?一套 top/ps/pidstat 定位流程 [复制链接]

管理员组

服务器卡顿、面板显示 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 占用高:见慢查询那套排查
  • 多进程同时跑(采集/爬虫):限制并发,加队列

记住:排查顺序永远是 负载 → 进程 → 线程 → 调优,别跳过中间步骤一上来就重启,那样只治标不治本。

最新回复

请先登录后再回复 登录

uid:1 管理员组
关注
错过了不该错过的人,那就是遗憾!
发帖 1418
评论 93
粉丝 1
关注 0
发新帖
目录
服务器动不动 100% CPU?一套 top/ps/pidstat 定位流程