故障排查实战手册:运维高手的“破案”指南

在IT运维的日常中,故障就像是不定时炸弹,往往在毫无征兆的情况下爆发。面对告警风暴和业务中断的压力,运维人员如果仅凭直觉“盲人摸象”,极易陷入重启大法好、却不知其所以然的窘境。优秀的运维工程师与普通运维的区别,往往在于是否具备体系化的排查思路。

本手册将按经典故障场景分类,梳理标准排查思路,并给出实战中最高频的“破案”命令,助你快速定位问题,恢复业务。


场景一:CPU飙高——谁在吞噬算力?

排查思路

CPU使用率飙升通常由业务量突增、死循环代码、或进程异常引起。排查的核心逻辑是:定位进程 -> 定位线程 -> 定位代码行

实战命令

  1. 快速锁定罪魁祸首进程

```bash

top -c

```

技巧:按 P 键按CPU使用率排序,-c 参数可显示完整的进程启动命令,方便识别是哪个具体业务。

  1. 查看CPU核心负载分布

```bash

mpstat -P ALL 1 3

```

技巧:如果单核飙高而多核空闲,通常是应用程序存在锁竞争或单线程死循环;如果多核均飙高,则多为计算密集型任务或业务真实洪峰。

  1. 深入进程内部定位线程

```bash

top -Hp

```

技巧:找出占用CPU最高的线程ID(TID)。

  1. 线程ID转储为堆栈分析

```bash

# 将线程ID转为16进制

printf "%x\n"

# 导出进程堆栈,搜索16进制的线程ID

jstack | grep -A 30

```

技巧:针对Java应用,此组合拳可直接定位到具体哪一行代码在消耗CPU。


场景二:内存泄漏/OOM——谁在悄悄囤积?

排查思路

内存问题通常分为突发OOM(Out of Memory)和慢性泄漏。突发OOM需看系统日志;慢性泄漏需观察内存增长趋势,并分析进程内存分布。排查逻辑:查系统余量 -> 查进程占用 -> 查堆栈/缓存

实战命令

  1. 查看系统整体内存使用

```bash

free -h

```

技巧:重点关注 buff/cacheavailable。Linux会将空闲内存用于缓存,available 才是系统真正可用的内存量。

  1. 按内存排序定位进程

```bash

top -c

```

技巧:按 M 键按内存使用率排序。

  1. 查找已被删除但未释放空间的文件

```bash

lsof | grep deleted

```

技巧:这是运维经典坑!进程写入日志时,若有人直接 rm 删除了文件,空间不会释放,进程依然持有文件句柄。通过 lsof 找到后,重启对应进程或清空文件(> /proc/PID/fd/FD)即可释放空间。

  1. 系统级OOM日志排查

```bash

dmesg -T | grep -i oom

```

技巧:如果进程被系统强行Kill,dmesg 会记录系统层面选择杀死哪个进程的决策过程。


场景三:磁盘I/O瓶颈——谁在疯狂读写?

排查思路

磁盘I/O高会导致系统响应极度迟缓,甚至引发数据库锁表。排查逻辑:看等待队列 -> 定位读写进程 -> 确认具体文件

实战命令

  1. 实时监控I/O状态

```bash

iostat -x 1 3

```

技巧:重点关注 %util(磁盘繁忙度)和 await(I/O等待时间)。如果 %util 接近100%且 await 远大于正常值,说明磁盘存在严重瓶颈。

  1. 定位高I/O进程

```bash

iotop -oP

```

技巧-o 只显示有I/O操作的进程,-P 只显示进程不显示线程。直观看到哪个进程在疯狂读或写。

  1. 查看进程打开的文件描述符

```bash

lsof -p

```

技巧:结合 iotop 找到的进程,用 lsof 查看它正在写入哪些日志或数据文件。


场景四:网络连通性异常——谁挡了我的包?

排查思路

网络问题最复杂,涉及链路、防火墙、端口、DNS等。排查逻辑必须遵循OSI模型自底向上:网卡/链路 -> IP连通性 -> 端口连通性 -> 应用层。

实战命令

  1. 检查本地网卡与路由

```bash

ip addr

ip route

```

  1. 链路连通性及路径探测

```bash

ping <目标IP>

traceroute <目标IP>

```

技巧ping 不通时,用 traceroute 看包卡在哪一跳,能迅速界定是本机网关问题、运营商问题还是对端网络问题。

  1. 端口连通性测试(TCP三次握手)

```bash

telnet

# 或更强大的工具

nc -zv -w 3

```

技巧telnet 退出较慢,nc (netcat) 指定超时时间 -w 3 更适合脚本和快速排查。

  1. 抓包分析(终极杀器)

```bash

tcpdump -i eth0 -nn port 80

```

技巧:当网络连通但应用报错(如握手失败、重传过多)时,抓包是唯一的真相来源。-nn 禁止域名和端口解析,提高抓包性能。

  1. 本地防火墙规则审查

```bash

iptables -L -n --line-numbers

```


场景五:服务启动失败——为何一启动就挂?

排查思路

服务起不来,千万别盲目重启。排查逻辑:看状态 -> 看日志 -> 查端口冲突 -> 查配置

实战命令

  1. 查看服务详细状态

```bash

systemctl status <服务名> -l

```

技巧-l 参数显示完整日志,不截断。这里通常会直接报出配置文件语法错误或退出码。

  1. 查看服务专属日志(Systemd生态)

```bash

journalctl -u <服务名> --since "10 min ago" -f

```

技巧:对于没有独立日志文件的服务,journalctl 是查错核心。

  1. 检查端口冲突

```bash

ss -tunlp | grep <端口号>

```

技巧:服务启动失败极大概率是端口被占用。ssnetstat 速度快得多,-p 显示占用端口的进程。

  1. 配置文件语法检查(以Nginx为例)

```bash

nginx -t

```

技巧:几乎所有成熟软件都自带配置检测参数(如 httpd -t, postfix check),修改配置后必须先检测再重启。


总结:排障六步法

命令只是武器,思路才是内功。遇到故障时,请牢记以下六步法:

  1. 稳住心态:不慌不乱,先看监控大盘,确认爆炸半径。
  2. 快速止损:能降级则降级,能限流则限流,优先恢复业务,再排查根因。
  3. 现象复现:确认故障是否稳定复现,还是偶发。
  4. 缩小范围:通过变更记录(是否有发版/配置修改)、隔离对比(A/B环境)缩小嫌疑范围。
  5. 由表及里:从应用层 -> 系统层 -> 网络层,逐层剥开。
  6. 复盘沉淀:故障恢复不是终点,写出复盘报告,完善监控告警,才是运维价值的升华。