1. Linux故障排查"作战地图":运维工程师的深夜救星
凌晨三点,刺耳的告警铃声划破夜空。服务器CPU飙红、磁盘爆满、服务不可用...这种场景对运维工程师来说再熟悉不过。面对复杂的Linux系统故障,如何在最短时间内定位问题根源?这份"作战地图"正是为这样的紧急时刻准备的实战指南。
不同于教科书式的排查流程,我们更关注生产环境中那些教科书不会告诉你的"脏活累活"。当监控系统疯狂告警时,你需要的是能立即上手的排查路径,而不是原理讲解。本文整理了我十年运维生涯中处理过的数百次线上故障的实战经验,将看似杂乱的故障现象转化为清晰的排查路线图。
2. 故障排查黄金四象限:快速定位问题领域
2.1 资源类故障:CPU/内存/磁盘/网络
CPU异常排查路径:
- 快速确认CPU负载:
top -c(按1查看各核详情) - 定位高负载进程:
pidstat 1 5 -u(采样5次,间隔1秒) - 分析进程状态:
strace -p <PID>或perf top - 检查系统调用:
sar -w 1 3(上下文切换统计)
关键技巧:遇到100% CPU时,先用
awk '{print $1}' /proc/cpuinfo | grep -c ^processor确认物理核数,避免被超线程误导
内存泄漏排查流程:
# 实时内存监控 watch -n 1 'free -m; echo; ps aux --sort=-%mem | head -10' # 详细内存分析 cat /proc/meminfo | grep -E 'MemTotal|MemFree|Buffers|Cached' valgrind --leak-check=full ./your_program2.2 服务类故障:进程崩溃与服务不可用
服务状态检查清单:
- 进程存活确认:
ps -ef | grep -v grep | grep <服务名> - 端口监听验证:
ss -tulnp | grep <端口>(比netstat更高效) - 服务日志检查:
journalctl -u <服务名> --since "10 minutes ago" - 依赖服务验证:
curl -I http://依赖服务IP:端口
典型问题处理实录:
- 案例:Nginx返回502错误
- 检查后端服务:
curl -v http://upstream_ip:port - 验证连接池:
netstat -ant | grep <upstream_ip> | wc -l - 查看内核参数:
sysctl net.ipv4.tcp_tw_reuse
- 检查后端服务:
3. 磁盘I/O与文件系统故障深度排查
3.1 磁盘性能问题定位
iostat高级用法:
# 显示设备详细负载(间隔2秒,共5次) iostat -xmt 2 5 # 关键指标解读: # %util > 70% 表示磁盘繁忙 # await > 10ms 需要警惕 # svctime > 5ms 可能硬件故障LVM排查特别注意事项:
- 物理卷状态:
pvdisplay -v - 卷组剩余空间:
vgdisplay -v | grep Free - 逻辑卷扩展:
lvextend -r -L +5G /dev/vgname/lvname(-r参数自动调整文件系统)
3.2 文件系统错误处理
EXT4/XFS修复流程:
# 强制卸载(当umount报"target is busy"时) fuser -km /mountpoint umount -f /mountpoint # 文件系统检查 fsck -y /dev/sdX1 # EXT4 xfs_repair /dev/sdX1 # XFSinode耗尽应急方案:
# 查找占用inode的目录 find / -xdev -printf '%h\n' | sort | uniq -c | sort -k1 -n # 临时解决方案: # 1. 清理/tmp目录 # 2. 删除过期日志 # 3. 调整inode数量(需重新格式化)4. 网络问题排查:从链路层到应用层
4.1 网络连通性诊断
全链路检查工具链:
- 物理层:
ethtool eth0(检查网卡状态、双工模式) - 链路层:
arp -an(ARP缓存验证) - 网络层:
mtr -n -c 100 <目标IP>(替代traceroute) - 传输层:
tcptraceroute -n <目标IP> <端口> - 应用层:
curl -v --connect-timeout 3 http://example.com
TCP连接问题速查表:
| 现象 | 检查命令 | 常见原因 |
|---|---|---|
| 连接超时 | ss -tanp | grep -i <端口> | 防火墙拦截、服务未监听 |
| 连接拒绝 | nc -zv <IP> <端口> | 服务崩溃、端口错误 |
| 数据传输慢 | iftop -nNP | 带宽拥塞、QOS限制 |
4.2 防火墙与安全组排查
iptables/nftables调试技巧:
# 查看完整规则链(含行号) iptables -L -n -v --line-numbers # 规则匹配测试 iptables -t filter -v -x -n -L | grep <目标IP> # 临时放行诊断(慎用) iptables -I INPUT -p tcp --dport <端口> -j ACCEPTfirewalld高级用法:
# 检查活跃区域 firewall-cmd --get-active-zones # 查看详细规则 firewall-cmd --list-all-zones # 实时监控(需要systemtap) stap -e 'probe kernel.function("ipt_do_table") {printf("%s\n", pp())}'5. 系统级问题排查:内核与硬件层
5.1 内核日志分析
dmesg高级过滤技巧:
# 显示最近10分钟的内核错误 dmesg -T | grep -E -i "error|fail|warn" | grep "$(date +'%a %b %d %H:%M' --date='10 minutes ago')" # 持续监控新错误 dmesg -wH内核参数调优检查点:
# 关键参数快速查看 sysctl -a | grep -E 'vm.swappiness|net.ipv4.tcp_fin_timeout|fs.file-max' # 生产环境推荐值(根据实际情况调整) echo """ vm.swappiness = 10 net.ipv4.tcp_fin_timeout = 30 fs.file-max = 6553500 """ >> /etc/sysctl.conf5.2 硬件故障预警信号
硬盘SMART检测:
# 安装工具 yum install smartmontools -y # 检查硬盘健康状态 smartctl -H /dev/sda # 查看详细属性 smartctl -A /dev/sda | grep -E '5 Reallocated_Sector_Ct|197 Current_Pending_Sector|198 Offline_Uncorrectable'内存错误检测:
# 快速测试(需要memtester) memtester 1G 3 # 全面检测(需重启) badblocks -sv /dev/sda6. 自动化排查工具链搭建
6.1 脚本化排查工具
一键式排查脚本示例:
#!/bin/bash echo "====== $(date) ======" echo "### CPU Top10 ###" ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11 echo "### Memory Top10 ###" ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -11 echo "### Disk Usage ###" df -hT | grep -v tmpfs echo "### Network Connections ###" ss -s定时自动化检查:
# 每5分钟记录系统状态 */5 * * * * /usr/bin/sar -u -r -n DEV -o /var/log/sa/sa$(date +\%d) 1 5 >/dev/null6.2 可视化监控集成
Prometheus关键指标:
# alert.rules示例 groups: - name: host_stats rules: - alert: HighCPU expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 10m - alert: OutOfMemory expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90Grafana看板推荐:
- Node Exporter Full:ID 1860
- Linux Hosts Metrics:ID 10180
- Zabbix System Monitoring:ID 10467
7. 故障场景实战演练
7.1 案例一:数据库连接池耗尽
现象:
- 应用日志报"Too many connections"
- MySQL进程CPU 100%
- 大量
TIME_WAIT连接
排查步骤:
- 查看连接数:
mysqladmin -uroot -p processlist - 分析连接来源:
netstat -antp | grep 3306 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c - 检查最大连接数:
show variables like 'max_connections'; - 查看线程栈:
pstack $(pgrep -f mysqld)
解决方案:
-- 临时增加连接数 SET GLOBAL max_connections = 500; -- 优化连接池配置 # 在应用配置中增加: spring.datasource.hikari.maximum-pool-size=50 spring.datasource.hikari.leak-detection-threshold=600007.2 案例二:磁盘空间神秘消失
现象:
df -h显示磁盘使用率95%du -sh /统计总和远小于磁盘使用量
高级排查技巧:
- 检查已删除未释放文件:
lsof -nP | grep deleted - 查找大文件:
find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null - 检查稀疏文件:
du -sh *vsls -lh - LVM快照残留检测:
lvdisplay -a | grep -i snapshot
文件系统调试命令:
# 查看文件系统块分配 debugfs -R "stat <inode>" /dev/sda1 # 追踪文件创建过程 auditctl -w /path/to/dir -p wa -k disk_space ausearch -k disk_space | aureport -f -i8. 运维工程师的避坑指南
8.1 必须避免的六大操作
直接运行未知脚本:
- 正确做法:
bash -n script.sh检查语法后,逐段执行
- 正确做法:
生产环境直接调试:
- 必须先在staging环境复现问题
盲目重启服务:
- 先收集核心指标:
gcore -o /tmp/core <PID>
- 先收集核心指标:
全盘清理/tmp:
- 可能破坏正在运行的临时文件
随意调整内核参数:
- 修改前记录原值:
sysctl -a > /etc/sysctl.conf.bak
- 修改前记录原值:
忽略备份直接操作:
- 关键配置修改前:
cp -a /etc /etc.bak
- 关键配置修改前:
8.2 必备的应急工具包
离线安装包准备清单:
- 诊断工具:sysstat, dstat, iotop, iftop, nethogs
- 调试工具:strace, ltrace, gdb, perf
- 恢复工具:e2fsprogs, xfsprogs, lvm2
快速部署方法:
# 创建离线仓库 mkdir -p /opt/tools/{rpms,scripts} yum install --downloadonly --downloaddir=/opt/tools/rpms sysstat iotop # 批量安装 rpm -ivh /opt/tools/rpms/*.rpm9. 排查后的必要工作
9.1 根因分析(RCA)模板
五步分析法:
- 时间线重建:精确到秒的事件序列
- 变更关联:检查最近部署/配置变更
- 容量评估:资源使用增长趋势分析
- 架构审查:单点故障/雪崩效应检查
- 监控缺口:未覆盖的关键指标识别
示例报告结构:
# 故障报告:2023-XX-XX MySQL连接池耗尽 ## 影响范围 - 持续时间:02:15-03:47(92分钟) - 影响服务:订单支付、库存查询 ## 根本原因 1. 应用连接泄漏(HikariCP配置错误) 2. 监控缺失(未告警连接数增长) ## 改进措施 - [ ] 修复连接池配置(3天内) - [ ] 增加连接数监控(本周内) - [ ] 实施自动连接回收(下版本)9.2 预防性措施实施
容量规划检查表:
- 磁盘空间:每日增长量监控
- 内存使用:关注cache/buffer变化趋势
- 连接数:建立基线阈值
- 线程数:与CPU核数关联告警
自动化防御方案:
# 连接数保护脚本示例 MAX_CONN=1000 CURRENT_CONN=$(netstat -ant | wc -l) if [ $CURRENT_CONN -gt $MAX_CONN ]; then alert "连接数超过阈值: $CURRENT_CONN/$MAX_CONN" # 自动保护动作... fi10. 进阶技能:性能调优与预防
10.1 内核参数调优实战
网络相关优化:
# 增大TCP窗口大小 echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf # 加快TIME_WAIT回收 echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf文件系统优化:
# 调整脏页刷新策略(适合写入密集型) echo "vm.dirty_ratio = 20" >> /etc/sysctl.conf echo "vm.dirty_background_ratio = 10" >> /etc/sysctl.conf # 禁用atime更新(减少磁盘IO) mount -o remount,noatime /10.2 系统加固建议
安全基线检查要点:
- 无用服务检查:
systemctl list-unit-files | grep enabled - SSH加固:
grep -E '^PermitRootLogin|^PasswordAuthentication' /etc/ssh/sshd_config - 用户权限审计:
awk -F: '($3 == 0) {print}' /etc/passwd - SUID文件检查:
find / -perm -4000 -type f 2>/dev/null
入侵检测脚本示例:
#!/bin/bash # 检查异常进程 ps aux | awk '{print $1,$11}' | sort | uniq -c | sort -n # 检查异常监听端口 ss -tulnp | awk '{print $5}' | cut -d: -f2 | sort -u # 检查crontab变更 ls -lt /var/spool/cron/ /etc/cron.d/ /etc/crontab