Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

故障排查思路

🔧 故障排查思路(系统化 + 最佳实践)

故障排查 = 现象确认 -> 快速定位 -> 层层排除 -> 根因分析 -> 防止复发

扩展:4 个大阶段 + 18 个模块。

🔥 第一部分:故障现象确认(WHAT)

1. 复现故障 / 行为确认

  • 是否稳定复现?是否有概率性?
  • 单用户 vs 多用户?
  • 某个接口 vs 全站?
  • 某组件 vs 整个集群?

核心:确保不是误报

⚙️ 第二部分:运行环境检查(WHERE)

包含你列的内容,并系统化扩展。

2. 程序运行状态(应用层)

检查:

  • 主进程是否存在?(ps、systemctl、docker ps、kubectl)
  • 是否频繁重启?(Pod restartCount)
  • 线程数是否异常?
  • 程序是否挂死(无响应但未退出)
  • 连接池是否耗尽(数据库/redis)

工具:

ps -ef
systemctl status xxx
docker logs
kubectl describe pod
kubectl logs

3. 集群状态(容器 / 分布式 / 服务网格)

检查:

  • Pod 是否 Pending / CrashLoopBackOff / OOMKilled
  • 节点是否 NotReady
  • 服务发现是否正常(DNS/CoreDNS)
  • 负载均衡是否正确转发
  • 配置是否一致
  • 依赖服务是否可用(DB、Cache、消息队列等)

工具:

kubectl get pod -A
kubectl describe node
kubectl get event --sort-by='.lastTimestamp'

4. 端口状态(网络层)

检查:

  • 监听端口是否存在(netstat、ss)
  • 服务是否真正 listening 而不是 TIME_WAIT
  • 外部访问是否被防火墙阻断
  • NAT 转发是否正常

工具:

ss -lntp
curl -v
telnet
iptables -L -n

5. 日志信息(日志层)

三类日志必须检查:

  • 应用日志(error/exception/stack)
  • 系统日志(dmesg、journalctl)
  • 中间件日志(Nginx、Redis、MySQL、Kafka)

关键点:

  • 是否 OOM
  • 是否段错误
  • 是否超时 or 连接拒绝
  • 是否资源不足(too many open files)
  • 是否权限问题(permission denied)

6. 客户端错误(用户侧/浏览器/API 调用)

关注:

  • HTTP 状态码(4xx、5xx)
  • 超时 vs 直接报错
  • 客户端 DNS 是否正常
  • API 是否限流、节流
  • Token / 权限问题

客户端日志位置:

  • 浏览器:F12 Network
  • App:调用链路日志
  • SDK:异常堆栈

📊 第三部分:系统资源状态(WHY)

7. CPU 使用率

关注:

  • 系统整体 CPU是否 100%?
  • 某个进程是否占满?
  • 内核态占比是否异常?
  • run queue 是否过高?

工具:

top / htop
pidstat -u 1
mpstat -P ALL 1

问题判断:

  • CPU 高:可能是循环、死锁、频繁 GC
  • CPU 低但程序卡住:可能是锁争用、IO 等待

8. 内存使用率

关注:

  • OOM 发生了吗?
  • resident memory 是否持续增长(内存泄漏)
  • 程序是否 cache 过大
  • swap 是否被使用(swap = 性能灾难)

工具:

free -m
top
dmesg | grep -i oom

判断:

  • 内存明显泄漏 -> 看应用层
  • cache 太高 -> 正常,无需 panic
  • swap 频繁 -> 会导致延迟升高几百倍

9. 磁盘使用率(空间 + I/O)

两个维度:

(1)磁盘空间

  • 是否被日志占满(/var/log)
  • 是否 df 已满(100% 会导致任何写入失败)
df -h
du -sh /var/log/*

(2)磁盘 I/O

  • IOPS、IO wait 是否过高?
iostat -x 1
dstat -d

IO 高 -> 数据库慢、写日志慢、应用阻塞

10. 网络状态(带宽 + 延迟 + 丢包)

关注:

  • DNS 是否正常解析
  • 是否丢包
  • 是否延迟高
  • 是否出口带宽打满
  • 是否有 SYN 洪水

工具:

ping、mtr、traceroute
iftop、iptraf
ss -s
tcpdump
curl -I

判断:

  • 丢包 -> 网络抖动 or 用户端 WiFi
  • RT 延迟高 -> 上游网络波动
  • iftop 显示带宽满 -> 限流 or 升级带宽
  • SYN Recv 多 -> 被攻击

🧩 第四部分:依赖服务检查(UPSTREAM)

11. 数据库状态(MySQL/Postgres)

检查:

  • 是否连接数满?
  • 是否锁等待?
  • 慢 SQL 是否暴增?
  • 主从延迟?
  • 存储空间?

工具:

show processlist
pg_stat_activity
explain
慢查询日志

12. 缓存服务(Redis/Memcached)

重点:

  • 是否内存不足?
  • 是否被驱逐?
  • 是否阻塞命令?
  • 集群槽位是否迁移异常?

13. 消息队列(Kafka/RabbitMQ)

重点:

  • 堆积?(lag)
  • broker 是否挂掉?
  • partition 是否均衡?
  • 消费者异常退出?

14. 反向代理 / 网关(Nginx/APISIX/Envoy)

检查:

  • upstream 健康检查是否失败
  • timeout 是否过低
  • 502/504 是否由上游导致
  • 限流 / 黑名单 是否生效

15. 负载均衡(L4/L7)

关注:

  • 是否只有一个节点在工作?
  • 权重配置错误?
  • 健康检查失败?

16. DNS 相关

检查:

  • 解析记录是否错误?
  • 是否缓存旧 IP?(客户端)
  • 是否攻击导致 DNS 超时?

工具:

dig
nslookup

🔐 第五部分:配置检查(HOW)

17. 程序配置变更

关注:

  • 最近是否发布、变更过?
  • ConfigMap 是否同步?
  • 环境变量是否缺失?
  • 配置是否多环境混用?

18. 权限 & 证书

  • Linux 文件权限
  • 数据库权限
  • Token 过期
  • TLS/SSL 证书过期
  • 容器 securityContext 问题

🌈 故障排查完整流程(最终版)

  1. 复现问题(确认)
  2. 看监控(CPU/内存/IO/网络)
  3. 看程序是否在正常运行
  4. 看集群状态
  5. 看端口与连通性
  6. 看日志(应用 + 系统 + 中间件)
  7. 看客户端报错
  8. 检查系统资源
  9. 检查依赖服务(DB、Redis 等)
  10. 检查配置、权限、证书
  11. 最近变更排查
  12. 找到根因并复现验证
  13. 给出修复方案
  14. 防止复发措施(补监控、补告警、补文档)
  • 使用调试工具 (gdb, strace, tcpdump等)
  • 查阅文档 (官方文档,社区论坛等)
  • 寻求帮助 (同事,技术支持,社区等)