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 的"家常":

  1. 客户异构老旧系统:老版本 OS、老数据库、缺少依赖。→ 先在隔离环境复现,别直接在客户生产上试。
  2. 封闭内网 / 无外网:装不了包、拉不了模型。→ 提前准备离线安装包、私有镜像仓库、离线模型文件。
  3. 权限受限:你只有只读、不能 root、不能装软件。→ 提前要权限;用最小破坏的方式(容器、非 root、用户态)做;把"需要什么权限"列成清单一次要全。
  4. 多供应商/集成商边界:问题可能出在"别人负责的环节"。→ 三方对齐责任边界,用日志和证据说话,不互相甩锅。

关键动作:

  • 复现不了 = 没定位:先把"稳定复现"做出来。
  • 权限不足就问、要清单、留痕(也让客户安全团队认可你的边界感)。
  • 环境差异大:把"客户环境 vs 我测试环境"的差异逐项核对(OS、Python 版本、依赖、字符集、时区)。

10.5 故障复盘:根因分析、Runbook、预防

10.5.1 复盘五问(不甩锅,找系统原因)

  1. 为什么会发生?(触发)
  2. 为什么没早点发现?(监控/告警缺失)
  3. 为什么定位这么久?(可观测性、文档、权限)
  4. 怎么修复的?(当时)
  5. 怎么防止再发生?(流程 / 代码 / 监控 / 文档)

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 模块练习

  1. 用一个"AI 答不了"的案例走一遍五步法:写出你的现象、证据、缩小范围过程、假设与验证。
  2. 用 curl -v 完整排查一次"访问 /api 返回 502",判断是哪一层。
  3. 造一个"封闭内网装不了依赖"的场景,写出离线部署方案(离线轮子、私有仓库、离线模型)。
  4. 写一份你自己的 Runbook 模板(选你上次踩过的坑),含触发、排查步骤、预防。
  5. 复盘一次真实失败:用 10.5.1 五问写复盘,重点写"怎么防止再发生"。

10.7 本章面试题

  1. "客户说 AI 系统突然全挂,你先做什么?" → 答:先止血恢复服务(回滚/重启到已知好版本、临时降级),同时留证保存日志;客户能用后再复现、定位根因、修复、复盘预防。不先深挖根因让客户一直坏着。
  2. "你怎么快速缩小一个跨栈问题?" → 答:二分法按层切——网络→权限→存储→容器→模型→数据库→代码,一层层排除;配合 request_id 串起全链路日志。一次只改一个变量验证。
  3. "客户环境权限不够、不能安装,怎么调试?" → 答:尽量用户态/容器/非 root 运行;提前要权限清单一次要全并留痕;在隔离环境复现;用日志和证据对齐;不破坏客户生产环境、讲清楚边界。
  4. "复现不了问题你怎么定位?" → 答:没复现就没定位。先尽量构造复现(真实数据、同环境、插桩日志);无法复现就靠更细日志/监控/链路去推断最可能环节,给出临时规避方案并持续观察。
  5. "故障复盘的重点是追责还是防复发?" → 答:防复发。聚焦系统原因(触发、为何没早发现、为何定位久、如何防止再发生),产出 runbook 和监控/流程改进,而不是追哪个人的责任。

10.8 小结

  • 先恢复,再根因;止血 → 留证 → 复现 → 根因 → 修复 → 预防。
  • 五步法 + 二分缩小范围 + 一次改一个变量。
  • 跨栈按层查,request_id 串全链路。
  • 复杂环境(老系统/内网/限权):复现优先、离线部署、权限要全、对齐边界。
  • 复盘重在防复发,产出 runbook。
  • 下一章:软技能——沟通、风险、ownership,FDE 区分度所在。

延伸阅读 · 去本站教学页补齐基础

  • Linux 系统——在这里补系统排查命令(top/df/ss/tail/dmesg),救火时手上得有家伙
  • Java EE 核心——在这里补 404/500 等 HTTP 状态码含义与定位思路
  • 数据库——在这里补慢查询定位、连接数与锁等待的排查方法
本页由 FDE 培养课程文档生成,完整课程见 FDE 培养 · 课程总览。