经验¶
什么时候看这一节:出现了从没见过的故障,或者刚刚花了几小时排掉一个坑,想知道别人是不是踩过。
一、这一节放什么¶
一个坑一篇,放真实发生过、并且已经查清原因的问题。
和技术类页面里的「常见问题」分开:
- 参考页的常见问题 = 已知的、有标准答案的现象(「连不上怎么办」)。
- 经验 = 当时不知道怎么办、花了不少时间才查清的问题。价值在为什么当初没想到。
二、跨案例的通用判断¶
下面的判断不针对某一次故障,动手前对照一遍。具体案例见各篇复盘。
排查¶
- 先确认现象,再动手改。 现象要能写成一句别人看得懂的话,写出这句话的过程往往就排除大半猜测。
- 一次只改一个变量。 同时改三处,好了不知道哪处起的作用,坏了也不知道哪处导致的。
- 从最近的变化开始怀疑。 「昨天还好、今天不行」多半和最近一次部署、配置变更、证书到期、磁盘写满有关。
- 报错贴原文。
Connection refused与Connection timed out是两种故障,转述会丢掉关键字。
改动¶
- 提交小而完整。 一次提交只做一件事,出问题时能精确回退。
- 提交信息写「为什么」。 代码本身说明「做了什么」,半年后看得懂的是动机。
- 配置进版本库。 只在自己机器上能跑的配置等于不存在。
- 改动要能回滚。 做不到回滚的改动要么拆小,要么等到有维护窗口再做。
- 别在真实服务上直接试。 拿不准的操作先在测试环境或副本上做。
日志¶
- 日志在故障之前写好。 出事之后才加日志,这次故障注定查不清。
- 日志要能回答谁、在哪、做了什么、结果如何。 缺一项就只能证明「出过事」。
- 不记敏感信息。 凭据、token、内网地址不进日志,公开仓库尤其严格。
- 区分预期内的失败与异常失败。 用户输错密码记普通日志,数据库连不上才告警。
工具¶
- 重复超过三次的操作写成脚本。 手做的代价是慢,且每次做得都不完全一样。
- 让错误做法变得不方便。 与其在文档里写「记得备份」,不如让流程默认备份。
- 先跑起来,再跑对,最后跑快。 没有测量数据的优化会把结构改复杂。
- 正则查着写、用小样本验。 优先用明确量词,避免
.*与嵌套量词;换语言要重验一遍。
三、为什么值得写¶
一个部门最贵的成本,是同一个问题被不同的人各踩一次。
坑的经验有个特性:它天然只存在当事人脑子里。文档有人写,坑没人愿意写——写坑等于承认自己卡住过,过程往往也不体面(试了一堆错方向)。
所以这一节的写作要求里有一条:必须写「当时试过什么、为什么不对」。这两点才是别人真正用得上的东西。只写「最后加了个互斥锁」没有任何教育意义。
四、全部经验¶
| 名称 | 一句话 | 难度 | 状态 | 更新 |
|---|---|---|---|---|
| WebDAV 同步失败误判为 WAF 拦截 | 用剪贴板工具 TieZ 的 WebDAV 同步做跨设备剪贴板,其他方法都正常,只有 MOVE … | — | 可用 | 2026-10-14 |
| 双启动器竞争导致服务卡死 | 共享知识库服务在 13:20 突然不可用。去看机器: | — | 可用 | 2026-10-09 |
| 服务进程脱离任务托管 | 一个常驻服务,手动在终端里启动之后运行正常,当天下午突然消失。 | — | 可用 | 2026-10-09 |
| 端口占用导致同域名本机访问 404 | 一个已经通过组网暴露的内部 Web 服务,出现了本机访问不到、但别的设备访问正常的怪现象: | — | 可用 | 2026-10-09 |
五、写一篇的要求¶
每篇按「现象 / 环境 / 原因 / 解决 / 验证 / 经验」六节写,其中三条是硬要求:
- 现象要能被人认出来:写症状,不写结论,并贴出可以原样搜索的报错原文。转述过的报错搜不到。
- 原因要写到根因:连着问三次「为什么」。只写到第二层,结论就会是「下次小心点」;写到第三层,才能变成「加一把锁」。
- 经验要能迁移:写判断规则,让读者遇到长得完全不一样的新问题时也能用上。
六、外部材料¶
系统补工程基础的公开材料,另见 补工程基础可以从这些公开材料开始。