故障排查思路
故障排查 = 现象确认 -> 快速定位 -> 层层排除 -> 根因分析 -> 防止复发
扩展:4 个大阶段 + 18 个模块。
- 是否稳定复现?是否有概率性?
- 单用户 vs 多用户?
- 某个接口 vs 全站?
- 某组件 vs 整个集群?
核心:确保不是误报
包含你列的内容,并系统化扩展。
检查:
- 主进程是否存在?(ps、systemctl、docker ps、kubectl)
- 是否频繁重启?(Pod restartCount)
- 线程数是否异常?
- 程序是否挂死(无响应但未退出)
- 连接池是否耗尽(数据库/redis)
工具:
ps -ef
systemctl status xxx
docker logs
kubectl describe pod
kubectl logs
检查:
- Pod 是否 Pending / CrashLoopBackOff / OOMKilled
- 节点是否 NotReady
- 服务发现是否正常(DNS/CoreDNS)
- 负载均衡是否正确转发
- 配置是否一致
- 依赖服务是否可用(DB、Cache、消息队列等)
工具:
kubectl get pod -A
kubectl describe node
kubectl get event --sort-by='.lastTimestamp'
检查:
- 监听端口是否存在(netstat、ss)
- 服务是否真正 listening 而不是 TIME_WAIT
- 外部访问是否被防火墙阻断
- NAT 转发是否正常
工具:
ss -lntp
curl -v
telnet
iptables -L -n
三类日志必须检查:
- 应用日志(error/exception/stack)
- 系统日志(dmesg、journalctl)
- 中间件日志(Nginx、Redis、MySQL、Kafka)
关键点:
- 是否 OOM
- 是否段错误
- 是否超时 or 连接拒绝
- 是否资源不足(too many open files)
- 是否权限问题(permission denied)
关注:
- HTTP 状态码(4xx、5xx)
- 超时 vs 直接报错
- 客户端 DNS 是否正常
- API 是否限流、节流
- Token / 权限问题
客户端日志位置:
- 浏览器:F12 Network
- App:调用链路日志
- SDK:异常堆栈
关注:
- 系统整体 CPU是否 100%?
- 某个进程是否占满?
- 内核态占比是否异常?
- run queue 是否过高?
工具:
top / htop
pidstat -u 1
mpstat -P ALL 1
问题判断:
- CPU 高:可能是循环、死锁、频繁 GC
- CPU 低但程序卡住:可能是锁争用、IO 等待
关注:
- OOM 发生了吗?
- resident memory 是否持续增长(内存泄漏)
- 程序是否 cache 过大
- swap 是否被使用(swap = 性能灾难)
工具:
free -m
top
dmesg | grep -i oom
判断:
- 内存明显泄漏 -> 看应用层
- cache 太高 -> 正常,无需 panic
- swap 频繁 -> 会导致延迟升高几百倍
两个维度:
- 是否被日志占满(/var/log)
- 是否 df 已满(100% 会导致任何写入失败)
df -h
du -sh /var/log/*
- IOPS、IO wait 是否过高?
iostat -x 1
dstat -d
IO 高 -> 数据库慢、写日志慢、应用阻塞
关注:
- DNS 是否正常解析
- 是否丢包
- 是否延迟高
- 是否出口带宽打满
- 是否有 SYN 洪水
工具:
ping、mtr、traceroute
iftop、iptraf
ss -s
tcpdump
curl -I
判断:
- 丢包 -> 网络抖动 or 用户端 WiFi
- RT 延迟高 -> 上游网络波动
- iftop 显示带宽满 -> 限流 or 升级带宽
- SYN Recv 多 -> 被攻击
检查:
- 是否连接数满?
- 是否锁等待?
- 慢 SQL 是否暴增?
- 主从延迟?
- 存储空间?
工具:
show processlist
pg_stat_activity
explain
慢查询日志
重点:
- 是否内存不足?
- 是否被驱逐?
- 是否阻塞命令?
- 集群槽位是否迁移异常?
重点:
- 堆积?(lag)
- broker 是否挂掉?
- partition 是否均衡?
- 消费者异常退出?
检查:
- upstream 健康检查是否失败
- timeout 是否过低
- 502/504 是否由上游导致
- 限流 / 黑名单 是否生效
关注:
- 是否只有一个节点在工作?
- 权重配置错误?
- 健康检查失败?
检查:
- 解析记录是否错误?
- 是否缓存旧 IP?(客户端)
- 是否攻击导致 DNS 超时?
工具:
dig
nslookup
关注:
- 最近是否发布、变更过?
- ConfigMap 是否同步?
- 环境变量是否缺失?
- 配置是否多环境混用?
- Linux 文件权限
- 数据库权限
- Token 过期
- TLS/SSL 证书过期
- 容器 securityContext 问题
- 复现问题(确认)
- 看监控(CPU/内存/IO/网络)
- 看程序是否在正常运行
- 看集群状态
- 看端口与连通性
- 看日志(应用 + 系统 + 中间件)
- 看客户端报错
- 检查系统资源
- 检查依赖服务(DB、Redis 等)
- 检查配置、权限、证书
- 最近变更排查
- 找到根因并复现验证
- 给出修复方案
- 防止复发措施(补监控、补告警、补文档)
- 使用调试工具 (gdb, strace, tcpdump等)
- 查阅文档 (官方文档,社区论坛等)
- 寻求帮助 (同事,技术支持,社区等)