LinuxNotes

第 26 章:故障排查手册

zjc 于 2026-01-26 发布

这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 故障排查的目标是用最短时间恢复业务,同时保留足够证据找根因。本章提供一套可复用的 Linux 故障流程:先定影响面,再定资源,再定进程,最后进入应用和依赖。

26.1 处理原则

1. 恢复优先于完美定位
2. 先确认影响面和变更
3. 每个结论要有证据
4. 止血动作可回滚
5. 保留现场日志
6. 单点操作要有第二人确认
7. 高危命令先确认目标

时间线必须实时记录:

10:00 告警触发
10:02 确认 5xx 上升
10:04 发现 10 分钟前有发布
10:06 开始回滚
10:10 指标恢复

26.2 五分钟采集

date -Is
hostname
uptime
df -hT
free -h
vmstat 1 5
iostat -xz 1 5
ss -s
dmesg -T | tail -100
systemctl --failed --no-pager

进程:

ps -eo pid,user,stat,%cpu,%mem,rss,etime,cmd --sort=-%cpu | head -20
ps -eo pid,user,stat,%cpu,%mem,rss,etime,cmd --sort=-rss | head -20

保存:

mkdir -p /tmp/incident-$(date +%F-%H%M)
ps auxf > /tmp/incident-*/ps.txt
journalctl -b > /tmp/incident-*/journal.txt

26.3 无法登录

常见原因:

  1. SSH 进程异常;
  2. CPU 或 IO 打满;
  3. 磁盘满;
  4. PAM 或权限配置错误;
  5. 账号锁定;
  6. 安全组阻断;
  7. 主机宕机。

检查:

ping <host>
nc -vz <host> 22
ssh -vvv user@<host>

云环境使用带外控制台或救援模式。不要盲目重启,先保存可能的内核日志。

26.4 CPU 高

uptime
vmstat 1
mpstat -P ALL 1
pidstat -u 1
ps -eo pid,ppid,user,stat,%cpu,cmd --sort=-%cpu | head -20

分类:

现象 方向
us 高 业务计算、GC、算法
sy 高 系统调用、锁、线程切换
wa 高 IO 等待
st 高 虚拟化抢占
R 多 CPU 饱和

进入线程:

top -H -p <pid>
pidstat -t -p <pid> 1
perf record -F 99 -g -p <pid> -- sleep 30

26.5 内存异常

free -h
vmstat 1
cat /proc/meminfo
ps -eo pid,user,rss,cmd --sort=-rss | head -20
dmesg -T | grep -Ei 'oom|out of memory|killed process'

判断:

现象 方向
available 低 容量压力
si/so 持续 swap 压力
RSS 持续增长 泄漏或缓存增长
OOM 日志 已被杀
cgroup event 容器限制

容器:

kubectl describe pod <pod>
cat /sys/fs/cgroup/<path>/memory.events

26.6 磁盘满

df -hT
df -ih
du -sh /var/* /opt/* /tmp /root 2>/dev/null
lsof +L1
sudo journalctl --disk-usage

常见处理:

sudo journalctl --vacuum-size=1G
find /var/log -type f -name '*.gz' -mtime +14 -print

根分区满可能导致 SSH、sudo、日志和数据库异常。清理前确认文件归属,不要删除服务正在写的活动文件。

26.7 IO 高

iostat -xz 1
pidstat -d 1
cat /proc/meminfo | grep -E 'Dirty|Writeback'

常见来源:

  1. 数据库 checkpoint;
  2. 大查询;
  3. 日志刷盘;
  4. 备份;
  5. 快照;
  6. 索引重建;
  7. 磁盘故障;
  8. 云盘限速。

处理:

  1. 停止非关键任务;
  2. 限制备份速率;
  3. 扩容存储;
  4. 优化 SQL;
  5. 调整应用刷盘策略。

26.8 网络异常

ip -br addr
ip route
ss -s
ss -antp
ss -ti
ethtool -S eth0
nstat -az | grep -Ei 'retrans|drop|err'

分层:

DNS -> TCP -> TLS -> HTTP -> upstream

命令:

dig api.example.com
nc -vz api.internal 8080
openssl s_client -connect api.example.com:443 -servername api.example.com
curl -v --max-time 5 https://api.example.com/healthz

26.9 服务启动失败

systemctl status app --no-pager
journalctl -u app -n 200 --no-pager
systemctl cat app

检查:

  1. ExecStart 路径;
  2. User 和 Group;
  3. WorkingDirectory;
  4. 环境变量;
  5. 端口占用;
  6. 文件权限;
  7. 依赖服务;
  8. limit;
  9. 应用配置。

以应用用户验证:

sudo -u app /opt/app/bin/start --check
sudo -u app cat /opt/app/conf/app.yml

26.10 进程消失

journalctl -u app --since '1 hour ago'
dmesg -T | grep -Ei 'oom|segfault|killed process'
systemctl show app -p MainPID -p NRestarts -p Result

常见退出:

退出码 常见含义
1 应用错误
126 无执行权限
127 命令不存在
130 SIGINT
137 SIGKILL,常见 OOM 或强制停止
139 SIGSEGV
143 SIGTERM

26.11 高危操作

执行前必须确认:

命令 风险
rm -rf 误删不可恢复
dd 覆盖磁盘
mkfs 清空文件系统
iptables / nft 断开管理通道
sysctl -w 影响内核行为
kill -9 丢失清理机会
lvreduce 缩容风险
xfs_repair -L 可能丢数据

确认方式:

pwd
hostname
readlink -f <path>
ls -la <path>

26.12 应急止血

常见动作:

现象 止血
发布后异常 回滚
单实例异常 摘流
流量超容量 限流
CPU / 内存耗尽 扩容
批任务抢占 停任务
磁盘满 清理归档
安全事件 隔离主机

止血后仍要保留证据并完成复盘。

26.13 故障报告模板

# Linux 故障报告

## 摘要
- 故障时间:
- 恢复时间:
- 影响范围:
- 故障等级:
- 当前状态:

## 时间线
- 监测:
- 响应:
- 定位:
- 止血:
- 恢复:

## 根因
- 直接原因:
- 促成条件:
- 变更来源:

## 证据
- 系统指标:
- 日志:
- 进程:
- 网络路径:
- 配置变更:

## 后续
| 行动 | 负责人 | 截止时间 | 优先级 | 验证 |
|---|---|---|---|---|

本章小结

Linux 故障排查按“影响面、变更、资源、进程、应用、依赖”的路径推进。第一分钟保存现场,止血和根因可以并行。所有高危操作都要确认主机、路径和回滚,最终用指标恢复和复盘闭环。

思考题

  1. 为什么恢复优先于完整根因?
  2. 磁盘满时为什么不能直接删除活动日志?
  3. 进程退出码 137 通常说明什么?
  4. 如何避免防火墙变更锁死自己?
  5. 写一份服务器 CPU 高的排查手册。