这是《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 无法登录
常见原因:
- SSH 进程异常;
- CPU 或 IO 打满;
- 磁盘满;
- PAM 或权限配置错误;
- 账号锁定;
- 安全组阻断;
- 主机宕机。
检查:
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'
常见来源:
- 数据库 checkpoint;
- 大查询;
- 日志刷盘;
- 备份;
- 快照;
- 索引重建;
- 磁盘故障;
- 云盘限速。
处理:
- 停止非关键任务;
- 限制备份速率;
- 扩容存储;
- 优化 SQL;
- 调整应用刷盘策略。
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
检查:
- ExecStart 路径;
- User 和 Group;
- WorkingDirectory;
- 环境变量;
- 端口占用;
- 文件权限;
- 依赖服务;
- limit;
- 应用配置。
以应用用户验证:
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 故障排查按“影响面、变更、资源、进程、应用、依赖”的路径推进。第一分钟保存现场,止血和根因可以并行。所有高危操作都要确认主机、路径和回滚,最终用指标恢复和复盘闭环。
思考题
- 为什么恢复优先于完整根因?
- 磁盘满时为什么不能直接删除活动日志?
- 进程退出码 137 通常说明什么?
- 如何避免防火墙变更锁死自己?
- 写一份服务器 CPU 高的排查手册。