FDE Training · Module 10
10
排障实战
模块 10 · 排障实战
本章目标:掌握 FDE 驻场最高频、最见功力的能力——在客户异构老系统、封闭内网、权限受限的环境里,把问题从"一堆现象"定位到"一个根因"。学会"有条理地救火",而不是瞎试。
10.1 排障的底层逻辑:先恢复,再根因
现场出事,第一原则:
先恢复服务,让客户能用;再深挖根因,防止复发。
别一上来就"我要把根因搞清楚",那会让客户一直处于"坏着"的状态。正确顺序:
1. 止血(恢复可用) → 2. 留证(保存日志/现场) → 3. 复现(稳定复现问题) → 4. 根因 → 5. 修复 → 6. 预防/文档
10.2 系统化排障五步法(背下来 / 直接套用)
① 明确现象 : "什么时间/哪个用户/哪个功能/什么报错",别接一个模糊的"挂了"
② 收集证据 : 日志(带request_id)、指标、链路、复现步骤
③ 缩小范围 : 二分——是不是网络?权限?数据?代码?模型?数据库?
④ 提出假设验证 : 一次只改一个变量,验证假设
⑤ 定位根因并修复: 修完复跑/验证,确认不复发,沉淀成 runbook
关键心法:
- 一次只改一个变量,否则你不知道是哪个改动把问题修好的。
- 先二分缩小范围:客户端 → 服务端 → 模型 → 数据 → 网络,一路"切两半"。
- 别带预设跳步骤:客户说是"AI 的问题"不一定真是模型问题,可能是数据/网络/权限。
10.3 跨栈问题定位:一层层查(清单式)
客户现场"AI 答不了/答错/卡死/慢",按层排查:
| 层 | 查什么 | 常用命令/动作 |
|---|---|---|
| 网络 | 通不通、代理、DNS、防火墙 | curl -v ping nslookup telnet traceroute |
| 权限/鉴权 | 登录、Token、RBAC、账号 | 看 401/403、日志中的身份、权限矩阵 |
| 存储 | 磁盘满、数据库连不上、对象存储 | df -h、连接测试、慢查询 |
| 容器/部署 | Pod 状态、OOM、镜像 | kubectl get/describe/logs |
| 模型推理 | GPU、显存、vLLM 日志、token | nvidia-smi、推理服务日志 |
| 数据库/向量库 | 慢查询、索引、向量搜索 | EXPLAIN、连接数、召回日志 |
| 应用代码 | 逻辑、异常、埋点 | 结构化日志、request_id、链路 |
贯穿核心:request_id 能把一次请求的每一步日志串起来,从入口一路看到模型调用,是最有效的跨栈定位工具。
附:两类高频问题的结构化定位清单
- HTTP 状态码定位思路:先一刀切——4xx 是“请求/客户端”的问题(401 未登录、403 无权限、404 路径不存在),重点看是谁在报、有没有权限、路径对不对;5xx 是“服务端”的问题(500 应用异常、502 网关拿不到后端、503 过载),重点看后端进程在不在、日志报什么错、有没有 OOM。分清 4xx/5xx 再进对应层深挖,别乱试。
- 慢查询定位步骤:① 先确认是不是数据库慢(对比“加缓存 / 直连库”的耗时差);② 开慢查询日志、抓慢 SQL;③ 用
EXPLAIN看执行计划:有没有走索引、扫了多少行;④ 针对性修:补索引、改写 SQL、拆大表;⑤ 修完压测复跑确认。细节去数据库页补齐。
10.4 复杂环境调试:异构老系统 / 封闭内网 / 权限受限
这些是 FDE 的"家常":
- 客户异构老旧系统:老版本 OS、老数据库、缺少依赖。→ 先在隔离环境复现,别直接在客户生产上试。
- 封闭内网 / 无外网:装不了包、拉不了模型。→ 提前准备离线安装包、私有镜像仓库、离线模型文件。
- 权限受限:你只有只读、不能 root、不能装软件。→ 提前要权限;用最小破坏的方式(容器、非 root、用户态)做;把"需要什么权限"列成清单一次要全。
- 多供应商/集成商边界:问题可能出在"别人负责的环节"。→ 三方对齐责任边界,用日志和证据说话,不互相甩锅。
关键动作:
- 复现不了 = 没定位:先把"稳定复现"做出来。
- 权限不足就问、要清单、留痕(也让客户安全团队认可你的边界感)。
- 环境差异大:把"客户环境 vs 我测试环境"的差异逐项核对(OS、Python 版本、依赖、字符集、时区)。
10.5 故障复盘:根因分析、Runbook、预防
10.5.1 复盘五问(不甩锅,找系统原因)
- 为什么会发生?(触发)
- 为什么没早点发现?(监控/告警缺失)
- 为什么定位这么久?(可观测性、文档、权限)
- 怎么修复的?(当时)
- 怎么防止再发生?(流程 / 代码 / 监控 / 文档)
10.5.2 沉淀 Runbook(面试 + 职场都加分)
把"套用性强的排障过程"写成固定步骤,下次照着走:
# Runbook: AI 服务 502 排查
触发: 全站 502 / Nginx 报 502 upstream connect error
排查步骤:
1. curl 后端服务2400直接访问是否 OK
├─ 不OK → 看后端日志(uvicorn/gunicorn) + 指标(内存/P95)
└─ OK → 看 Nginx 配置 / upstream 地址 / 负载均衡器
2. 若后端 OOM/重启 → 查 dmesg + 资源 limits + 并发 → 扩容或调限流
预防:
- NATIVE: 给后端加 livenessProbe + 资源 limits
- 监控: 添加错误率告警 (P0)
价值:一个"我排过这个坑"的 Runbook,能让团队下次 10 分钟解决,而不是 3 小时。也是面试讲"故障处理经验"的绝佳素材。
10.6 模块练习
- 用一个"AI 答不了"的案例走一遍五步法:写出你的现象、证据、缩小范围过程、假设与验证。
- 用
curl -v完整排查一次"访问 /api 返回 502",判断是哪一层。 - 造一个"封闭内网装不了依赖"的场景,写出离线部署方案(离线轮子、私有仓库、离线模型)。
- 写一份你自己的 Runbook 模板(选你上次踩过的坑),含触发、排查步骤、预防。
- 复盘一次真实失败:用 10.5.1 五问写复盘,重点写"怎么防止再发生"。
10.7 本章面试题
- "客户说 AI 系统突然全挂,你先做什么?" → 答:先止血恢复服务(回滚/重启到已知好版本、临时降级),同时留证保存日志;客户能用后再复现、定位根因、修复、复盘预防。不先深挖根因让客户一直坏着。
- "你怎么快速缩小一个跨栈问题?" → 答:二分法按层切——网络→权限→存储→容器→模型→数据库→代码,一层层排除;配合 request_id 串起全链路日志。一次只改一个变量验证。
- "客户环境权限不够、不能安装,怎么调试?" → 答:尽量用户态/容器/非 root 运行;提前要权限清单一次要全并留痕;在隔离环境复现;用日志和证据对齐;不破坏客户生产环境、讲清楚边界。
- "复现不了问题你怎么定位?" → 答:没复现就没定位。先尽量构造复现(真实数据、同环境、插桩日志);无法复现就靠更细日志/监控/链路去推断最可能环节,给出临时规避方案并持续观察。
- "故障复盘的重点是追责还是防复发?" → 答:防复发。聚焦系统原因(触发、为何没早发现、为何定位久、如何防止再发生),产出 runbook 和监控/流程改进,而不是追哪个人的责任。
10.8 小结
- 先恢复,再根因;止血 → 留证 → 复现 → 根因 → 修复 → 预防。
- 五步法 + 二分缩小范围 + 一次改一个变量。
- 跨栈按层查,request_id 串全链路。
- 复杂环境(老系统/内网/限权):复现优先、离线部署、权限要全、对齐边界。
- 复盘重在防复发,产出 runbook。
- 下一章:软技能——沟通、风险、ownership,FDE 区分度所在。
延伸阅读 · 去本站教学页补齐基础
- Linux 系统——在这里补系统排查命令(top/df/ss/tail/dmesg),救火时手上得有家伙
- Java EE 核心——在这里补 404/500 等 HTTP 状态码含义与定位思路
- 数据库——在这里补慢查询定位、连接数与锁等待的排查方法
本页由 FDE 培养课程文档生成,完整课程见 FDE 培养 · 课程总览。