留下什么,丢弃什么
한국어 원문으로 표시합니다.
목표
추적을 전부 저장하면 비용이 감당이 안 되고, 무작위로 줄이면 정작 보고 싶은 요청이 사라집니다. 이 둘 사이를 숫자로 정합니다.
재료
/opt/lab/trace/spans.jsonl 요청 1만 건 (지속 시간·상태·서비스)
mkdir -p /root/trace && cp /opt/lab/trace/* /root/trace/ && cd /root/trace
head -2 spans.jsonl
남길 것
01-shape.txt 분포와 오류 건수
02-head.txt 무작위 1% 가 남기는 것
03-tail.txt 오류·느린 것을 전부 남길 때
04-cost.txt 저장 비용
05-memory.txt 꼬리 표본의 숨은 비용
06-decide.md 우리가 쓸 규칙
07-notes.md 왜 그런지
먼저 분포를 본다
spans.jsonl 의 전체 건수 · p50 · p95 · p99 · 오류 건수를 구해 01-shape.txt 에 남기고, 이 분포의 모양을 한 줄 적으세요.
python3 - <<'PY'
import json
d = sorted(json.loads(l)['duration_ms'] for l in open('spans.jsonl'))
n = len(d)
print(n, d[n//2], d[int(n*0.95)], d[int(n*0.99)])
PY
평균은 이 분포에서 아무것도 말해 주지 않습니다. 대부분이 빠르고 소수가 아주 느린 모양이라, 평균은 그 둘 사이의 아무도 겪지 않는 값이 됩니다.
무작위 1% 는 무엇을 놓치나
전체에서 무작위로 1% 를 골라 그 표본에 p99 를 넘는 요청과 오류가 몇 개 남는지 02-head.txt 에 남기세요. 무작위 표본이 무엇을 놓치는지 적습니다.
import random; random.seed(7)
sample = random.sample(rows, len(rows)//100)
100건 안팎이 남고, 그중 p99 를 넘는 것은 한두 개일 겁니다.
장애 조사에서 필요한 것은 정확히 그 한두 개입니다. 무작위 표본은 흔한 것을 잘 남기고 드문 것을 잃습니다 — 그런데 우리가 보고 싶은 것은 늘 드문 쪽입니다.
끝난 뒤에 고른다
오류는 전부, p99 를 넘는 것도 전부, 나머지는 1% 로 골랐을 때 보관 건수가 얼마인지 03-tail.txt 에 남기고, 무작위 1% 와 견주어 몇 배인지 적으세요.
요청이 끝난 뒤에 판단하므로 꼬리 표본(tail sampling)이라고 부릅니다.
오류 129건 + p99 초과(오류가 아닌 것) + 나머지의 1% 를 더합니다. 300건 안팎이 나옵니다 — 무작위 1% 의 세 배쯤이지만, 보고 싶은 것은 하나도 안 잃었습니다.
표본 비율은 곧 비용이다
추적 하나가 4KB 라고 보고, 초당 1,000 요청·보존 30일 기준으로 (1) 전부 저장 (2) 무작위 1% (3) 꼬리 표본의 저장량을 계산해 04-cost.txt 에 남기세요.
초당 요청 수 × 86,400 × 보존 일수 × 건당 크기 × 표본 비율입니다.
전부 저장하면 하루에도 큰 숫자가 나옵니다. 이 계산을 먼저 해 보지 않고 "일단 다 켜자" 로 시작하면 다음 달 청구서에서 알게 됩니다.
꼬리 표본의 숨은 비용
꼬리 표본을 하려면 수집기가 무엇을 언제까지 들고 있어야 하는지와, 그때 필요한 메모리를 어림해 05-memory.txt 에 남기세요.
요청이 끝나야 느린지 오류인지 알 수 있습니다. 그래서 수집기는 그 요청의 모든 span 을 끝날 때까지 메모리에 들고 있어야 합니다.
필요한 메모리 ≈ 초당 요청 수 × 평균 소요 시간(초) × 건당 크기.
이 숫자가 크면 수집기를 여러 대로 나눠야 하는데, 그때는 같은 trace 의 span 이 같은 수집기로 가야 판단이 됩니다. 그것이 꼬리 표본 운영이 어려워지는 지점입니다.
규칙으로 적는다
우리 서비스에 쓸 표본 규칙을 06-decide.md 에 적으세요. 오류를 어떻게 다룰지 · 느린 것의 임계 · 나머지 비율을 숫자로 정하고, 각각의 이유를 함께 씁니다.
"적당히 샘플링한다" 는 규칙이 아닙니다. 다음 사람이 그대로 설정에 옮길 수 있어야 규칙입니다.
임계를 p99 로 잡을지 고정값(예: 1초)으로 잡을지도 정하세요. p99 는 서비스가 느려지면 함께 올라가므로, 느려지는 중에는 아무것도 안 걸릴 수 있습니다.
다음에 읽을 사람에게
여기서 본 것 중 넷 이상을 골라 07-notes.md 에 정리하세요. 무엇을 했는지가 아니라 왜 그런지를 적습니다.
표본 설정을 다시 만질 때의 자신이 읽는다고 생각하세요. "꼬리 표본을 골랐다" 는 도움이 안 되고, "무작위는 흔한 것을 잘 남기고 드문 것을 잃는데 우리가 보고 싶은 것은 늘 드문 쪽이다" 는 도움이 됩니다.