디버깅 실전 · 느리다는 신고 좁히기 · 실습
느려요 한 줄을 네 개의 숫자로
목표
"요즘 시스템이 느려요" 한 줄에서 시작해, **무엇이 · 언제부터 · 얼마나 ·
항상인가** 네 질문에 숫자로 답합니다. 끝나면 조사 대상이 버전 하나로 좁습니다.
환경
/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 네 질문에 답한 한 장단계
1. 경로별로 p95 를 내서 다섯 경로를 나란히 놓습니다.
2. 정상 경로들의 p95 를 기준선으로 적습니다. 비교 대상이 없으면 "느리다" 는
증명되지 않습니다.
3. 느린 경로만 골라 시각으로 잘라 봅니다. 여러 시간대를 나란히 놓으세요.
4. 그 시각에 deploy.log 에 무엇이 있었는지 대조합니다. 창이 닫힌 이유도
함께 찾으세요 — 그것이 상관관계의 나머지 절반입니다.
5. 문제 구간과 정상 구간의 p50 을 나란히 적고 몇 배인지 씁니다.
6. 평균 · p50 · p95 를 함께 놓고 항상인지 가끔인지 판정합니다.
7. 같은 창에서 5xx 도 올랐는지 셉니다. 두 구간의 건수를 함께 적으세요.
8. 네 질문에 답한 보고서를 한 장으로 씁니다. 다음 한 걸음까지.
참고
1단계에서 이미 절반이 끝납니다. 전부가 느린 경우는 드뭅니다. 경로를
나누지 않고 전체 평균만 보면 1,380ms 가 나오는데, 그 숫자는 어느 경로에도
해당하지 않습니다.
단계 8개
- 전부가 느린가
- 정상은 얼마인가
- 언제부터인가
- 그 시각에 무슨 일이 있었나
- 얼마나 느린가
- 항상인가 가끔인가
- 오류도 함께 올랐는가
- 네 질문에 답한 한 장