不能证伪的假设只是瞎猜
一句话总结
调试不是创造一个可能的东西,而是删除所有可能的原因,直到只剩下一个原因为止,要删除的话,必须事先确定错误时会看到什么。
为什么需要这个?
不能诊断“有时很慢”。只能诊断测量值。因此,在收到客户的意见后,第一个工作不是找出原因,而是将症状固定在一个命令中。
# 20회 반복해 실패율을 잰다
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8001/quote
done | sort | uniq -c
如果20次中有5次失败,那么障碍将从听到的故事中转换为数字。然后,这个命令将被重新使用为在以后的所有阶段判断是否修复的标准。要说修复了,必须用同样的标准重新写,然后得到0。
无法重现也是信息。意味着只有在特定用户、特定时间段、特定路径上才会出现,问题也就缩小了。
怎么行动
一旦数字进入你的手中,接下来就是假设。但是,大多数人在这里所说的假设并不是假设。
“这似乎是一个网络问题”并不是假设。因为在错误时不会确定会看到什么,所以无论出现什么结果,这句话都会幸存下来。幸存下来的猜测不会缩小候选人范围。
可以使用的假设是三行。
가설: 요청이 게이트웨이와 애플리케이션 사이에서 끊긴다
맞다면: 게이트웨이 로그에 5초 타임아웃, 앱 로그에 해당 요청 아이디 없음
틀리면: 앱 로그에 요청이 들어와 있고 처리 중 실패한 흔적이 있음
差异在后面的两行。有指定要确认的东西,如果和预期不一样的话,假设就会被淘汰。只有被淘汰的假设才能缩小候选人范围。
写三行需要1分钟。虽然这1分钟看起来很浪费,但如果不写的话,30分钟后你会再次确认你已经排除的东西。在多人参与的情况下,效果更大。如果排除列表没有共享,三个人会重复确认同样的事情三次。
在现场相遇的样子
缩小假设的最可靠步骤是将层次减少一半。按顺序写下请求通过的层次——客户端、DNS、负载平衡器、网关、应用程序、缓存、数据库、外部连接——准确地选中中间部分,问“到这里为止正常吗”。
按顺序扫八层的话,平均要看四遍,如果切成一半的话,三遍内就能完成。如果楼层增加到二十层的话,差距就会变成十倍到五倍。因为在实际障碍中,一次确认需要几分钟,所以这个差距就是恢复时间。
这里的关键是选择可以判断正常与否的点。如果在无法判断的点上切割,就无法切割一半。层次分离的目的不是得到正确答案,而是确定不需要看的地方。
有一个例外。在服务现在死掉的时候,比起诊断,缓解更重要。恢复原状或重新分配流量停止出血后再缩小范围。把假设写得漂亮是用户不等的时候要做的。
用句子写假设的形式
脑海中猜测和可以验证的假设的区别是可以用句子写出来吗。
❌ "DB 가 느린 것 같다"
→ 무엇을 확인하면 아닌 줄 알 수 있나? 정해져 있지 않다
✅ "결제 API 의 p95 지연 3초 중 2초 이상이 orders 테이블 조회에서 난다."
확인 방법: 그 구간에 타이머를 넣고 100건을 재본다
반증 조건: 조회가 200ms 이하면 이 가설은 틀렸다
首先写出反证条件是核心。如果没有那个,无论出什么结果 转而说“可能这样”,调查并没有结束。
一次只换一个
同时换很多个的话,不知道什么有效果。而且一般一个 变好的一会变坏的一会,相互抵消。
❌ 인덱스 추가 + 커넥션 풀 확대 + 캐시 도입 → 20% 좋아짐
무엇 때문인가? 셋 중 하나는 오히려 해로웠을 수도 있다
✅ 인덱스 추가만 → 측정 → 되돌림 → 커넥션 풀만 → 측정 …
如果没有时间要一起放很多个的话,至少要分开,以便可以退回去。 用commit保存。以后可以逐个删除后确认。
使测量能够被信任
在同样的条件下,看看三次库存波动幅度。比这小的改善不是改善。
전: 2.9s, 3.1s, 3.0s → 폭 0.2s
후: 2.8s, 2.9s, 2.85s → 폭 0.1s, 평균 0.15s 개선
→ 흔들림과 개선폭이 비슷하다. 아직 결론을 낼 수 없다
然后确认测量本身是否改变了对象。打开日志后重新登录后日志 让它变慢,如果加上分析师,分析师的费用就会增加。如果可能的话 在与生产相同的条件下,如果没有的话,将记录下差异。
结束调查的条件
假设验证必须有结束。三个中一个就结束了。
- 确定了原因,并通过反馈进行了确认——最好的结局。
- 症状消失了,知道为什么消失了——在难以反弹确认的情况下。
- 到此为止已经确认了,再卖的费用比收益大——这也是合理的结束。 但是,必须写下看了到哪里,下一个人才能在那里继续。
如果不承认第3次,调查就会增加几天。如果有缓解措施,并且复发很少的话 停止是正确的判断的时候很多。
下次实习要做的事情
针对收到“有时不行”的举报的报价API,将失败率固定为数字,将三行假设作为文件,将排除的层次与依据一起记录后,再次以同样的标准确认重新计算的比率是否稳定。