把「很慢」这一句话变成四个数字
目标
从“最近系统很慢”这一句话出发,用数字回答什么 · 从何时开始 · 慢多少 · 是否一直如此这四个问题。完成后,将调查对象缩小到一个版本。
环境
/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 中记录了同一天的部署和回滚历史。
环境中已有 jq 和 awk,无需安装新工具。
手工计算百分位数的方法
排序后选择相应位置即可。样本为 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 네 질문에 답한 한 장
步骤
- 分别计算各路径的 p95,将五条路径并列展示。
- 将正常路径的 p95 写为基线。没有比较对象,就无法证明“慢”。
- 只选择慢路径,按时间切分。将多个时间段并列展示。
- 对照该时刻
deploy.log中发生的事情。还要找出窗口关闭的原因—— 这是相关关系的另一半。 - 并列写出问题区间和正常区间的 p50,并注明相差多少倍。
- 同时列出平均值、p50 和 p95,判断是一直发生还是偶尔发生。
- 统计同一窗口内 5xx 是否也增加。将两个区间的数量一起写出。
- 用一页报告回答四个问题,并写明下一步行动。
参考
第 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 的事实能够确认该窗口。
用一页回答四个问题
用一页报告回答四个问题,并写明下一步行动。
报告供非工程人员阅读。回答什么、从何时开始、慢多少、是否一直如此,并以怀疑对象和下一步行动结束。