핵심 한 줄
14편에서 취소당 커밋을 6→4로 줄였다. 이론은 “처리량 ∝ 1/커밋”이니 ×1.5가 나와야 한다. 같은 AWS 판에서 재측정 — rps 147 → 220 (+50%), 정확히 6/4배. general_log로 커밋 4.0/취소 확정, p95 2.52s→1.67s, 취소 성공률 100%. 추론이 아니라 재측정으로 증명했다. 이걸로 2막의 루프가 닫힌다: 관측→규명→수정→재측정.
시리즈 — 부하가 드러낸 설계
1. 예측을 먼저 적는다
측정 전에 숫자를 박아두는 게 정직하다. 13편의 인과 사슬:
커밋이 6→4면 점유가 그만큼 짧아져, 처리량은 6/4 = ×1.5. 베이스라인 147이면 ≈220rps를 기대한다. 안 나오면 인과가 틀린 거다. (왜 커밋=fsync이고 점유를 지배하는지의 DB 내부 → InnoDB 내구성 — 커밋은 왜 비싼가.)
2. 공정하게 재는 법
델타를 오염시키지 않는 게 관건이다. 13편 베이스라인과 토글을 똑같이 맞췄다.
확증 런에서 OTel은 껐다
“변경 후 계측 강화”라며 APM을 켜고 싶었지만, agent 계측은 오버헤드가 있어 rps에 노이즈를 준다. 147 베이스라인이 OTel OFF였으니, 공정 비교엔 이번도 OFF. 그리고 커밋 수는 OTel 스팬이 아니라 general_log가 정답이다 — COMMIT은 JDBC 스팬에 깔끔히 안 잡힌다. 관측 도구도 목적에 맞게 골라 써야 한다.
같은 인스턴스 사이즈, 같은 100k 시딩, tomcat 지표만 ON, 쿼리카운트·OTel OFF, stress 스윕(50→400 VU).
3. 결과
| 지표 | 베이스라인 (커밋 6) | 확증 (커밋 4) |
|---|---|---|
| rps | 147 | 220 (+50%) |
| p95 | 2.52s | 1.67s |
| payment CPU | 38% | 42% |
| Hikari pending | 190 | 189 |
| mysql CPU | 62% | 71% |
| 취소 성공률 | 100% | 100% |
147 × 1.5 = 220.5 ≈ 관측 220. 처리량이 커밋 수에 반비례함이 소수점까지 맞았다.
그리고 general_log로 못을 박았다 — 신규 취소 20건에 COMMIT 80회 = 4.0/취소. 이력 INSERT는 60회(=3건/취소) 그대로인데 커밋만 3→1. 감사 3건 보존, 커밋 2개 절감이 실제 DB 로그로 확인됐다.
4. 벽은 그대로, 벽까지가 1.5배
재밌는 건 Hikari pending이 여전히 189라는 것. 풀은 아직도 벽이다 — 근데 각 커넥션을 덜 오래 쥐니(커밋 2개↓), 같은 풀 10으로 더 많이 흘려보낸다. mysql CPU가 62→71%로 오른 것도 그래서다: 병목이 안 풀린 게 아니라, 같은 병목을 통과하는 양이 늘었다.
measure first가 두 번 옳았다
13편에서 측정은 “동기 홉/풀 크기”라는 두 추측을 뒤집고 커밋을 지목했다. 여기서 측정은 그 수정이 정확히 예측대로 작동함을 확인했다. 추측으로 풀을 50까지 올렸다면, 2코어 DB를 스래싱시키며 아무것도 못 얻었을 것이다.
5. 3-뷰로 한 화면에
이번 런엔 관측도 정리했다 — Inbound(k6가 주는 부하)·App(TPS·지연·성공률)·Infra(CPU·Memory·Network·Disk 쓰기=fsync)를 한 대시보드 3행으로. 부하가 들어오고(Inbound), 앱이 처리하고(App), DB가 fsync하는(Infra) 사슬을 한눈에 본다.
flowchart LR IN["Inbound (k6)<br/>부하 = RPS·VU"] -->|"요청"| APP["App (서버측)<br/>TPS·지연·성공률"] APP -->|"커밋"| INFRA["Infra (node-exporter)<br/>CPU·Mem·Net·Disk쓰기=fsync"]
작은 교훈도 하나. k6를 remote-write로 물리니 실패율 지표명이 예상과 달랐다(_total이 아니라 _rate). 첫 런에서 실제 지표명을 확인하고 패널을 고쳤다 — 관측 자체도 실측으로 교정된다.
한 줄
2막은 추론을 관측으로 시작해서, 벽의 정체를 규명하고, 코드로 고쳐, 여기서 재측정으로 증명하고 닫힌다. 성능 개선은 가정이 아니라 147→220이라는 관측된 사실이었다. 다음 벽은 여전히 풀 — 근데 그건 그때 다시, 측정으로 연다.