LabHub
学习 学习路径 课程

调试实战

把「很慢」这一句话变成四个数字

在 LabHub 中继续学习

目标

从“最近系统很慢”这一句话出发,用数字回答什么 · 从何时开始 · 慢多少 · 是否一直如此这四个问题。完成后,将调查对象缩小到一个版本。

环境

/opt/data/app.jsonl 中有 340 个请求,每行一条记录。

{"ts": "2026-08-19T00:00:27Z", "level": "info", "service": "payment",
 "request_id": "req-0163", "path": "/api/pay", "status": 200,
 "latency_ms": 120, "msg": "ok"}

/opt/data/deploy.log 中记录了同一天的部署和回滚历史。 环境中已有 jqawk,无需安装新工具。

手工计算百分位数的方法

排序后选择相应位置即可。样本为 100 条时,p95 就是第 95 个值。

jq -r 'select(.path=="/login") | .latency_ms' /opt/data/app.jsonl   | sort -n | awk '{v[NR]=$1} END {print v[int(NR*0.95)]}'

要创建的文件

全部位于 /root/slow/ 下。

by_path.txt   경로별 p95 — 전부가 느린 게 아니라는 증거
normal.txt    정상 경로의 기준선
when.txt      시간대별로 자른 결과
cause.txt     그 시각에 무슨 일이 있었나
delta.txt     문제 구간과 정상 구간을 나란히
shape.txt     평균 · p50 · p95 로 본 분포의 모양
errors.txt    같은 창에서 오류도 올랐는가
report.md     네 질문에 답한 한 장

步骤

  1. 分别计算各路径的 p95,将五条路径并列展示。
  2. 将正常路径的 p95 写为基线。没有比较对象,就无法证明“慢”。
  3. 只选择慢路径,按时间切分。将多个时间段并列展示。
  4. 对照该时刻 deploy.log 中发生的事情。还要找出窗口关闭的原因—— 这是相关关系的另一半。
  5. 并列写出问题区间和正常区间的 p50,并注明相差多少倍
  6. 同时列出平均值、p50 和 p95,判断是一直发生还是偶尔发生。
  7. 统计同一窗口内 5xx 是否也增加。将两个区间的数量一起写出。
  8. 用一页报告回答四个问题,并写明下一步行动。

参考

第 1 步完成后,调查已经完成一半。所有路径都慢的情况很少。 如果不按路径 拆分而只看整体平均值,会得到 1,380ms,但该数值并不代表任何一条路径。

所有路径都慢吗

分别计算各路径的 p95,将五条路径并列展示。

分别计算每条路径的 p95。将五个值并列后,会看到只有一个值的位数不同。先通过 jq -r '.path' 提取路径列表。

正常值是多少

将正常路径的 p95 写为基线。没有比较对象,就无法证明“慢”。

排除慢路径后,其余路径就是基线。如果四条路径的值相近,那就是该系统的正常水平。

从什么时候开始

只选择慢路径,按时间切分。将多个时间段并列展示。

只选择慢路径,按 ts 的小时部分分组。使用 .ts[11:13] 即可只得到小时。必须并列多个时间段,才能看出从哪里开始突增。

当时发生了什么

对照该时刻 deploy.log 中发生的事情。还要找出窗口关闭的原因—— 这是相关关系的另一半。

按该时间段筛选 /opt/data/deploy.log。不要只找部署,还要找回滚记录——窗口关闭的时间与窗口打开的时间同样重要。

慢了多少

并列写出问题区间和正常区间的 p50,并注明相差多少倍

使用相同方法分别测量窗口内外的 p50,放在一起并写明相差多少倍。差 10 倍还是 10%,决定了问题的性质。

一直如此还是偶尔发生

同时列出平均值、p50 和 p95,判断是一直发生还是偶尔发生。

同时列出平均值、p50 和 p95。整体平均值会得到一个不属于任何路径的数,这正是不能迷信平均值的原因。

错误是否也同时增加

统计同一窗口内 5xx 是否也增加。将两个区间的数量一起写出。

只看延迟而不统计状态码,只能看到一半原因。将窗口内外的 5xx 数量一起写出——其中一侧为 0 的事实能够确认该窗口。

用一页回答四个问题

用一页报告回答四个问题,并写明下一步行动。

报告供非工程人员阅读。回答什么、从何时开始、慢多少、是否一直如此,并以怀疑对象和下一步行动结束。