故障排查实战手册:按场景拆解的排查思路与核心命令

在IT运维的日常中,故障如同潜伏的暗雷,随时可能引爆。面对告警,最忌讳的是“盲人摸象”式地乱敲命令。专业的排查应当是结构化的:先定性,后定位;先保现场,后深挖根因

本手册按四大高频故障场景,梳理标准排查思路与核心命令,助你构建清晰的排障SOP。


场景一:服务器CPU飙高

排查思路

CPU飙高只是表象,核心要区分是用户态(US)高还是内核态(SY)高,亦或是I/O等待(WA)高。US高通常是应用死循环或计算密集;SY高则是系统调用频繁或锁竞争;WA高则说明CPU在等磁盘,根因往往在磁盘I/O。

核心命令

  1. 看整体负载与CPU分布

```bash

top # 关注 %us, %sy, %wa, %st (偷取时间,虚拟化环境需关注)

uptime # 看1分钟、5分钟、15分钟负载,判断是突发还是持续

```

  1. 定位具体进程

```bash

top -c # 显示完整命令行

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11 # 按CPU降序排列前10进程

```

  1. 深挖进程内部(以Java/多线程应用为例)

```bash

top -Hp # 查看该进程下哪个线程CPU最高

printf "%x\n" # 将线程ID转为十六进制

jstack | grep -A 30 # 查看该线程的堆栈快照,定位代码行

strace -p -c # 统计系统调用耗时,判断卡在哪个内核态

```


场景二:内存溢出与OOM

排查思路

内存问题分两类:一是物理内存耗尽触发OOM Killer;二是应用本身内存泄漏。排查时需先确认是系统整体缺内存,还是单进程膨胀。注意:Linux会尽量使用内存做Cache,Available内存才是真正可用内存。

核心命令

  1. 查看系统真实内存余量

```bash

free -h # 关注 available 列,而非 free 列

vmstat 1 5 # 观察_swap的si/so_,若持续大于0,说明物理内存已不足,正在频繁换页

```

  1. 定位内存消耗大户

```bash

ps -eo pid,ppid,cmd,%mem --sort=-%mem | head -11

smem -t -k -s rss # 按真实物理内存(RSS)排序,比ps更准确

```

  1. 排查OOM Killer痕迹

```bash

dmesg -T | grep -i oom # 查看内核日志,确认是否进程被杀

cat /var/log/messages | grep "Out of memory"

```

  1. 应用级内存分析

```bash

jmap -histo:live | head -20 # Java查看存活对象占用

pmap -x | sort -n -k3 # 查看进程各内存段映射大小

```


场景三:磁盘I/O瓶颈与空间满

排查思路

磁盘问题分为“空间满”和“I/O阻塞”。空间满会导致服务无法写入日志或数据;I/O阻塞会导致应用响应极慢(伴随CPU的%wa飙高)。特别警惕已删除但未释放的文件占用空间。

核心命令

  1. 排查空间满

```bash

df -hT # 查看各分区使用率(关注Use%和挂载点)

du -sh /* 2>/dev/null | sort -rh | head -10 # 逐级查找大目录

lsof +L1 # 找出已删除但进程未释放的隐藏大文件(空间释放的杀手锏)

```

  1. 排查I/O阻塞

```bash

iostat -xz 1 # 关注 %util(>80%即负载极高)和 await(响应时间)

iotop -oP # 只显示实际产生I/O的进程,定位谁在疯狂读写

```

  1. 文件级I/O追踪

```bash

pidstat -d 1 # 实时查看各进程的读/写速率

inotifywait -m /data/ # 监控目录文件事件,定位瞬间大量写入的源头

```


场景四:网络异常与连接失败

排查思路

网络排查遵循“从下至上”的OSI模型:链路层(网卡/线缆) -> 网络层(路由/防火墙) -> 传输层(端口/TCP状态) -> 应用层。切忌一上来就抓包,应先确认连通性与端口状态。

核心命令

  1. 连通性与路由排查

```bash

ping # 基础连通性

mtr -n # 结合ping和traceroute,动态查看哪一跳丢包或延迟高

traceroute -n # 排查路由环路

```

  1. 端口与防火墙排查

```bash

telnet # 测试TCP端口连通性

nc -vz # 更专业的端口探测

iptables -L -n # 检查本机防火墙规则是否拦截

```

  1. 本机连接状态分析

```bash

ss -s # 查看TCP连接状态汇总(排查TIME_WAIT或CLOSE_WAIT过多)

ss -tan state close-wait # 提取所有CLOSE_WAIT连接,排查应用未正确关闭socket

netstat -tunlp | grep # 确认服务是否真正监听在指定端口和IP上

```

  1. 终极武器:抓包分析

```bash

tcpdump -i eth0 -nn port 80 -w /tmp/dump.pcap # 抓取指定端口流量保存为文件,用Wireshark分析

tcpdump -i eth0 -nn host and port # 实时抓取特定IP和端口的包

```


结语:排障的“心法”

命令只是武器,真正的排障高手依赖的是“心法”:

  1. 先保现场:重启服务前,务必保留现场(dump堆栈、导出日志、保存系统状态),否则重启可能让根因永远深埋。
  2. 变更回滚优先:如果故障发生在变更后,第一时间回滚,而不是在故障现场试图修复新代码。
  3. 善用监控历史:命令看到的是“当下”,监控系统(Prometheus/Zabbix)看到的是“过去”。对比故障发生前后的指标变化,往往能瞬间锁定嫌疑点。