故障排查实战手册:按场景拆解的排查思路与核心命令
故障排查实战手册:按场景拆解的排查思路与核心命令
在IT运维的日常中,故障如同潜伏的暗雷,随时可能引爆。面对告警,最忌讳的是“盲人摸象”式地乱敲命令。专业的排查应当是结构化的:先定性,后定位;先保现场,后深挖根因。
本手册按四大高频故障场景,梳理标准排查思路与核心命令,助你构建清晰的排障SOP。
场景一:服务器CPU飙高
排查思路:
CPU飙高只是表象,核心要区分是用户态(US)高还是内核态(SY)高,亦或是I/O等待(WA)高。US高通常是应用死循环或计算密集;SY高则是系统调用频繁或锁竞争;WA高则说明CPU在等磁盘,根因往往在磁盘I/O。
核心命令:
- 看整体负载与CPU分布:
```bash
top # 关注 %us, %sy, %wa, %st (偷取时间,虚拟化环境需关注)
uptime # 看1分钟、5分钟、15分钟负载,判断是突发还是持续
```
- 定位具体进程:
```bash
top -c # 显示完整命令行
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11 # 按CPU降序排列前10进程
```
- 深挖进程内部(以Java/多线程应用为例):
```bash
top -Hp
printf "%x\n"
jstack
strace -p
```
场景二:内存溢出与OOM
排查思路:
内存问题分两类:一是物理内存耗尽触发OOM Killer;二是应用本身内存泄漏。排查时需先确认是系统整体缺内存,还是单进程膨胀。注意:Linux会尽量使用内存做Cache,Available内存才是真正可用内存。
核心命令:
- 查看系统真实内存余量:
```bash
free -h # 关注 available 列,而非 free 列
vmstat 1 5 # 观察_swap的si/so_,若持续大于0,说明物理内存已不足,正在频繁换页
```
- 定位内存消耗大户:
```bash
ps -eo pid,ppid,cmd,%mem --sort=-%mem | head -11
smem -t -k -s rss # 按真实物理内存(RSS)排序,比ps更准确
```
- 排查OOM Killer痕迹:
```bash
dmesg -T | grep -i oom # 查看内核日志,确认是否进程被杀
cat /var/log/messages | grep "Out of memory"
```
- 应用级内存分析:
```bash
jmap -histo:live
pmap -x
```
场景三:磁盘I/O瓶颈与空间满
排查思路:
磁盘问题分为“空间满”和“I/O阻塞”。空间满会导致服务无法写入日志或数据;I/O阻塞会导致应用响应极慢(伴随CPU的%wa飙高)。特别警惕已删除但未释放的文件占用空间。
核心命令:
- 排查空间满:
```bash
df -hT # 查看各分区使用率(关注Use%和挂载点)
du -sh /* 2>/dev/null | sort -rh | head -10 # 逐级查找大目录
lsof +L1 # 找出已删除但进程未释放的隐藏大文件(空间释放的杀手锏)
```
- 排查I/O阻塞:
```bash
iostat -xz 1 # 关注 %util(>80%即负载极高)和 await(响应时间)
iotop -oP # 只显示实际产生I/O的进程,定位谁在疯狂读写
```
- 文件级I/O追踪:
```bash
pidstat -d 1 # 实时查看各进程的读/写速率
inotifywait -m /data/ # 监控目录文件事件,定位瞬间大量写入的源头
```
场景四:网络异常与连接失败
排查思路:
网络排查遵循“从下至上”的OSI模型:链路层(网卡/线缆) -> 网络层(路由/防火墙) -> 传输层(端口/TCP状态) -> 应用层。切忌一上来就抓包,应先确认连通性与端口状态。
核心命令:
- 连通性与路由排查:
```bash
ping
mtr -n
traceroute -n
```
- 端口与防火墙排查:
```bash
telnet
nc -vz
iptables -L -n # 检查本机防火墙规则是否拦截
```
- 本机连接状态分析:
```bash
ss -s # 查看TCP连接状态汇总(排查TIME_WAIT或CLOSE_WAIT过多)
ss -tan state close-wait # 提取所有CLOSE_WAIT连接,排查应用未正确关闭socket
netstat -tunlp | grep
```
- 终极武器:抓包分析:
```bash
tcpdump -i eth0 -nn port 80 -w /tmp/dump.pcap # 抓取指定端口流量保存为文件,用Wireshark分析
tcpdump -i eth0 -nn host
```
结语:排障的“心法”
命令只是武器,真正的排障高手依赖的是“心法”:
- 先保现场:重启服务前,务必保留现场(dump堆栈、导出日志、保存系统状态),否则重启可能让根因永远深埋。
- 变更回滚优先:如果故障发生在变更后,第一时间回滚,而不是在故障现场试图修复新代码。
- 善用监控历史:命令看到的是“当下”,监控系统(Prometheus/Zabbix)看到的是“过去”。对比故障发生前后的指标变化,往往能瞬间锁定嫌疑点。