{T}

典型系统故障:快速排错操作系统问题进程

0. 引言

系统变慢、服务告警、业务抖动,绝大多数时候根源都在问题进程上。问题进程可分为两大类:资源使用过度(CPU、内存、IO、文件句柄)和状态异常(僵尸进程、不可中断睡眠)。本章按"现象 → 成因 → 分析命令 → 处置"的顺序,把这两类故障的排查路径讲透——这是运维排障最常复用的技能组合。


1. 常见进程问题及其影响

类型现象对业务的影响
CPU 过度使用单核/多核打满服务响应变慢、请求堆积
内存过度使用内存耗尽、OOM进程被杀、系统 Swap 抖动
IO 过度使用磁盘繁忙、IO 等待高读写阻塞、整体卡顿
文件句柄过度句柄耗尽、Too many open files新连接失败、服务不可用
僵尸进程大量 Z 状态进程占用进程表,pid 耗尽
不可中断睡眠进程卡死、kill -9 无效服务僵死、无法恢复

常见成因

  • 外部负载:请求量超过进程承载能力,资源消耗过高;
  • 代码缺陷:程序设计不合理、算法低效,资源分配不当;
  • 部署不当:多个进程抢占同一份资源;
  • 安全问题:被攻击(如 CC、挖矿木马)导致资源耗尽。

2. 资源分析命令

命令用途常用形式
top实时显示各进程资源占用toptop -p <pid> 只看某进程
ps显示瞬间进程状态快照ps -efps aux
strace跟踪进程的系统调用strace -p <pid> 观察卡住的进程
free统计内存使用free -h
iostat监视磁盘 IO 活动iostat -x 1
iotop按进程查看 IO 使用iotop(IO 频繁时慎用,本身开销大)

排查思路:top 定位可疑进程 → ps 确认进程详情 → strace 观察系统调用卡点 → free/iostat 确认资源维度。


3. 文件句柄问题

3.1 查看系统级限制与用量

bash
cat /proc/sys/fs/file-max    # 系统全部进程允许打开的最大 fd 总数
cat /proc/sys/fs/file-nr     # 当前已打开 / 已分配 / 最大 fd 数量

3.2 查看单进程句柄

bash
ls -l /proc/<pid>/fd/ | wc -l    # 统计某进程打开的 fd 数量

/proc/<pid>/fd/ 目录存放着进程当前打开的所有文件句柄。

3.3 处置思路

句柄过多超过限制时,两条路线:

  • 调大系统限制(ulimit、limits.conf);
  • 程序优化:排查为何打开这么多句柄——常见原因是程序设计不合理,在本地创建大量临时碎片文件。

4. 僵尸进程(Zombie)

4.1 识别

bash
ps -ef | grep defunct        # 关键字 defunct 即僵尸进程

top 中也能看到僵尸进程数量。

4.2 处置

僵尸进程无法被直接 kill(它已经死了,只是未被回收),必须清理其父进程:

bash
ps -e -o ppid,stat | grep Z | cut -d" " -f2 | xargs kill -9

原理:ps -e -o ppid,stat 列出父进程 ID 与状态 → 过滤 Z 状态 → 提取父 PID → 杀掉父进程,由 init/systemd 完成僵尸回收。


5. 不可中断睡眠状态(D 状态)

5.1 产生场景

操作系统睡眠分两种:可中断睡眠(S)——等待条件为真,硬件中断、资源释放、信号量都可以唤醒;不可中断睡眠(D)——只能等待特定硬件资源被唤醒,不响应信号

典型场景:进程 B 向队列添加数据后唤醒进程 A,而 A 正在处理上一次任务,无法响应唤醒,于是进入不可中断睡眠。

图表渲染中…

5.2 经典案例:NFS 挂载

NFS 客户端挂载共享存储后,服务端未先 umount 就关闭,客户端执行 df 会一直处于不可中断状态,kill -9 也无法关闭。正确做法是先恢复 NFS 服务端,再唤醒客户端进程。

5.3 处置要点

  • kill -9 对 D 状态进程无效
  • 只能通过重启操作系统,或恢复其等待的资源(如重启 NFS 服务)来恢复。

6. 小结

  • 资源类故障:top 定位 → ps 确认 → strace/free/iostat 深入,句柄问题查 /proc/<pid>/fd 与 file-max/file-nr;
  • 僵尸进程:grep defunct 识别,杀父进程回收,无法直接 kill 僵尸本身;
  • 不可中断睡眠:D 状态不响应信号,kill -9 无效,恢复资源或重启系统才是出路;
  • 排障思维:先定性(资源 or 状态)再定位(命令取证),区分"能杀"与"不能杀"。

下一章讲解磁盘数据恢复:rm -rf 误删数据后如何抢救,理解 inode/block 与 i_count/i_nlink 的恢复原理。