故障排查实战手册:从场景到命令的精准狙击
故障排查实战手册:从场景到命令的精准狙击
在IT运维的日常中,故障往往不期而至。面对告警风暴和业务中断的压力,运维人员如果仅凭直觉“盲人摸象”,极易在浩如烟海的日志和指标中迷失。高效的故障排查本质上是一个“现象 -> 假设 -> 验证 -> 定位”的逻辑闭环。本文提炼了四大高频故障场景,提供标准化的排查思路与实战命令,助你在危机时刻精准狙击。
场景一:网络连通性异常
排查思路:遵循OSI模型自底向上排查,从物理链路到路由,再到端口与防火墙,最后看应用层DNS。
- 链路与ICMP层:确认网卡状态及基础连通性。
- 路由层:确认数据包能否正确到达目标网段。
- 传输层:确认目标端口是否开放且可达。
- 应用层:确认域名解析是否正常。
实战命令:
# 1. 检查本机网卡状态、IP及路由信息
ip addr show
ip route show
# 2. 基础连通性测试(加 -c 限制发包数,避免长时间挂起)
ping -c 4 <目标IP>
# 3. 路由追踪,定位丢包位置
traceroute <目标IP> # Linux
tracert -d <目标IP> # Windows
# 4. 端口连通性测试(比telnet更优,支持超时设置)
nc -zv -w 3 <目标IP> <目标端口>
# 5. 抓包分析(终极杀器,确认包是否发出及返回)
tcpdump -i eth0 -nn port <目标端口> -w capture.pcap
# 6. DNS解析验证
dig @<DNS服务器> <域名> +short
nslookup <域名>
场景二:系统负载飙升/CPU打满
排查思路:先看整体负载与平均负载,再定位到具体进程,最后下钻到线程或代码级别。
- 宏观定位:确认是CPU密集型(us高)还是I/O密集型(sy高/wa高)。
- 微观定位:找到消耗CPU最高的进程。
- 深度剖析:如果是Java等应用,需查看具体线程在执行什么代码。
实战命令:
# 1. 查看系统整体负载(重点关注1/5/15分钟均值,是否超过CPU核数)
uptime
# 2. 实时监控CPU上下文切换及中断(wa高代表磁盘慢,sy高代表内核开销大)
vmstat 1 5
# 3. 全局查看CPU占用排行(Shift+P按CPU排序)
top
# 4. 快速找出CPU占用最高的Top 5进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -6
# 5. 针对特定进程,查看其最高消耗的线程
top -Hp <PID>
# 6. 将异常线程ID转换为16进制,配合jstack/strace抓取堆栈(Java应用经典排查)
printf "%x\n" <线程ID>
jstack <PID> | grep <16进制线程ID> -A 30
# 7. 动态追踪系统调用(无源码时的神器)
strace -cp <PID>
场景三:磁盘空间不足与I/O瓶颈
排查思路:空间不足不仅要看可见文件,还要警惕已删除但未释放的句柄;I/O瓶颈需区分是读写量大,还是磁盘响应慢。
- 空间排查:定位大文件与隐藏占用。
- Inode排查:有时空间有剩余,但Inode耗尽(小文件过多)同样无法写入。
- I/O性能排查:看等待时间和队列长度。
实战命令:
# 1. 查看各挂载点空间使用率
df -hT
# 2. 查看Inode使用率(解决"No space left on device"但df -h有空间的诡异常)
df -i
# 3. 交互式定位当前目录下最大的文件/目录(需安装ncdu,极其好用)
ncdu /
# 4. 传统方式找大文件(按大小排序当前目录下前10个文件/目录)
du -sh * | sort -rh | head -10
# 5. 查找已删除但未释放空间的文件(重定向清空而不要rm日志文件!)
lsof | grep deleted
# 6. 实时监控I/O使用情况(关注 %util 是否接近100%,await 是否过高)
iostat -xz 1 5
# 7. 查看哪个进程在疯狂读写磁盘(类似top的I/O版)
iotop -oP
场景四:服务启动失败或运行异常
排查思路:服务异常通常伴随配置错误、端口冲突或依赖组件(如DB/Redis)断连。遵循“看状态 -> 查日志 -> 查端口/依赖”的步骤。
- 状态确认:利用系统服务管理器获取错误码。
- 日志挖掘:从系统日志和应用日志中提取Error信息。
- 环境验证:确认端口监听状态及外部依赖连通性。
实战命令:
# 1. 查看服务状态及最近的报错片段
systemctl status <service_name>
# 2. 查看该服务的完整系统日志(-u指定unit,-f持续跟踪)
journalctl -u <service_name> -f --no-pager
# 3. 检查端口是否被冲突占用
ss -tulnp | grep <端口号>
# 4. 检查应用配置文件语法(以Nginx为例,很多服务启动失败源于配置写错)
nginx -t
# 5. 测试依赖组件连通性(如数据库、缓存)
mysql -h<DB_IP> -u<user> -p<pass> -e "select 1"
redis-cli -h <Redis_IP> ping
# 6. 强制前台运行(排查Daemon模式启动即闪退的问题,剥离后台机制看输出)
<服务启动命令> -f # 前台运行模式,或去掉 systemd 的守护参数
总结:故障排查的“心法”
命令只是武器,真正的运维高手靠的是心法:
- 先恢复再排查:业务中断时,优先通过重启、回滚、切换灾备恢复服务,保留现场(如dump、日志)后再慢查。
- 控制变量:每次只改动一个变量,避免叠加变更导致问题复杂化。
- 敬畏生产:绝不使用可能破坏数据的命令(如
rm、未限速的dd、直接清空大文件),高负载下慎用重度抓包。 - 复盘沉淀:每一次故障都是资产,将排查过程沉淀为SOP,完善监控告警,让同类故障无处遁形。