1. 为什么我们需要一份Linux故障排查"作战地图"?
凌晨3点15分,手机突然疯狂震动,十几条告警短信接踵而至。CPU负载飙升、磁盘空间告急、服务端口无响应...这种场景对于运维工程师来说再熟悉不过。在高压状态下,人的思维容易陷入混乱,这时候一份清晰的排查路线图就是救命稻草。
我经历过太多次深夜被警报炸醒的崩溃时刻,也深刻体会到没有系统化排查思路的痛苦。后来通过总结上百次实战经验,整理出这套"作战地图",它本质上是一套标准化的故障定位流程,能帮助我们在最短时间内找到问题根源。
2. 作战地图核心框架解析
2.1 全局状态速查(5分钟定位问题范围)
首先通过这几个命令快速建立整体认知:
# 系统负载三剑客 uptime top -n 1 -b | head -5 vmstat 1 5 # 存储空间检查 df -hT | grep -v tmpfs du -sh /* 2>/dev/null | sort -hr | head -10 # 网络连接统计 ss -s netstat -antp | awk '{print $6}' | sort | uniq -c特别注意:当load average超过CPU核心数的70%,就需要重点关注进程状态;/var/log目录大小突然激增往往是日志爆满的征兆。
2.2 进程级问题定位(关键进程分析)
通过以下步骤锁定异常进程:
# 找出CPU占用TOP5 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -6 # 内存消耗TOP5 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -6 # 僵尸进程检查 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' # 关键进程资源跟踪 pidstat -d -p [PID] 1 5 # 磁盘IO pidstat -r -p [PID] 1 5 # 内存 strace -p [PID] -T -tt -o /tmp/strace.log # 系统调用跟踪常见陷阱:
- 高CPU可能是由频繁GC的Java进程导致
- 内存泄漏进程往往表现为RSS持续增长
- 僵尸进程积累会占用进程号资源
2.3 网络问题深度排查
当出现网络连接问题时,这个检查清单很管用:
# 基础连通性测试 ping -c 4 [IP] traceroute [IP] mtr -n [IP] # 端口检测 telnet [IP] [PORT] # 或使用nc ss -tulnp | grep [PORT] # 连接状态分析 ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c netstat -n | awk '/^tcp/ {print $6}' | sort | uniq -c # 防火墙规则检查 iptables -L -n -v典型场景处理:
- TIME_WAIT堆积:调整tcp_tw_reuse参数
- 连接拒绝:检查防火墙和SELinux
- 带宽打满:用iftop定位流量来源
3. 存储与日志问题专项排查
3.1 磁盘IO问题定位
# IO整体负载 iostat -x 1 5 # 具体进程IO iotop -oP # 文件打开情况 lsof +D /path/to/dir # 大文件查找 find / -type f -size +500M -exec ls -lh {} \;处理建议:
- 使用ionice调整进程IO优先级
- 对于频繁小文件写入,考虑合并写入
- ext4文件系统注意预留空间设置
3.2 日志分析技巧
# 关键错误提取 grep -Ei "error|fail|exception" /var/log/messages # 时间范围过滤 sed -n '/2023-10-01 14:00/,/2023-10-01 15:00/p' /var/log/nginx/access.log # 高频错误统计 awk '/ERROR/{print $5}' /var/log/app.log | sort | uniq -c | sort -nr # 日志实时监控 tail -f /var/log/nginx/error.log | grep --line-buffered "500"日志分析黄金法则:
- 先看时间戳确定问题发生时间点
- 关注重复出现的错误模式
- 结合系统监控数据交叉验证
4. 高级诊断工具使用指南
4.1 性能分析神器perf
# 安装 yum install perf -y # CentOS apt-get install linux-tools-common -y # Ubuntu # CPU热点分析 perf top -p [PID] # 系统调用统计 perf stat -e 'syscalls:sys_enter_*' -a sleep 5 # 火焰图生成 perf record -F 99 -p [PID] -g -- sleep 30 perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flame.svg4.2 内存分析利器
# 内存泄漏检测 valgrind --leak-check=full ./your_program # 内存统计 cat /proc/meminfo free -m # slab内存分析 slabtop -o5. 故障自愈与预防措施
5.1 自动化处理脚本示例
#!/bin/bash # 自动清理/tmp目录 find /tmp -type f -mtime +7 -exec rm -f {} \; # 日志轮转检测 [ $(du -m /var/log/nginx/access.log | awk '{print $1}') -gt 1024 ] && \ systemctl restart nginx # 连接数监控 CONNS=$(ss -s | grep 'Total:' | awk '{print $2}') [ $CONNS -gt 10000 ] && \ echo "High connections: $CONNS" | mail -s "Conn Alert" admin@example.com5.2 预防性维护建议
关键指标监控:
- CPU、内存、磁盘、网络基线数据
- 关键进程存活状态
- 业务指标(如HTTP 500错误率)
定期健康检查:
# 每周执行一次全面检查 #!/bin/bash echo "===== $(date) =====" >> /var/log/system_check.log echo "-- Memory --" >> /var/log/system_check.log free -m >> /var/log/system_check.log echo "-- Disk --" >> /var/log/system_check.log df -h >> /var/log/system_check.log echo "-- Top Processes --" >> /var/log/system_check.log ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -10 >> /var/log/system_check.log重要配置文件备份:
# 每天备份一次关键配置 tar -czf /backup/$(hostname)-$(date +%Y%m%d).tar.gz \ /etc/nginx /etc/my.cnf /etc/ssh/sshd_config
这套作战地图最核心的价值在于建立了标准化的排查流程。当警报再次在深夜响起时,不再需要慌乱地尝试各种命令,而是可以按照这个地图一步步推进,就像在迷宫中有了指南针。经过多次实战检验,使用这套方法能将平均故障修复时间(MTTR)缩短60%以上。