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 가 나오는데, 그 숫자는 어느 경로에도
해당하지 않습니다.

단계 8개

  1. 전부가 느린가
  2. 정상은 얼마인가
  3. 언제부터인가
  4. 그 시각에 무슨 일이 있었나
  5. 얼마나 느린가
  6. 항상인가 가끔인가
  7. 오류도 함께 올랐는가
  8. 네 질문에 답한 한 장