系统变慢、服务告警、业务抖动,绝大多数时候根源都在问题进程上。问题进程可分为两大类:资源使用过度(CPU、内存、IO、文件句柄)和状态异常(僵尸进程、不可中断睡眠)。
本模块按"现象 → 成因 → 分析命令 → 处置"的顺序,把这两类故障的排查路径讲透——这是运维排障最常复用的技能组合。
top、ps、free 等基础资源命令| 类型 | 现象 | 对业务的影响 |
|---|---|---|
| CPU 过度使用 | 单核/多核打满 | 服务响应变慢、请求堆积 |
| 内存过度使用 | 内存耗尽、OOM | 进程被杀、系统 Swap 抖动 |
| IO 过度使用 | 磁盘繁忙、IO 等待高 | 读写阻塞、整体卡顿 |
| 文件句柄过度 | 句柄耗尽、Too many open files | 新连接失败、服务不可用 |
| 僵尸进程 | 大量 Z 状态进程 | 占用进程表,pid 耗尽 |
| 不可中断睡眠 | 进程卡死、kill -9 无效 | 服务僵死、无法恢复 |
上图为问题进程的二分法:一类是资源使用过度(CPU、内存、IO、文件句柄四类资源被耗尽),另一类是状态异常(僵尸进程 Z、不可中断睡眠 D)。先判断问题属于哪一类,再选择对应的分析命令与处置手段,是高效排障的第一步。
top 定位可疑进程 → ps 确认进程详情 → strace 观察系统调用卡点 → free/iostat 确认资源维度。
僵尸进程无法被直接 kill(它已经死了,只是未被回收),必须清理其父进程:
ps -e -o ppid,stat | grep Z | awk '{print $1}' | xargs kill -9原理:ps -e -o ppid,stat 列出父进程 ID 与状态 → 过滤 Z 状态 → 用 awk '{print $1}' 提取第一列父 PID(ps 输出列右对齐带前导空格,用 awk 取列比 cut 更可靠)→ 杀掉父进程,由 init/systemd 完成僵尸回收。
上图为僵尸进程的产生与清理:子进程执行结束后进入僵尸状态(defunct),等待父进程回收;若父进程未及时回收则僵尸残留并占用进程表。清理时用 ps -e -o ppid,stat 定位其父进程 PID,将其杀掉后由 init/systemd 统一回收僵尸,从而释放进程表资源。
操作系统睡眠分两种:可中断睡眠(S)——等待条件为真,硬件中断、资源释放、信号量都可唤醒;不可中断睡眠(D)——只能等待特定硬件资源被唤醒,不响应信号。
典型场景:进程 B 向队列添加数据后唤醒进程 A,而 A 正在处理上一次任务,无法响应唤醒,于是进入不可中断睡眠。
处置要点:
kill -9 对 D 状态进程无效;上图为不可中断睡眠的产生机制:进程 B 向队列添加数据后尝试唤醒进程 A,但 A 正在处理上一次任务、无法及时响应唤醒信号,于是进入不可中断睡眠(D)状态。此时 A 不响应任何信号,kill -9 无效,只能恢复其等待的资源或重启系统。
| 命令 | 用途 | 常用形式 |
|---|---|---|
top | 实时显示各进程资源占用 | top、top -p <pid> 只看某进程 |
ps | 显示瞬间进程状态快照 | ps -ef、ps aux |
strace | 跟踪进程的系统调用 | strace -p <pid> 观察卡住的进程 |
free | 统计内存使用 | free -h |
iostat | 监视磁盘 IO 活动 | iostat -x 1 |
iotop | 按进程查看 IO 使用 | iotop(IO 频繁时慎用,本身开销大) |
排查思路:top 定位可疑进程 → ps 确认进程详情 → strace 观察系统调用卡点 → free/iostat 确认资源维度。
cat /proc/sys/fs/file-max # 系统全部进程允许打开的最大 fd 总数
cat /proc/sys/fs/file-nr # 已分配 / 已分配但空闲 / 最大 fd 数量
ls -l /proc/<pid>/fd/ | wc -l # 统计某进程打开的 fd 数量/proc/<pid>/fd/ 目录存放着进程当前打开的所有文件句柄(File Descriptor)。
处置思路:句柄过多超过限制时,两条路线:
ps -ef | grep defunct # 关键字 defunct 即僵尸进程
ps -e -o ppid,stat | grep Z | awk '{print $1}' | xargs kill -9 # 清理:杀父进程回收top 中也能看到僵尸进程数量。
NFS 客户端挂载共享存储后,服务端未先 umount 就关闭,客户端执行 df 会一直处于不可中断状态,kill -9 也无法关闭。正确做法是先恢复 NFS 服务端,再唤醒客户端进程。
kill -9 无效,只能恢复其等待的资源或重启系统。ps -ef/ps aux 中的 STAT 列判断进程是否 Z/D 状态,而不仅是资源占用。iostat/iotop 区分 IO 与 CPU 维度。iotop 在 IO 频繁时滥用:iotop 本身开销大,IO 已繁忙时应慎用,避免加重负担。/proc/<pid>/ 各子文件、perf、vmstat、mpstat 做更细粒度分析。top、ps、strace、free、iostat、iotop、lsof 的 man 手册与官方文档。/proc/<pid>/fd 与 file-max/file-nr;