핵심 한 줄
카오스 엔지니어링의 흔한 함정은 “망가뜨리기”에서 끝나는 것이다. 이 벤치의 목표는 다르다 — 12가지 장애를, 각각 다른 장애는 못 내는 단 하나의 신호로 구별 가능하게 만드는 것. “느려요”라는 같은 증상 뒤의 진짜 원인을, 추측이 아니라 한 줄의 메트릭으로 가른다.
시리즈 — 장애를 '구별 가능'하게 만든 카오스 벤치
1. 문제 — “느려요”는 진단이 아니다
운영 중 가장 흔한 알림은 p99 latency↑ 한 줄이다. 그런데 이 한 줄 뒤에는 락 경합, GC 폭주, N+1 쿼리, 커넥션풀 고갈, CPU 스로틀, 캐시 스탬피드… 십수 가지 원인이 같은 얼굴로 숨어 있다. 증상은 같고 처방은 전부 다르다.
대부분의 카오스 도구는 여기서 멈춘다. 장애를 주입은 하지만, 그 장애가 다른 장애와 어떻게 구별되는지는 사람의 직관에 맡긴다. 직관은 인시던트 한복판에서 가장 먼저 무너진다.
증상으로는 못 가른다
“BLOCKED 스레드가 많다”는 락 경합일 수도, 데드락일 수도 있다. “p99가 튀었다”는 위 십수 원인 중 무엇이든 될 수 있다. 증상의 크기가 아니라 다른 축의 신호가 원인을 가른다.
2. 논제 — 각 장애에 ‘판별 신호’를 설계한다
이 벤치의 한 줄 논제는 이것이다.
장애를 주입할 때, 그 장애만 내고 다른 장애는 못 내는 단 하나의 신호(discriminator) 를 함께 만든다.
락 경합을 예로 들면 — BLOCKED 스레드 수가 치솟는 건 데드락도 마찬가지다. 그래서 BLOCKED만 봐선 못 가른다. 하지만 데드락 탐지기가 0이면(사이클 없음) 그건 데드락이 아니라 경합이다. blocked↑ AND deadlocked=0 — 이 조합이 락 경합의 판별 신호다. 데드락은 이 신호를 못 낸다.
각 편은 이 한 패턴을 반복한다:
- 무엇을 망가뜨렸나 — 결함을 코드 seam으로 주입(profile-gated, 평소 빌드엔 영향 0)
- 증상 — 어떤 메트릭이 뜨나 (대개 look-alike와 똑같다)
- 추적 — 무엇과 헷갈리나 (the look-alike)
- 판별 신호 — 다른 원인은 못 내는 단 하나의 메트릭
- 교훈 — 그 신호가 왜 축을 가르나
3. 12주의 지도
| 주 | 장애 | 판별 신호(한 줄) |
|---|---|---|
| W1 | Class A NPE + 관측 토대 | app 프레임 + 그 줄의 최근 커밋 (유일하게 자동 패치 가능) |
| W2 | 지연·에러비율 | 아무것도 안 던짐 → 증상이지 원인 아님 |
| W3 | 침묵의 오염 | 결과 ≠ 스펙/오라클 (코드·로그엔 안 보임) |
| W4 | 오진 함정 | Caused by 최심부 / async / framework-only |
| W5 | 느린 쿼리 | EXPLAIN 풀스캔 → 인덱스 부재 (Class B) |
| W6 | 커넥션풀 고갈 | connection-timeout↑ + active=max |
| W7 | CPU 스로틀 | CFS throttled 비율↑ (노드 CPU 무관) |
| W8 | 큐 백프레셔 | Kafka consumer lag↑ |
| W9 | GC 폭주 | GC pause time rate↑ |
| W10 | 락 경합 | blocked↑ AND deadlocked=0 |
| W11 | N+1 쿼리 | 요청당 쿼리 수 = 1+N |
| W12 | 캐시 스탬피드 | 동시 재계산 수↑ (요청 간 중복) |
W1W4는 진단의 인식론을 세운다(언제 스택트레이스가 원인이고, 언제 증상이고, 언제 침묵하나). W5W12는 지연 패밀리를 하나씩 갈라낸다 — 전부 p99↑로 도착하지만 각자 다른 축의 신호를 낸다.
4. 왜 이렇게까지 — 자동 진단으로 잇기
판별 신호를 설계해 두면, 진단을 사람이 아니라 도구가 할 수 있다. 이 신호들을 소비하는 쪽이 장애대응 오케스트레이터 시리즈다: 증상 알림 → differential → 판별 신호 매치 → 원인 확정. 벤치가 신호를 공급하고, 오케스트레이터가 소비한다.
즉 이 시리즈는 “장애를 어떻게 만드나”가 아니라 “장애를 어떻게 식별 가능하게 만드나” 에 대한 기록이다.
5. 교훈
증상이 아니라 '구별 신호'를 설계하라
카오스의 가치는 망가뜨리는 데 있지 않다. 다른 원인은 못 내는 단 하나의 신호를 각 장애마다 만들어 두는 데 있다. 그 신호가 있으면 “느려요” 한 줄이 추측이 아니라 진단이 된다.
관련 글
- 10.다 멈췄는데 데드락은 아니다 — 이 논제의 대표 사례(락 경합 vs 데드락)
- 2.장애 도구가 장애에 죽지 않게 — 이 신호들을 소비하는 자동 진단 파이프