405 V1 limit analysis measured - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki
405 V1 ํ๊ณ ์ง์ โ ๋ถํํ ์คํธ ์ค์ธก ๋ถ์
์ํค [402 V2 ํธ๋ํฝ ์๋๋ฆฌ์ค ๊ธฐ๋ฐ V1 ํ๊ณ ์ง์ ๋ถ์]์ ์ธ ์๋๋ฆฌ์ค์ ๋ํด 2026-09-20 ์ค์ธก๊ฐ์ผ๋ก ๋ต์ ์ฑ์ด ๋ฌธ์๋ค. ๋ฌธ์ ๊ณจ๊ฒฉ์ 404, ์ธก์ ์ค๊ณ๋ 403์ ์๋ค.
๊ฐ ์ ์ ์์ธ ์์ด ๊ฐ์ ์ฌ์ฌ์ ๋ฐ๋ฅธ๋ค. ์๋น์ค ๋์ โ ์์ ํธ๋ํฝ โ ๋ถํ ํน์ฑ โ ์ ์ ์ธํ๋ผ ์์ โ ์ธก์ ์ค๊ณ โ ์ธก์ ๊ฒฐ๊ณผ โ ์ธํ๋ผ ๊ตฌ์ฑ ๋ณ๊ฒฝ.
0. ์์ฝ
0.1 ๊ฒฐ๋ก ์ธ ์ค
- V1์ ํ๊ณ๋ RPS๊ฐ ์๋๋ค. ๋จ์ ์กฐํ๋ ๋ชฉํ ํผํฌ(60.4 RPS)์ 10๋ฐฐ์ธ 641 RPS์์๋ p95 19.4 ms, ์ค๋ฅ 0%, CPU throttling 0์ด์๋ค.
- ํ๊ณ๋ ์ธ ๊ฐ์ ๊ณต์ ์์์ ์๋ค. WebSocket ๋์ ์ฐ๊ฒฐ ์ฝ 1,700๊ฐ(ํ์ฌ ๋ชฉํ 3,000์ 57%), HikariCP ๊ณต์ฉ ํ 10๊ฐ, ๋์ผ ํ ํ์ lock์ด๋ค.
- ์ธ ์์์ ๋ชจ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ์ฅ์ ๋ฅผ ์ ํํ๋ค. WS ์ฐ๊ฒฐ 2,100๊ฐ์์ ์ผ๋ฐ ์กฐํ p99๊ฐ 27๋ฐฐ, ์ฑํ ์ ์ฅ 47 msg/s์์ ์กฐํ p95๊ฐ 13.6๋ฐฐ, ์ธ๊ธฐ ํ ๋์ ์น์ธ 50๊ฑด์์ ์กฐํ p99๊ฐ 48๋ฐฐ ์ ํ๋๋ค.
0.2 ์ํค ์ธ ์๋๋ฆฌ์ค์ ๋ํ ํ์
| ์ํค ์๋๋ฆฌ์ค | ์๊ตฌ ์์ค | ์ค์ธก ๊ฒฐ๊ณผ | ํ์ |
|---|---|---|---|
| (1) ์ถํด๊ทผ ํ ํ์ ์กฐํ ์ฆ๊ฐ | ์กฐํ 60.4 RPS | 641 RPS๊น์ง p95 19.4 ms, ์ค๋ฅ 0% | ์ฌ์ ์์ |
| (1) ํผ์ก๋ DB ์ฐ๊ธฐ | 37.6 row ์ฐ๊ธฐ/s | ์ ์ฌ ๊ท๋ชจ(47 write/s)์์ ํ 10๊ฐ ํฌํ, ๋๊ธฐ 53๊ฑด | ์ํ (์ง์ ์ธก์ ์๋) |
| (2) ์ธ๊ธฐ ํ ์ข์ ๊ฒฝ์ | ์ธ๊ธฐ ํ ์ ๊ธ 1.05 RPS | ๋์ 20๊ฑด์์ ํ ๊ณ ๊ฐ, 50๊ฑด์์ ์คํจ์จ 59.5% | ๊ฐ์ ๋จ์๋ฅผ ๋ฐ๊ฟ์ผ ํจ |
| (3) ํ์ฌ WS ๋์ ์ฐ๊ฒฐ | ๋์ 3,000๊ฐ | ์ต๋ 1,734๊ฐ, ์ดํ handshake 30์ด ํ์์์ | ๋ชฉํ ๋ฏธ๋ฌ |
| (3) ํ์ฌ ์ ๊ท ์ฐ๊ฒฐ๋ฅ | 10 conn/s | 20 conn/s์์ handshake p95 33.5 ms | ์ฌ์ ์์ |
| (3) ํ์ฌ API ํผํฌ | 140 RPS | 641 RPS๊น์ง ์ฌ์ | ์ฌ์ ์์ |
| (3) ์ฑํ ๋ฉ์์ง ์ฆ๊ฐ | โ | 47 msg/s ์ ์ฅ์์ ์ผ๋ฐ ์กฐํ p95 13.6๋ฐฐ ์ ํ | ์ํ |
0.3 ์ต์ด ํฌํ ์์ ์์
| ์์ | ํฌํ ์์ | ์๊ณ๊ฐ | ๊ทผ๊ฑฐ RUN_ID | ๋ชฉํ ๋๋น |
|---|---|---|---|---|
| 1 | WebSocket ๋์ ์ฐ๊ฒฐ | ์ฝ 1,700๊ฐ | a-ramp3000, c3, d1, g |
3,000 ๋ชฉํ์ 57% |
| 2 | HikariCP ๊ณต์ฉ ํ (10) | ๋์ ์ฐ๊ธฐ 20๊ฑด / ์ ์ฅ 47 msg/s | e-same-c20, d1-save-h50 |
1.05 RPS ๊ฐ์ ์ ํต๊ณผ, ๋์์ฑ์ ์คํจ |
| 3 | ๋์ผ ํ row lock | ๋์ 50๊ฑด์์ ์คํจ์จ 59.5% | e-same-c50 |
โ |
| 4 | Nginx ์ฐ๊ฒฐ ์๋ฆฝ ์ฒ๋ฆฌ | 200 conn/s์์ p95 3.57์ด | b-rate200 |
10 conn/s ๋ชฉํ์ 20๋ฐฐ |
| 5 | Spring CPU quota (0.75) | 641 RPS์์๋ throttling 0 | f-light-700 |
60.4 RPS์ 10๋ฐฐ ์ด์ |
1. ์ธก์ ๊ฐ์
1.1 ๋์๊ณผ ํ๊ฒฝ
t3.medium(2 vCPU ยท 4 GiB) 1๋์ ์ปจํ ์ด๋ 4๊ฐ. ํฉ๊ณ๊ฐ ํธ์คํธ CPU๋ฅผ 100% ์์งํ๋๋ก ๋ฐฐ๋ถ๋์ด ์๋ค.
| ์ปจํ ์ด๋ | CPU | ๋ฉ๋ชจ๋ฆฌ | ์ด ๋ฌธ์์์ ์ค์ํ ์ค์ |
|---|---|---|---|
| Nginx | 0.25 | 128 MB | worker_processes 1, nofile 32768 |
| Next.js(placeholder) | 0.50 | 512 MB | ์์ 384 MB ์ ์ |
| Spring Boot | 0.75 | 768 MB | -Xmx512m, Tomcat threads 200 / max-connections 8192 |
| MySQL | 0.50 | 768 MB | buffer pool 384 MB |
- HikariCP ์ต๋ 10, ์ปค๋ฅ์
ํ๋ ํ์์์ 1,000 ms,
innodb_lock_wait_timeout3์ด - REST์ WebSocket์ด ๊ฐ์ Spring ์ปจํ ์ด๋์ CPUยทheapยทTomcatยทํ์ ๊ณต์ ํ๋ค
- ๋ถํ๋ ๋ก์ปฌ k6 โ ๊ณต๊ฐ HTTPS/WSS โ Nginx ๊ฒฝ์ . ๊ด์ธก์ Prometheus 5์ด scrape
1.2 ์คํ ๋ชฉ๋ก
31๊ฐ ์คํ, 2026-09-20 18:47~21:00. ๊ตฌ๊ฐ์ results/runs.tsv, ๊ตฌ๊ฐ๋ณ ์์
์ง๊ณ๋ results/derived-20260920T210124.csv.
| ๋ธ๋ก | ๋ชฉ์ | RUN_ID |
|---|---|---|
| a | ์ฐ๊ฒฐ๋น ์์ ๋จ๊ฐ | a-ramp3000 (0โ3,000 ๋จํ 12.5๋ถ) |
| b | ์ฐ๊ฒฐ ์๋์จ | b-rate20, b-rate100, b-rate200 |
| c | ๋ฉ์์ง ์ ํ 2ร2 | c1-200c-256b, c2-200c-8000b, c3-1800c-256b, c4-1800c-8000b |
| d | ์ฑํ ์ ์ฅ๊ณผ ํ ๊ฒฝํฉ | d0-rest-control, d1-save-h50, d2-save-h50-ws, d2-rest-treatment |
| e | ์ธ๊ธฐ ํ hot-row | e0-rest-control, e-same-c5/20/50/100, e-mix-c50, e-mix-rest, e-dist-c50 |
| f1c | WS๊ฐ REST์ ์ฃผ๋ ๊ฐ์ญ | f1c-rest-control, f1c-ws2100, f1c-rest-treatment |
| f | ์กฐํ RPS ๊ณ๋จ | f-light-50~700, f-detail-50~300 |
| g | ๋ฐ๋ณต ์ธก์ | g-c3-repeat |
1.3 ํ์ ๊ท์น๊ณผ ์ ๋ขฐ ๋ฒ์
- ์ธก์ ์ฐฝ์ ๋ธ๋ก๋น 75~150์ด, ๋ฐ๋ณต 1ํ๋ค.
g-c3-repeat์c3์ ์ฐจ์ด๊ฐ 8%(CPU 0.0357 vs 0.0388 cores)์์ผ๋ฏ๋ก, 30% ๋ฏธ๋ง์ ์ง์ฐ ์ฐจ์ด๋ ์ค์ฌ๋ก ์ธ์ ํ์ง ์๋๋ค. - ์ง์ฐยท์ค๋ฅ์จ์ k6 ํด๋ผ์ด์ธํธ ์ธก์ ๊ฐ์ ์ด๋ค. ์๋ฒ ์ธก
http_server_requestsํ์คํ ๊ทธ๋จ ๋ถ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ตฌ๊ฐ์์ 0.95 ms๋ก ๊ณ ์ ๋์ด ์ฐ์ ์ค๋ฅ๊ฐ ํ์ธ๋๋ค(ยง8.2). - ์์ ์งํ(์ฐ๊ฒฐ๋น heap, ์์ฒญ๋น CPU)๋ ๋ณ๋์ด ์์ 1์ฐจ ๊ทผ๊ฑฐ๋ก, ์ง์ฐ์ ๋ณด์กฐ ๊ทผ๊ฑฐ๋ก ์ด๋ค.
2. ๊ณตํต ๊ธฐ์ค์
์ดํ ๋ชจ๋ ์ ์ด ์ด ๋ ๊ฐ์ ๋น๊ต ๊ธฐ์ค์ผ๋ก ์ด๋ค.
2.1 WebSocket ์ฐ๊ฒฐ 1๊ฐ์ ์์ ๋จ๊ฐ
a-ramp3000์ ๋จํ ๊ตฌ๊ฐ(0โ1,734๊ฐ, 12.5๋ถ)์ lab_ws_connections์ ๋ํด
์ต์์ ๊ณฑ ํ๊ทํ ๊ฐ์ด๋ค.
| ํญ๋ชฉ | ์ค์ธก | 3,000 ์ฐ๊ฒฐ ํ์ฐ | Spring ๋ฐฐ์ ๋ ๋๋น |
|---|---|---|---|
| ์ฐ๊ฒฐ๋น heap | 28.2 KB | 84.6 MB | -Xmx512m์ 16.5% |
| ์ฐ๊ฒฐ๋น direct buffer | 0.2 KB | 0.6 MB | ๋ฌด์ ๊ฐ๋ฅ |
| 1,000 ์ฐ๊ฒฐ๋น CPU | 0.0092 cores | 0.028 cores | 0.75 CPU์ 3.7% |
heap ๊ธฐ์ค ์์ฉ ๊ฐ๋ฅ ์ฐ๊ฒฐ = (512 MB ร 0.7 โ ๊ธฐ์ heap 31.9 MB) รท 28.2 KB
โ 11,800๊ฐ. ์ฆ ๋ฉ๋ชจ๋ฆฌ๋ CPU๋ 3,000 ์ฐ๊ฒฐ์ ๊ฐ๋นํ๋ค. ๊ทธ๋ฐ๋ฐ ์ค์
์ํ์ 1,700๊ฐ์๋ค(ยง5.1). ์ด ๋ถ์ผ์น๊ฐ ์ด ๋ฌธ์์ ๊ฐ์ฅ ์ค์ํ ๋ฏธํด๊ฒฐ ํญ๋ชฉ์ด๋ค.
2.2 ์กฐํ API 1๊ฑด์ ์์ ๋จ๊ฐ
| ๊ณ์ด | ์ต๋ ์ค์ธก RPS | ๊ทธ๋ backend CPU | ์์ฒญ๋น CPU | quota ์ด๋ก ์ํ |
|---|---|---|---|---|
light (DB ๋ฏธ์ฌ์ฉ) |
641.6 | 0.148 cores | 0.231 CPU-ms | ์ฝ 3,250 RPS |
detail (DB ์กฐํ) |
274.5 | 0.125 cores | 0.455 CPU-ms | ์ฝ 1,650 RPS |
ํฝ์ค์ฒ endpoint๊ฐ ์ค์ API๋ณด๋ค ๋จ์ํ๋ฏ๋ก ์ ๋ RPS๋ ์ํ ๋ณด์ฆ๊ฐ์ด ์๋๋ค. ์ด ํ๋ "์กฐํ ๊ฒฝ๋ก๊ฐ V1์ 1์ฐจ ๋ณ๋ชฉ์ด ์๋๋ค"๋ฅผ ๋ณด์ด๋ ๋ฐ๋ง ์ด๋ค.
3. ์๋๋ฆฌ์ค (1) โ ์ถํด๊ทผ ํ ํ์: ์กฐํ ์ฆ๊ฐ์ ํผ์ก๋ ์ ์ฅ
3.1 ์๋น์ค ๋์
๊ตํต ์ฅ์ ๋ฐ์ โ ์ฃผ๋ณ ํผ์ก๋ ํ์ธ โ ๋ชฉ์ ์ง ๋ฐฉํฅ ํ ๊ฒ์ โ ์ฌ๋ฌ ํ ๋น๊ต โ ์กฐ๊ฑด ๋ณ๊ฒฝ ํ ์ฌ๊ฒ์. V2์์๋ ์ ํ์ง๊ฐ ๋์ด ๋ชฉ๋กยท์์ธ ์ฌ์กฐํ๊ฐ ๋ฐ๋ณต๋๋ค.
3.2 ์์ ํธ๋ํฝ (์ํค 402)
| ์กฐํ ์ข ๋ฅ | ์ฌ์ฉ์๋น ์ผ์ผ | ํผํฌ ํ๊ท RPS |
|---|---|---|
| ์ปค๋ฎค๋ํฐ ๋ชฉ๋ก | 10๊ฑด | 20.8 |
| ๊ฒ์๊ธยทํ ์์ธ | 10๊ฑด | 20.8 |
| ํผ์ก๋ | 9๊ฑด | 18.8 |
| ํฉ๊ณ | 29๊ฑด | 60.4 |
| ํผ์ก๋ DB ์ฐ๊ธฐ (K=1) | โ | 37.6 row/s |
3.3 ๋ถํ ํน์ฑ
์ ์ ์ํ์ ์ฒ๋ฆฌ๋ ๋ถํ๋ค. ์์ฒญ๋น ๋น์ฉ์ด ๊ณง ์ฉ๋์ ์ ํ๋ค. ๋จ ํผ์ก๋๋ ์กฐํ๊ฐ ๊ณง ์ฐ๊ธฐ(์ต์ ๊ฐ upsert + ์ด๋ ฅ insert)๋ฅผ ๋ง๋๋ ์ฝ๊ธฐ์ฒ๋ผ ๋ณด์ด๋ ์ฐ๊ธฐ ๋ถํ๋ค.
3.4 ์ ์ ์ธํ๋ผ ์์
์ฝ๊ธฐ ๊ฒฝ๋ก : Nginx(0.25) โ Spring Tomcat ์ค๋ ๋ยทCPU(0.75) โ [detail] Hikari(10) โ MySQL(0.5)
์ฐ๊ธฐ ๊ฒฝ๋ก : ์ + ๋์ผ spot_id row lock + redo/fsync + EBS
ํผ์ก๋ ์ฐ๊ธฐ๋ ์ฑํ ์ ์ฅยท์ข์ ์น์ธ๊ณผ ๊ฐ์ ํ 10๊ฐ๋ฅผ ๊ณต์ ํ๋ค.
3.5 ์ธก์ ์ค๊ณ
- ์กฐํ:
light(DB ๋ฏธ์ฌ์ฉ) 50โ150โ300โ500โ700 RPS,detail(DB ์กฐํ) 50โ150โ300 RPS, ๊ฐ warm-up 15์ด + ์ธก์ 75์ด, WS ์์ - ํผ์ก๋ ์ฐ๊ธฐ: ํฝ์ค์ฒ์ ํผ์ก๋ API๊ฐ ์์ด ์ง์ ์ธก์ ํ์ง ์์๋ค. ๋์ผ ํยท๋์ผ ๊ท๋ชจ์ ์ฐ๊ธฐ ๋ถํ์ธ ์ฑํ ์ ์ฅ(ยง5.4, 47 write/s)์ผ๋ก ๊ฐ์ ํ๋จํ๋ค
3.6 ์ธก์ ๊ฒฐ๊ณผ
| ๋ชฉํ RPS | ์ค์ RPS | p95 | p99 | ์ค๋ฅ์จ | dropped | backend CPU | throttling | ํธ์คํธ CPU |
|---|---|---|---|---|---|---|---|---|
| light 50 | 45.9 | 11.5 ms | 16.9 ms | 0% | 0 | 0.029 | 0 | 8.4% |
| light 150 | 137.6 | 11.3 ms | 18.2 ms | 0% | 0 | 0.066 | 0 | 13.5% |
| light 300 | 275.0 | 11.5 ms | 21.9 ms | 0% | 0 | 0.085 | 0 | 17.4% |
| light 500 | 458.3 | 15.0 ms | 53.6 ms | 0% | 0 | 0.120 | 0 | 22.6% |
| light 700 | 641.6 | 19.4 ms | 64.1 ms | 0% | 0 | 0.148 | 0 | 27.8% |
| detail 50 | 45.9 | 13.2 ms | 26.4 ms | 0% | 0 | 0.047 | 0 | 10.5% |
| detail 150 | 137.5 | 12.3 ms | 24.8 ms | 0% | 0 | 0.086 | 0 | 18.0% |
| detail 300 | 274.5 | 16.7 ms | 44.1 ms | 0% | 0 | 0.125 | 0 | 26.0% |
- C_knee์ ๋๋ฌํ์ง ๋ชปํ๋ค. 641 RPS์์๋ ์ค๋ฅ 0%, throttling 0, Tomcat busy ์ต๋ 1์ด๋ค. ๋ชฉํ 60.4 RPS๋ ์ธก์ ์ต๋๊ฐ์ 9.4%๋ค.
- MySQL CPU๋ detail 300 RPS์์ 0.105 cores(๋ฐฐ์ 0.5์ 21%)๋ก ์ฌ์ ๊ฐ ์๋ค.
- 700 RPS ๋ชฉํ์์ ์ค์ 641 RPS(91.7%)์ ๊ทธ์น ๊ฒ์ dropped iteration 0์ด๋ฏ๋ก ์๋ฒ ํฌํ๊ฐ ์๋๋ผ ๋ฐ์๊ธฐยท๋คํธ์ํฌ ์ชฝ ์ํ์ผ๋ก ๋ณธ๋ค.
3.7 ํ์ ๊ณผ ์ธํ๋ผ ๊ตฌ์ฑ ๋ณ๊ฒฝ
- ์กฐํ ๊ฒฝ๋ก๋ V1์์ ๋ณ๊ฒฝ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ๋ค. ์ธ์คํด์ค ์ํฅยทscale-out์ ์กฐํ ๋๋ฌธ์ ๊ฒฐ์ ํ ๊ทผ๊ฑฐ๋ ์๋ค.
- ๋ค๋ง ํผ์ก๋ ์ฐ๊ธฐ(37.6 row/s)๋ ๋ณ๊ฐ๋ค. ยง5.4์์ 47 write/s๊ฐ ํ 10๊ฐ๋ฅผ ํฌํ์ํค๊ณ ๊ฐ์ ํ์ ์ฐ๋ ์กฐํ p95๋ฅผ 13.6๋ฐฐ ์ ํ์์ผฐ๋ค. ํผ์ก๋ ์ ์ฅ์ด ์ถ๊ฐ๋๋ฉด ์กฐํ ์ง์ฐ์ ์กฐํ๋ ๋๋ฌธ์ด ์๋๋ผ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ฌด๋์ง๋ค.
- ๋ณ๊ฒฝ์: ํผ์ก๋ ์ต์ ๊ฐ์ ์บ์(TTL) + ๋จ์ผ ๋นํ(single-flight)์ผ๋ก ์ฐ๊ธฐ ํ์๋ฅผ ์ค์ด๊ณ , ์ด๋ ฅ ์ ์ฅ์ ๋น๋๊ธฐ ๋ฐฐ์น๋ก ๋ถ๋ฆฌํ๋ค. ์ฝ๊ธฐยท์ฐ๊ธฐ ํ์ ๋ถ๋ฆฌํ๋ค.
- ์ฌ๊ฒ์ฆ: ํผ์ก๋ endpoint๋ฅผ ํฝ์ค์ฒ์ ์ถ๊ฐํด
K=1๊ณผK=5๋ก ยง5.4์ ๋์ผํ control/treatment ๋น๊ต๋ฅผ ์ํํ๋ค.
4. ์๋๋ฆฌ์ค (2) โ ์ธ๊ธฐ ํ ์ข์ ๊ฒฝ์
4.1 ์๋น์ค ๋์
ํ ๋ชฉ๋ก ๋น๊ต โ ๋จ์ ์ข์ ํ์ธ โ ์ฐธ์ฌ ์์ฒญ โ ์น์ธ. ์ข์์ด ๋ง๊ฐ๋๋ฉด ์๋ก๊ณ ์นจ๊ณผ
์ฌ๊ฒ์์ด ์ด์ด์ง๋ค. ์น์ธ์ ์ข์ ํ์ SELECT ... FOR UPDATE๋ก ์ ๊ทผ๋ค.
4.2 ์์ ํธ๋ํฝ (์ํค 402)
| ์์ฒญ ์ข ๋ฅ | ๊ณ์ฐ | RPS |
|---|---|---|
| ํ ์ฐธ์ฌ ์์ฒญ | 30,000 รท 14,400 | 2.1 |
| ์ฐธ์ฌ ์น์ธยท๊ฑฐ์ | 30,000 รท 14,400 | 2.1 |
| ์ธ๊ธฐ ํ ์ง์ค(h=50%) | 2.1 ร 0.5 | 1.05 |
4.3 ๋ถํ ํน์ฑ
์ง๋ ฌํ๋๋ ๊ฒฝํฉ ๋ถํ. ๋ณ์๋ RPS๊ฐ ์๋๋ผ ๊ฐ์ ํ์ ๋์์ ๋์ฐฉํ๋ ์์ฒญ ์๋ค. ๋๊ธฐ ์ค์๋ ์ปค๋ฅ์ ์ ์ ์ ํ๋ฏ๋ก ๋ถํ๊ฐ ์์์ ์ด์ค์ผ๋ก ๋จน๋๋ค.
4.4 ์ ์ ์ธํ๋ผ ์์
์น์ธ ์์ฒญ โ Spring ์ค๋ ๋ โ Hikari ์ปค๋ฅ์
1๊ฐ ์ ์
โ MySQL ๋์ผ row X-lock (๋ณด์ ์๊ฐ = ํธ๋์ญ์
์๊ฐ)
โ ๋๊ธฐ ์์ฒญ์ lock ๋๊ธฐ + ์ปค๋ฅ์
์ ์ ๋ฅผ ๋์์ ์ ์ง
์๊ณ ์กฐ๊ฑด์ด ๋์ด๊ณ ์๋ก ๋ค๋ฅด๋ค.
ํ ๊ณ ๊ฐ : ๋์ ์์ฒญ > 10 โ ํ๋ ๋๊ธฐ 1,000 ms ์ด๊ณผ โ 503
lock ์ด๊ณผ: ๋์ ์์ฒญ ร ํธ๋์ญ์
์๊ฐ > 3,000 ms โ 503
4.5 ์ธก์ ์ค๊ณ
hot-row.js๋ก ๋์ผ ํ์ ๋์ 5ยท20ยท50ยท100๊ฑด์ 3๋ผ์ด๋ ๋ฐํ(lock_hold_ms=100).
๋์กฐ๊ตฐ์ ๋ถ์ฐ ํ(e-dist-c50), ์ ํ ์ธก์ ์ detail 50 RPS ๋ณํ(e-mix-*),
control์ e0-rest-control.
4.6 ์ธก์ ๊ฒฐ๊ณผ
๋์ผ ํ ๋์์ฑ๋ณ(ํด๋ผ์ด์ธํธ ์ธก์ ):
| ๋์์ฑ | p95 | p99 | ์คํจ์จ | Hikari ๋๊ธฐ | ํ๋ p95 | ์ข์ lock p95 | ์๋ฒ 5xx/s |
|---|---|---|---|---|---|---|---|
| 5 | 542 ms | 546 ms | 0% | 0 | 2.3 ms | 425 ms | 0 |
| 20 | 1,961 ms | 2,033 ms | 4.76% | 10 | 934 ms | 971 ms | 0.05 |
| 50 | 1,872 ms | 2,106 ms | 59.5% | 32 | 1,061 ms | 976 ms | 1.14 |
| 100 | 1,627 ms | 2,042 ms | 79.9% | 84 | 1,067 ms | 1,046 ms | 5.73 |
- ๋์ 20๊ฑด์ด ๋ถ๊ธฐ์ ์ด๋ค. ํ(10๊ฐ)์ ๋๋ ์๊ฐ ๋๊ธฐ๊ฐ ์๊ธฐ๊ณ ํ๋ p95๊ฐ
934 ms๋ก ํ์์์(1,000 ms) ์ง์ ๊น์ง ์ฌ๋ผ๊ฐ๋ค. ์์ธก๋๋ก
๋์์ฑ > ํ ํฌ๊ธฐ๊ฐ ์ฒซ ์๊ณ์๋ค. - ๋์ 50๊ฑด ์ด์์์๋ ํ๋ p95๊ฐ 1,060 ms๋ก ํ์์์์ ๋ถ์ด ์คํจ์จ์ด 59.5%โ79.9%๋ก ๋ด๋ค. ์ฆ ์คํจ์ ์ฃผ๋ ์์ธ์ lock ์์ฒด๊ฐ ์๋๋ผ lock ๋๊ธฐ๊ฐ ์ปค๋ฅ์ ์ ์ก๊ณ ์์ด ๋ฐ์ํ ํ ๊ณ ๊ฐ์ด๋ค.
- ๋ถ์ฐ ํ ๋์กฐ๊ตฐ(
e-dist-c50)์ ์คํจ์จ 43.1%๋ก ๋์ผ ํ(59.5%)๋ณด๋ค ๋ฎ์ง๋ง 0%๊ฐ ์๋๋ค. ํฝ์ค์ฒ์ hot run์ ํ์ด 2๊ฐ๋ฟ์ด์ด์ ๋์ 50๊ฑด์ด 25๊ฑด์ฉ ๋ ํ์ ๋๋์์ ๋ฟ์ด๋ค. ๋์กฐ๊ตฐ์ผ๋ก์ ์ฝํ๋ค(ยง8.3).
๋ค๋ฅธ API๋ก์ ์ ํ(detail 50 RPS):
| ๊ตฌ๊ฐ | p95 | p99 | ์คํจ์จ |
|---|---|---|---|
control e0-rest-control (hot-row ์์) |
10.7 ms | 17.5 ms | 0% |
treatment e-mix-rest (๋์ 50๊ฑด ๋ณํ) |
26.4 ms | 844.5 ms | 0.38% |
| ๋ณํ | 2.5๋ฐฐ | 48๋ฐฐ | โ |
์ผ๋ฐ ์กฐํ์ p95๋ 2.5๋ฐฐ์ง๋ง p99๊ฐ 48๋ฐฐ๋ค. ์ข์ ๊ฒฝํฉ์ด ๊ณต์ฉ ํ์ ํตํด ์กฐํ API์ ๊ผฌ๋ฆฌ ์ง์ฐ์ ๋ง๋ ๋ค๋ ์ํค์ ์ฅ์ ํ๋ฆ ๊ฐ์ค์ด ์์น๋ก ํ์ธ๋๋ค.
4.7 ํ์ ๊ณผ ์ธํ๋ผ ๊ตฌ์ฑ ๋ณ๊ฒฝ
- ์ํค์ ๊ฐ์ ๋จ์๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค. "์ธ๊ธฐ ํ ์ ๊ธ 1.05 RPS"๋ ํธ๋์ญ์
์๊ฐ 0.5์ด๋ฅผ ์ ์ฉํ๋ฉด ํ๊ท ๋์์ฑ 0.5๋ก, V1์ด ํต๊ณผํ๋ค. ๊ทธ๋ฌ๋ ์ค์ ์ํ์
ํ๊ท ์ด ์๋๋ผ ์ข์ ๊ณต๊ฐยท๋ง๊ฐ ์๊ฐ์ ๋์ ๋์ฐฉ ์๋ค. ์ํค (2)์ ํธ๋ํฝ
๊ฐ์ ์
๋์ ์น์ธ ์์ฒญ ์๊ธฐ์ค์ผ๋ก ์ฌ์ฐ์ ํ ๊ฒ์ ์ ์ํ๋ค. - ๋ณ๊ฒฝ์ ์ฐ์ ์์
- ์ข์ ์ฐจ๊ฐ์ DB row lock ๋ฐ์ผ๋ก ์ฎ๊ธด๋ค โ Redis ์์ ์นด์ดํฐ + ๋ฉฑ๋ฑํค. lock ๋ณด์ ์๊ฐ์ด ์ฌ๋ผ์ง๋ฉด ํ ์ ์ ๋ ์ฌ๋ผ์ง๋ค.
- ์ฐ๊ธฐ ๊ฒฝ๋ก์ ํ์ ์กฐํ์ ๋ถ๋ฆฌํ๋ค. ์น์ธ API๊ฐ ํ ์ ์ฒด๋ฅผ ์ ์ํ์ง ๋ชปํ๊ฒ ํ๋ค.
- ํ ํฌ๊ธฐ ์ฆ์ค์ ํ์์๋ค. 10โ20์ ์๊ณ๋ฅผ ๋์ 20โ40์ผ๋ก ๋ฏธ๋ฃฐ ๋ฟ, MySQL ๋์ ์คํ๋ง ๋๋ฆฐ๋ค.
- ์ ํฉ์ฑ์ ์ด๋ฒ ์ธก์ ์์ ์๋ฐ์ด ํ์ธ๋์ง ์์๋ค(์์ ์ข์ยท์ ์ ์ด๊ณผ 0๊ฑด).
๋จ ์คํค๋ง์
CHECK (remaining >= 0)๊ฐ ์๋ฐ์ 503์ผ๋ก ๋ฐ๊ฟ ๋๋ฌ๋ด๋ฏ๋ก, 503 ์ค CHECK ์๋ฐ๋ถ์ ๋ถ๋ฆฌํ๋ ๋ก๊ทธ ํ์ธ์ด ๋จ์ ์๋ค.
5. ์๋๋ฆฌ์ค (3) โ ํ์ฌ ์ข ๋ฃ: WebSocket ์ง์ค๊ณผ ๊ณต์ ์์ ๊ณ ๊ฐ
5.1 ๋์ ์ฐ๊ฒฐ ์ โ ๋ชฉํ 3,000๊ฐ์ ๋๋ฌํ์ง ๋ชปํ๋ค
โ ์๋น์ค ๋์ ํ์ฌ ์ข ๋ฃ ํ ์ ์ ๋ ์ฌ์ฉ์๊ฐ ์ฑํ ๋ฐฉ์ ์ ์ฅํด ๋งค์นญ ์ฑ์ฌ๊น์ง ์ฐ๊ฒฐ์ ์ ์งํ๋ค.
โก ์์ ํธ๋ํฝ ์ํค (3)์ ๋ชฉํ๋ ๋์ ์ฐ๊ฒฐ 3,000๊ฐ ์ด์์ด๋ค.
โข ๋ถํ ํน์ฑ ์ฅ์๊ฐ ์ ์ง๋๋ ์ํ ๋ณด์ ํ ๋ถํ. ๋ฉ์์ง๊ฐ ์์ด๋ ์์ผยทFDยท ์ธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๋ค.
โฃ ์ ์ ์์ Nginx(์ฐ๊ฒฐ๋น client+upstream 2 FD, 0.25 CPU, 128 MB) โ Spring (heap ์ธ์ ๊ฐ์ฒด, direct buffer, Tomcat ์ปค๋ฅ์ ์ฌ๋กฏ 8192, nofile 16384).
โค ์ธก์ ์ค๊ณ ws-connect.js๋ก 0โ3,000์ 12.5๋ถ์ ์ ํ ์ฆ๊ฐ(4 conn/s).
๋จํ ์์ฒด๋ฅผ ๋
๋ฆฝ๋ณ์๋ก ์จ์ ์ฐ๊ฒฐ ์ ๋๋น ์์์ ํ๊ทํ๋ค. REST ๋ถํ๋ ์๋ค.
โฅ ์ธก์ ๊ฒฐ๊ณผ
| ํญ๋ชฉ | ์ค์ธก |
|---|---|
| ๋ชฉํ ๋์ ์ฐ๊ฒฐ | 3,000 |
์ค์ ์ต๋ ๋์ ์ฐ๊ฒฐ (lab_ws_connections) |
1,734 |
| handshake p95 | 30,001 ms (30์ด ํ์์์) |
| WS ์ค๋ฅ์จ | 57.3% |
| ์ฐ๊ฒฐ๋น heap / CPU | 28.2 KB / 1,000๊ฐ๋น 0.0092 cores |
| ๊ทธ๋ heap ์ต๋ / working set | 301 MB / 604 MB (limit 768 MB) |
๊ฐ์ ์ํ์ด ๋ค๋ฅธ ๋ธ๋ก์์๋ ๋ฐ๋ณต๋๋ค. ๋ชฉํ 1,800 ์ฐ๊ฒฐ์ ์ง์ํ ๋ค ๋ธ๋ก์
์ค์ธก ์ต๋๋ c3 1,708 / c4 1,633 / d1 1,628 / g 1,692๊ฐ๋ค.
๋ฐ๋ฉด 1,000 ์ฐ๊ฒฐ์ ์ง์ํ b-rate* ์ธ ๋ธ๋ก์ ์ค๋ฅ 0%๋ก 1,000๊ฐ๋ฅผ ๋ชจ๋
์๋ฆฝํ๋ค. ๋ฐ๋ผ์ ์ํ์ 1,000๊ณผ 1,800 ์ฌ์ด์ ์๋ค.
์์ธ์ ๋จ์ ํ ์ ์๋ค. ยง2.1๋๋ก heap(11,800๊ฐ ์ฌ์ )๋ CPU(3.7% ์ฌ์ฉ)๋ ์ค๋ช ํ์ง ๋ชปํ๋ค. ํ๋ณด๋ Nginx 128 MB ๋ฉ๋ชจ๋ฆฌ ํ๋ ์์ ์ฐ๊ฒฐ๋ณ ํ๋ก์ ๋ฒํผ, Nginx ๋จ์ผ worker์ ์ฐ๊ฒฐ ์ฒ๋ฆฌ, ๋ก์ปฌ ๋ฐ์๊ธฐยทDocker VM์ ์์ผ ํ๋๋ค. ์ด๋ฒ ์ธก์ ์ ์ปจํ ์ด๋๋ณ CPU ์ง๊ณ์ ์ค๋ฅ๊ฐ ์์ด(ยง8.2) Nginx๋ฅผ ๊ทผ๊ฑฐ๋ก ์ง๋ชฉํ ์ ์๋ค.
โฆ ํ์ ๊ณผ ๋ณ๊ฒฝ
- ํ์ฌ ์๋๋ฆฌ์ค์ ํต์ฌ ์๊ตฌ(๋์ 3,000)๋ฅผ V1์ ์ถฉ์กฑํ์ง ๋ชปํ๋ค. ๋ฌ์ฑ๋ฅ 57%์ด๋ฉฐ, ์ด๊ณผ๋ถ์ ๊ฑฐ๋ถ๊ฐ ์๋๋ผ 30์ด ๋๊ธฐ ํ ์คํจ๋ก ๋ํ๋ ์ฌ์ฉ์์๊ฒ๋ "์ฑํ ๋ฐฉ์ด ์ด๋ฆฌ์ง ์๋ ์ํ"๋ก ๋ณด์ธ๋ค.
- ์์ธ ๊ท๋ช ์ ์๋ ์ธ์คํด์ค ์ํฅ๊ณผ WS ๋ถ๋ฆฌ ์ค ์ด๋ ๊ฒ์ด ํด๋ฒ์ธ์ง ํ์ ํ ์ ์๋ค. ๋ค์ ์ฐฝ์ 1์์ ์์ ์ ยง8.4์ ์ ์๋ค.
- ์ฐ๊ฒฐ๋น ๋จ๊ฐ(28.2 KB, 0.0092 cores/1k)๋ ํ๋ณดํ์ผ๋ฏ๋ก, WS ์ ์ฉ ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ฆฌํ ๋์ ๋ฉ๋ชจ๋ฆฌยทCPU ์ฐ์ ์ ์ด ๊ฐ์ผ๋ก ๊ฐ๋ฅํ๋ค.
5.2 ์ฐ๊ฒฐ ์๋์จ โ ๋ชฉํ 10 conn/s๋ ์ฌ์ , 200 conn/s์์ ๋ถ๊ดด
โก ์ํค (3)์ ์ ๊ท ์ฐ๊ฒฐ๋ฅ ์ ํ๊ท 5 conn/s, ํผํฌ 10 conn/s๋ค.
โข ์งง๊ณ ๋น์ผ ์๊ฐ ๋ถํ. ์ฐ๊ฒฐ ์๋ฆฝ๋ง๋ค TLS handshake๊ฐ ๋ฐ์ํ๋ค.
โฃ Nginx 0.25 CPU ยท worker_processes 1 ยท accept queue ยท listen backlog.
โค ์ฐ๊ฒฐ 1,000๊ฐ ๊ณ ์ , CONNECT_RATE 20 / 100 / 200 conn/s. ์ธก์ ์ฐฝ์ ramp ๊ตฌ๊ฐ.
โฅ
| ์ฐ๊ฒฐ ์๋์จ | handshake p95 | WS ์ค๋ฅ์จ | ๋ฌ์ฑ ์ฐ๊ฒฐ |
|---|---|---|---|
| 20 conn/s | 33.5 ms | 0% | 1,000 |
| 100 conn/s | 156.6 ms | 0% | 1,000 |
| 200 conn/s | 3,568.8 ms | 0% | 1,000 |
์๋์จ์ด 10๋ฐฐ(20โ200)๊ฐ ๋๋ฉด handshake ์ง์ฐ์ 107๋ฐฐ๊ฐ ๋๋ค. ์ ํ์ด ์๋๋ค. ๋ค๋ง ์ค๋ฅ๋ 0%์ด๋ฏ๋ก ์ด ๊ตฌ๊ฐ์ "์คํจ"๊ฐ ์๋๋ผ "๋๊ธฐ"๋ค.
โฆ ๋ชฉํ 10 conn/s๋ ๋ชฉํ์ 2๋ฐฐ์ธ 20 conn/s์์๋ 33.5 ms์ด๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๋๋ค. ๋จ 3,000๋ช ์ด ๋ ๋น ๋ฅด๊ฒ ์ ์ ๋๋ ์๋๋ฆฌ์ค(์: 100 conn/s ์ด์)๋ฅผ ๊ฐ์ ํ๋ฉด ์ง์ ๊ณ์ธต์ด ๋จผ์ ๋๋ ค์ง๋ค. ๋ณ๊ฒฝ์ด ํ์ํด์ง๋ฉด Spring์ด ์๋๋ผ Nginx CPUยทworker ์ฌ๋ฐฐ๋ถ ๋๋ TLS ์ข ๋ฃ ์์น ๋ณ๊ฒฝ์ด ๋จผ์ ๋ค.
5.3 ๋ฉ์์ง ์ ํ โ ๊ฑด์๊ฐ ๋ฐ์ดํธ๋ณด๋ค 3๋ฐฐ ์ด์ ๋น์ธ๋ค
โ โก ์ฑํ ๋ฉ์์ง. ๊ธด ์๋ดยท์ ์ฐ ๋ด์ญ๊ณผ ์งง์ ๋ํ๊ฐ ์์ธ๋ค.
โข ๋ ์ถ์ด ์์ธ ๋ถํ. ๋ฉ์์ง ๊ฑด์์ payload ๋ฐ์ดํธ๊ฐ ๊ฐ๊ฐ ๋ค๋ฅธ ๋น์ฉ์ ๋ง๋ ๋ค.
โฃ ๊ฑด์ โ Tomcat ์ค๋ ๋ยทํ๋ ์ ์ฒ๋ฆฌยท์ญ์ง๋ ฌํ / ๋ฐ์ดํธ โ ๋ฒํผยท์ง๋ ฌํยท ๋คํธ์ํฌ / ์์ชฝ ๋ชจ๋ heap allocation๊ณผ GC.
โค 2ร2 ์์ธ ์ค๊ณ(์ฐ๊ฒฐ 200ยท1,800 ร payload 256 Bยท8,000 B), ์ ์ฅ ์๋ echo ๊ฒฝ๋ก, ๋ชฉํ 120 msg/s ๊ณ ์ .
โฅ ์ฐ๊ฒฐ 200๊ฐ ๋ ์ ์ ๋ฉ์์ง ๊ฑด์๊ฐ 16,684๊ฑด์ผ๋ก ์ ํํ ๊ฐ์ ๋ฐ์ดํธ ๋น์ฉ๋ง ๋ถ๋ฆฌ๋๋ค.
| ์ | ์ฐ๊ฒฐ | payload | ๋ฉ์์ง | ์ค์ msg/s | backend CPU |
|---|---|---|---|---|---|
c1 |
200 | 256 B | 16,684 | 97.5 | 0.0378 |
c2 |
200 | 8,000 B | 16,684 | 94.8 | 0.0511 |
c3 |
1,708 | 256 B | 10,628 | 44.9 | 0.0388 |
c4 |
1,633 | 8,000 B | 9,928 | 42.4 | 0.0494 |
๋ฉ์์ง 1๊ฑด ๊ธฐ๋ณธ ๋น์ฉ = 0.0378 cores รท 97.5 msg/s โ 0.39 CPU-ms/๊ฑด
payload ๋ฐ์ดํธ ๋น์ฉ = (0.0511 โ 0.0378) รท (7.56 KB ร 94.8/s) โ 0.02 CPU-ms/KB
8,000 B ๋ฉ์์ง 1๊ฑด = 0.39 + 0.15 โ 0.54 CPU-ms โ ๊ฑด์ ๋น์ฉ์ด 72%
์ฐ๊ฒฐ 1,800 ์
(c3)์ ๋ฉ์์ง๊ฐ 44.9 msg/s๋ก ์ ๋ฐ์ธ๋ฐ CPU๋ c1๊ณผ ๊ฐ๋ค.
์ฆ ์ฐ๊ฒฐ 1,508๊ฐ ์ถ๊ฐ๊ฐ ๋ฉ์์ง 52.6๊ฑด/s์ ๋ง๋จน๋ ๋น์ฉ์ด๋ค.
์ฃผ์. c3ยทc4๋ ๋ชฉํ 120 msg/s์ ๋ํด 42~45 msg/s๋ง ๋ฌ์ฑํ๋ค(๋ฐ์๊ธฐ
ํ๊ณ, ยง8.3). ๋ฐ๋ผ์ ์ฐ๊ฒฐ ์ถ๊ณผ ๋ฉ์์ง ์ถ์ด ์์ ํ ๋ถ๋ฆฌ๋์ง ์์๊ณ , ์ ํ๊ท๋
์ฐ๊ฒฐ 200๊ฐ ์
์ ๋น๊ต๊ฐ 1์ฐจ ๊ทผ๊ฑฐ๋ค.
โฆ ๊ธด ์ปจํ ์คํธ๋ณด๋ค ์งง์ ๋ฉ์์ง๊ฐ ๋ง์ ์ชฝ์ด ๋ ์ํํ๋ค. ๋ณ๊ฒฝ ์ฐ์ ์์๋ payload ์์ถยท์ํ์ด ์๋๋ผ ๊ฑด๋น ์ฒ๋ฆฌ ๋น์ฉ ์ ๊ฐ(ACK ๊ฒฝ๋ํ, ๋ฉ์์ง ๋ฐฐ์นญ, ์ ์ฅ ๋น๋๊ธฐํ)์ด๋ค. payload ์ํ์ 8 KB ์์ค์์๋ ๋ถ์ฐจ์ ์ด๋ค.
5.4 ๋ฉ์์ง ์ ์ฅ โ ๊ณต์ฉ ํ์ ํฌํ์์ผ ์ผ๋ฐ ์กฐํ๋ฅผ ๋ฌด๋๋จ๋ฆฐ๋ค
โ ๋ฉ์์ง๋ฅผ ์ ์ฅํ ๋ค ์ ๋ฌํ๋ค(ํ์ฌ ๊ตฌ์กฐ๋ ์ปค๋ฐ ํ ACK).
โก ์ํค (3)์ "์ฑํ ๋ฉ์์ง ์ฆ๊ฐ โ DB ์ปค๋ฅ์ ๋๊ธฐ โ ์ฐธ์ฌ API ์ง์ฐ" ๊ฐ์ค.
โข ์๋ต ๊ฒฝ๋ก๊ฐ DB ํธ๋์ญ์ ์ ๋ฌถ์ธ ๋ถํ. ์ปค๋ฅ์ ์ ์ ์๊ฐ์ด ์ฒ๋ฆฌ๋ ์ํ์ ๋ง๋ ๋ค.
โฃ HikariCP 10๊ฐ(ํ๋ ํ์์์ 1์ด)๋ฅผ ์กฐํยท์น์ธยทํผ์ก๋ ์ ์ฅ๊ณผ ๊ณต์ ํ๋ค.
โค ์ ์ฅ ์์(c3, ยง5.3) โ ์ ์ฅ๋ง(d1-save-h50) โ ์ ์ฅ + detail 50 RPS
(d2-*), control์ d0-rest-control. ํธ๋์ญ์
์ ์ ์๊ฐ์ chat_hold_ms=50.
โฅ
| ํญ๋ชฉ | c3 ์ ์ฅ ์์ |
d1 ์ ์ฅ๋ง |
d2 ์ ์ฅ + ์กฐํ |
|---|---|---|---|
| ์ค์ msg/s | 44.9 | 47.4 | 37.6 |
| ์ปค๋ฐ p95 | โ | 494 ms | 109~466 ms |
| Hikari active (์ต๋ 10) | 0 | 10 / 10 | 7 |
| Hikari ๋๊ธฐ | 0 | 53 | 0 |
| ํ๋ p95 | 0.97 ms | 445 ms | 47~214 ms |
| ์ฑํ ์ ์ฅ ์ค๋ฅ/s | 0 | 1.02 | 3.03 |
| backend CPU | 0.0388 | 0.0896 | 0.0734 |
๊ฐ์ ์๊ฐ๋ ์ผ๋ฐ ์กฐํ(detail 50 RPS, ํด๋ผ์ด์ธํธ ์ธก์ ):
| ๊ตฌ๊ฐ | p95 | p99 | ์คํจ์จ |
|---|---|---|---|
control d0-rest-control |
12.1 ms | 28.5 ms | 0% |
treatment d2-rest-treatment |
164.8 ms | 663.6 ms | 1.53% |
| ๋ณํ | 13.6๋ฐฐ | 23๋ฐฐ | โ |
โฆ ํ์ ๊ณผ ๋ณ๊ฒฝ
| ์ฆ๊ฑฐ | ๊ฒฐ๋ก |
|---|---|
| ์ ์ฅ๋ง์ผ๋ก ํ active 10/10, ๋๊ธฐ 53, ํ๋ p95 445 ms | ์ปค๋ฅ์ ์ ์ ์๊ฐ์ด ๋ณ๋ชฉ โ ์ ์ฅ ๋น๋๊ธฐํ(ํ + ๋ฐฐ์น insert) |
| MySQL CPU 0.072 cores(๋ฐฐ์ 0.5์ 14%)๋ก ์ฌ์ | DB ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์๋๋ผ ํ์ด ํ๊ณ โ ํ ์ฆ์ค๋ณด๋ค ์ ์ ์๊ฐ ๋จ์ถ |
| ๋ณํ ์กฐํ p95 13.6๋ฐฐยท์คํจ 1.53% | ๊ณต์ฉ ํ์ด ์ฅ์ ์ ํ ๊ฒฝ๋ก โ ์ฝ๊ธฐยท์ฐ๊ธฐ ํ ๋ถ๋ฆฌ |
์ ์ฅ ์์(c3)์์๋ ํ ์งํ ์ ๋ถ 0 |
์ค์๊ฐ ๊ฒฝ๋ก์ ์์ ๊ฒฝ๋ก ๋ถ๋ฆฌ๊ฐ V2 ํ์ ํญ๋ชฉ |
47 msg/s๊ฐ ํ์ ํฌํ์์ผฐ๋ค๋ ๊ฒ์ ํผ์ก๋ ์ฐ๊ธฐ 37.6 row/s(ยง3)๋ ๊ฐ์ ์๊ณ ๊ตฌ๊ฐ์์ ๋ปํ๋ค. ๋ ์ฐ๊ธฐ๊ฐ ๋์์ ์กด์ฌํ๋ V2์์๋ ์ด ํญ๋ชฉ์ด ์กฐํ ์ง์ฐ์ ์ค์ ์์ธ์ด ๋๋ค.
5.5 WebSocket ์ฐ๊ฒฐ์ด REST API์ ์ฃผ๋ ๊ฐ์ญ
โค control(f1c-rest-control, WS 0) โ WS 2,100 ์ ์ง ์ํ์์ ๋์ผ REST
๋ฐ๋ณต(f1c-rest-treatment). ๋ ์คํ์ ์ฐ์ ๋ฐฐ์นํด ์กฐ๊ฑด์ ๋ง์ท๋ค.
โฅ
| ํญ๋ชฉ | control | treatment (WS 1,642๊ฐ ์ ์ง) | ๋ณํ |
|---|---|---|---|
| REST p95 | 11.0 ms | 167.2 ms | 15๋ฐฐ |
| REST p99 | 33.4 ms | 914.8 ms | 27๋ฐฐ |
| REST ์คํจ์จ | 0% | 4.54% | โ |
| dropped iterations | 0 | 24 | โ |
| backend CPU | 0.032 | 0.061 | 1.9๋ฐฐ |
| heap ์ต๋ | 123 MB | 277 MB | 2.3๋ฐฐ |
| GC pause p95 | 3.1 ms | 257 ms | 82๋ฐฐ |
| working set | 601 MB | 632 MB (limit 768) | +5% |
| Hikari ๋๊ธฐ | 0 | 0 | ๋ณํ ์์ |
| MySQL CPU | 0.017 | 0.018 | ๋ณํ ์์ |
| Next.js CPU | ๋ณํ ์์ | ๋ณํ ์์ | โ |
โฆ ํ์
- REST p95๊ฐ control ๋๋น 15๋ฐฐ, p99 27๋ฐฐ ์ ํ๋๊ณ ์ค๋ฅ๊ฐ 4.54% ๋ฐ์ํ๋ค. 403์ ํ์ ๊ธฐ์ค(20% ์ ํ)์ ํฌ๊ฒ ๋๋๋ค.
- ์ ํ์ ๋๋ฐ ์งํ๋ **GC pause(3.1 โ 257 ms)์ heap(123 โ 277 MB)**์ด๋ค. Hikari์ MySQL์ ๋ณํ๊ฐ ์์ผ๋ฏ๋ก ์์ธ์ DB๊ฐ ์๋๋ผ ๊ฐ์ JVM์ ๋ฉ๋ชจ๋ฆฌยทGC๋ค.
- Next.jsยทMySQL ์ปจํ ์ด๋๋ ์ํฅ์ด ์์๋ค. ์ฆ ํธ์คํธ ์์ ๊ฒฝํฉ์ด ์๋๋ผ Spring ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ณต์ ์์ ๊ฒฝํฉ์ด๋ค. ์ปจํ ์ด๋ quota ๊ฒฉ๋ฆฌ๋ ์๋ํ๋ค.
- ๊ฒฐ๋ก : REST์ WebSocket์ ํ๋ก์ธ์ค ๋ถ๋ฆฌ๊ฐ V2 ์ค๊ณ์ 1์์๋ค. ๊ฐ์ JVM์ ๋๋ ํ, ์ฑํ ์ฐ๊ฒฐ์ด ๋ ๋๋ง๋ค ์ผ๋ฐ API์ ๊ผฌ๋ฆฌ ์ง์ฐ๊ณผ ์ค๋ฅ์จ์ด ํจ๊ป ์ฌ๋ผ๊ฐ๋ค.
6. V1 ํ๊ณ ์ข ํฉ
6.1 ์ฅ์ ์ ํ ์ง๋ (์ค์ธก๊ฐ ๋ถ์ฐฉ)
[ํ์ฌ ์ ์
] [์ธ๊ธฐ ํ ๋ง๊ฐ] [์กฐํ ์ฆ๊ฐ]
WS ์ฐ๊ฒฐ 1,700๊ฐ์์ ํฌํ ๋์ ์น์ธ 20๊ฑด ์ด๊ณผ 641 RPS๊น์ง ์ฌ์
โ handshake 30์ด ํ์์์ โ ํ 10๊ฐ ๊ณ ๊ฐ โ throttling 0
โ (๋ชฉํ 3,000์ 57%) โ ํ๋ p95 1,060ms โ
โ โ โ
๊ฐ์ JVM heapยทGC ์๋ฐ ๊ณต์ฉ HikariCP 10 (๋ณ๋ชฉ ์๋)
GC pause 3.1 โ 257ms โ
โ โโ ์ข์ ์น์ธ ์คํจ 59.5%
โ โโ ์ผ๋ฐ ์กฐํ p99 48๋ฐฐ
์ผ๋ฐ REST p99 27๋ฐฐ ยท ์ค๋ฅ 4.5% โโ ์ฑํ
์ ์ฅ ์ค๋ฅ 1~3/s
โ
[์ฑํ
๋ฉ์์ง ์ ์ฅ 47 msg/s] โโโโโโโโโโโโโโโโ
ํ active 10/10 ยท ๋๊ธฐ 53 โ ์ผ๋ฐ ์กฐํ p95 13.6๋ฐฐ ยท ์คํจ 1.53%
์ธ ์๋๋ฆฌ์ค๊ฐ ์๋ก ๋ค๋ฅธ ์ ๊ตฌ๋ก ๋ค์ด์ ๊ฐ์ ๋ ์์(Spring JVM, Hikari ํ 10๊ฐ) ์์ ๋ง๋๋ค. ์ด๊ฒ์ด V1 ๊ตฌ์กฐ์ ํต์ฌ ํ๊ณ๋ค.
6.2 V1์ด ๊ฐ๋น ๊ฐ๋ฅํ ๊ท๋ชจ
| ์ถ | V1 ์ค์ธก ํ๊ณ | V2 ์๊ตฌ | ์ถฉ์กฑ |
|---|---|---|---|
| ์กฐํ RPS | 641 RPS ์ด์ (knee ๋ฏธ๋๋ฌ) | 60.4 RPS | โ 10๋ฐฐ ์ฌ์ |
| ํ์ฌ API ํผํฌ | 641 RPS ์ด์ | 140 RPS | โ |
| WS ์ ๊ท ์ฐ๊ฒฐ๋ฅ | 20 conn/s์์ 33 ms | 10 conn/s | โ |
| WS ๋์ ์ฐ๊ฒฐ | ์ฝ 1,700๊ฐ | 3,000๊ฐ | โ 57% |
| ๋์ ์ข์ ์น์ธ | 20๊ฑด ๋ฏธ๋ง | ์ฌ์ฐ์ ํ์ | โ |
| ์ฑํ ์ ์ฅ ์ฒ๋ฆฌ๋ | 47 msg/s์์ ํ ํฌํ | ๋ฏธ์ฐ์ | โ |
| ํผ์ก๋ ์ฐ๊ธฐ | ๋ฏธ์ธก์ (47 write/s ๊ฐ์ ) | 37.6 row/s | โ |
7. V2 ์ธํ๋ผ ๊ตฌ์ฑ ๋ณ๊ฒฝ ๊ฒฐ์
| ์ฐ์ ์์ | ๋ณ๊ฒฝ | ๊ทผ๊ฑฐ (์ ยท์งํ) | ๊ธฐ๋ํจ๊ณผ | ์ฌ๊ฒ์ฆ |
|---|---|---|---|---|
| 1 | REST์ WebSocket ํ๋ก์ธ์ค ๋ถ๋ฆฌ | ยง5.5 REST p99 27๋ฐฐยท์ค๋ฅ 4.54%, GC pause 82๋ฐฐ / ยง5.1 ์ฐ๊ฒฐ ์ํ 1,700 | ์ฑํ ์ฐ๊ฒฐ ์ฆ๊ฐ๊ฐ ์ผ๋ฐ API ์ง์ฐยท์ค๋ฅ๋ก ๋ฒ์ง์ง ์์ | ๋ถ๋ฆฌ ํ ยง5.5 control/treatment ์ฌ์คํ, p95 ์ ํ 20% ๋ฏธ๋ง ํ์ธ |
| 2 | ์ฑํ ์ ์ฅ ๋น๋๊ธฐํ (ํ + ๋ฐฐ์น insert) | ยง5.4 ํ active 10/10ยท๋๊ธฐ 53ยทํ๋ p95 445 ms, ๋ณํ ์กฐํ p95 13.6๋ฐฐ | WS ์๋ต ๊ฒฝ๋ก์์ DB ํธ๋์ญ์ ์ ๊ฑฐ, ํ ์ ์ ์๊ฐ ๋จ์ถ | ๋์ผ 47 msg/s์์ ํ ๋๊ธฐ 0ยท์กฐํ p95 ๋ณํ 20% ๋ฏธ๋ง |
| 3 | ์ฝ๊ธฐยท์ฐ๊ธฐ ์ปค๋ฅ์ ํ ๋ถ๋ฆฌ | ยง4.6 ๋์ 20๊ฑด์์ ํ ๊ณ ๊ฐ / ยง5.4 / ยง3.7 ํผ์ก๋ ์ฐ๊ธฐ | ์ฐ๊ธฐ ๊ฒฝํฉ์ด ์กฐํ API๋ฅผ ์ ์ํ์ง ๋ชปํ๊ฒ ๊ฒฉ๋ฆฌ | e-mixยทd2๋ฅผ ๋์ผ ์กฐ๊ฑด์ผ๋ก ์ฌ์คํ |
| 4 | ์ข์ ์ฐจ๊ฐ์ DB row lock ๋ฐ์ผ๋ก (Redis ์์ ์นด์ดํฐ + ๋ฉฑ๋ฑํค) | ยง4.6 lock p95 1,046 ms, ์คํจ์จ 59.5~79.9% | lock ๋ณด์ ์๊ฐ ์ ๊ฑฐ โ ํ ์ ์ ๋๋ฐ ์ ๊ฑฐ | ๋์ 50ยท100๊ฑด์์ ์คํจ์จ 0%ยท์ ํฉ์ฑ ์ ์ง |
| 5 | ํผ์ก๋ ์ต์ ๊ฐ ์บ์ + ์ด๋ ฅ ๋น๋๊ธฐ ์ ์ฅ | ยง3.7 (๊ฐ์ ๊ทผ๊ฑฐ) | ์กฐํ๋น ์ฐ๊ธฐ 2๊ฑด โ ์บ์ ๋ฏธ์ค ์์๋ง | ํผ์ก๋ endpoint ์ถ๊ฐ ํ K=1ยท5 ์ธก์ |
| 6 | ์ฐ๊ฒฐ ์ํ 1,700 ์์ธ ๊ท๋ช ํ ๊ฒฐ์ (์ธ์คํด์ค ์ํฅ / Nginx ์กฐ์ / WS ๊ฒ์ดํธ์จ์ด) | ยง5.1 heapยทCPU๋ก ์ค๋ช ๋ถ๊ฐ | 3,000 ์ฐ๊ฒฐ ๋ชฉํ ๋ฌ์ฑ | ยง8.4 ์ ์ฐจ |
| โ | ์กฐํ ๋๋ฌธ์ scale-outยท์ธ์คํด์ค ์ํฅ | ยง3.6 641 RPS์์ throttling 0 | โ | ๊ทผ๊ฑฐ ์์, ๋ณด๋ฅ |
์ ์ฉ ์์๋ ์ ์๋ฒ๋๋ก ํ ๋ฒ์ ํ๋๋ง ์ ์ฉํ๊ณ , ๊ฐ์ ์๋๋ฆฌ์คยท๊ฐ์
RUN_ID ๊ท์น์ผ๋ก ์ฌ์ธก์ ํ๋ค.
8. ์ธก์ ์ ์ ๋ขฐ ๋ฒ์
8.1 ํฝ์ค์ฒ์ ์ค์ ์๋น์ค์ ์ฐจ์ด
์ธก์ ๋์์ perf/ws-lab/demo ํฉ์ฑ ํฝ์ค์ฒ๋ค. ์ค์ moyeota/be๊ฐ ์๋๋ค.
- fan-out์ด ์๋ค. ํธ๋ค๋ฌ๊ฐ ๋ฐ์ ์์๊ฒ๋ง ACK/echo๋ฅผ ๋ณด๋ธ๋ค. 4์ธ ํ์์ 1๊ฑด์ด 3๋ช ์๊ฒ ์ ๋ฌ๋๋ ๋น์ฉ(ยง5.3์ 3๋ฐฐ)์ ๋ฏธ์ธก์ ์ด๋ค.
- ๋ฐฉ(room) ๊ฐ๋ ์ด ์์ด "ํ ๋ฐฉ ์ง์ค โ ์ฌ๋ฌ ๋ฐฉ ๋ถ์ฐ" ์ถ์ ์ธก์ ํ์ง ๋ชปํ๋ค.
- ์ธ์ฆยท๊ถํ ๊ฒ์ฆ์ด ์๋ค(ํ ํฐ ๋ฏธ์ฌ์ฉ). ์ค์ ํ ํฐ ๊ฒ์ฆ CPU๋ ๋น ์ ธ ์๋ค.
- ํผ์ก๋ ์ธ๋ถ API(FastAPIยทLLM) ํธ์ถ ๊ฒฝ๋ก๊ฐ ์๋ค.
chat_hold_ms=50,lock_hold_ms=100์Thread.sleepํฉ์ฑ ์ง์ฐ์ด๋ค.- ์กฐํ endpoint๊ฐ ์ค์ ์ฟผ๋ฆฌ๋ณด๋ค ๋จ์ํ๋ค. ยง2.2์ ยง3.6์ ์ ๋ RPS๋ ์ํ ๋ณด์ฆ๊ฐ์ด ์๋๋ค.
8.2 ํ์ธ๋ ๊ณ์ธก ์ค๋ฅ (๊ฒฐ๋ก ์ ์ฌ์ฉํ์ง ์์ ๊ฐ)
| ๊ฐ | ๋ฌธ์ | ๋์ |
|---|---|---|
derived-*.csv์ rest_p95_ms |
๊ฑฐ์ ๋ชจ๋ ๊ตฌ๊ฐ์์ 0.95 ms ๊ณ ์ โ ํ์คํ ๊ทธ๋จ ๋ถ์ ์ฐ์ ์ค๋ฅ | ์ง์ฐ์ k6 ํด๋ผ์ด์ธํธ ๊ฐ๋ง ์ฌ์ฉ |
nginx_cpu_cores |
์ ๊ตฌ๊ฐ 0.0004 cores ๊ณ ์ โ ์๋ฆฌ์ฆ ๋งค์นญ ์ค๋ฅ ์์ฌ | ยง5.1์์ Nginx๋ฅผ ์์ธ์ผ๋ก ์ง๋ชฉํ์ง ์์ |
chat_errorsยทseat_errors |
15~20์ด ์ฐฝ์์ increase()๊ฐ 0 ๋ฐํ |
์๋ฒ 5xx rate๋ก ๋์ฒด |
| WS ์ค๋ฅ์จ 53~57% | ์คํจ ํ ์ฌ์ ์์ ๋ฐ๋ณตํด ๋ถ๋ชจ๊ฐ ์ปค์ง(ws_connections_opened 39,098) |
๋์ ์ฐ๊ฒฐ ์ต๋๊ฐ(lab_ws_connections)์ 1์ฐจ ๊ทผ๊ฑฐ๋ก ์ฌ์ฉ |
URI๋ณ ๋ถ๋ฆฌ๊ฐ ํ์ํ ๊ตฌ๊ฐ์ ๋ค์ ์ฟผ๋ฆฌ๋ก ์ฌ์ง๊ณํด์ผ ํ๋ค.
histogram_quantile(0.95, sum by (le) (rate(http_server_requests_seconds_bucket{uri!~"/actuator.*"}[1m])))
8.3 ์ธก์ ์ฐฝ๊ณผ ๋์กฐ๊ตฐ์ ์ฝ์
- ๋ธ๋ก๋น 75~150์ด, ๋ฐ๋ณต 1ํ.
g-c3-repeat๋๋น ๋ณ๋ 8%๋ฅผ ๊ด์ธกํ์ผ๋ฏ๋ก 30% ๋ฏธ๋ง ์ฐจ์ด๋ ํ์ ์ ์ฐ์ง ์์๋ค. - 30๋ถ idle hold์ soak์ด ์์ด ์ฐ๊ฒฐ ๋์ยท์๋งํ heap ์ฆ๊ฐ๋ ๋ฏธ๊ฒ์ถ์ด๋ค. working set์ด ์ธ์ ์ ๋ฐ์ 576 โ 651 MB๋ก ์์นํ์ผ๋(limit 768 MB) ์์ธ์ ๋์๋ก ๋จ์ ํ ์ ์๋ค.
c3ยทc4ยทd1ยทg๊ฐ ๋ชฉํ 120 msg/s์ ๋ํด 42~47 msg/s๋ง ๋ฌ์ฑํ๋ค. ๋ฉ์์ง์จ ์ถ์ด ๊ณ ์ ๋์ง ์์๋ค.- ๋ถ์ฐ ํ ๋์กฐ๊ตฐ(
e-dist-c50)์ ํ์ด 2๊ฐ๋ฟ์ด์ด์ ๋์กฐ๊ฐ ์ฝํ๋ค. - CPU credit ์๋์ ๊ธฐ๋กํ์ง ๋ชปํ๋ค. ์ธ์
ํ๋ฐ ๋ธ๋ก(
f,g)์ด credit ์ํฅ์ ๋ฐ์๋์ง ํ์ธํ ์ ์๋ค. - ์๋ฒ ์ค์ ์ถ(ํ 10โ20,
WS_PER_CONNECTION_BYTES,-Xmx)์ ์ฌ๋ฐฐํฌ๊ฐ ํ์ํด ์ด ์ฐฝ์์ ๋ค๋ฃจ์ง ์์๋ค.
8.4 ๋ค์ ์ธก์ ์ฐฝ์ 1์์ โ ์ฐ๊ฒฐ ์ํ 1,700์ ์์ธ ๊ท๋ช
ยง5.1์ ๋ถ์ผ์น๋ฅผ ํด์ํ์ง ๋ชปํ๋ฉด ยง7์ 6๋ฒ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ค. ์์๋๋ก ์ํํ๋ค.
- ์ฐ๊ฒฐ์ 1,500 โ 1,600 โ 1,700 โ 1,800์ผ๋ก 100๊ฐ ๋จ์๋ก ์ฌ๋ฆฌ๋ฉฐ Nginx ์ปจํ ์ด๋์ working set๊ณผ CPU๋ฅผ ํจ๊ป ๋ณธ๋ค (128 MB ํ๋ ๊ฐ์ค ๊ฒ์ฆ).
- ๊ฐ์ ๊ตฌ๊ฐ์์ Nginx error log์
node_netstat_TcpExt_ListenOverflows, ํธ์คํธ ์์ผ ์ยทFD๋ฅผ ํ์ธํ๋ค. - Nginx๋ฅผ ์ฐํํด Spring์ ์ง์ (๋ด๋ถ ๊ฒฝ๋ก) ์ฐ๊ฒฐ์ ์ฌ๋ ค ๋์ผ ์ํ์ด ์ฌํ๋๋์ง ๋ณธ๋ค. ์ฌํ๋๋ฉด Spring, ์ฌํ๋์ง ์์ผ๋ฉด Nginx๋ค.
- ๋ก์ปฌ ๋ฐ์๊ธฐ๋ฅผ 2๋๋ก ๋๋ ๊ฐ์ ์ํ์ด ๋์ค๋์ง ํ์ธํ๋ค(๋ฐ์๊ธฐ ๋ฐฐ์ ).
- ์์ธ์ด Nginx ๋ฉ๋ชจ๋ฆฌ๋ฉด
proxy_buffering offยท๋ฒํผ ์ถ์ ๋๋ Nginx ์์ ์ฆ์ค๋ก, Spring์ด๋ฉด WS ๊ฒ์ดํธ์จ์ด ๋ถ๋ฆฌ๋ก ๊ฐ๋ค.
8.5 ๊ทธ ์ธ ๋จ์ ํญ๋ชฉ
- fan-out ๋น์ฉ(์์ ์ 1ยท3ยท9๋ช ) โ ํธ๋ค๋ฌ์ ๋ฐฉยท์ธ์ ๋ ์ง์คํธ๋ฆฌ ์ถ๊ฐ ํ ์ธก์
- ํผ์ก๋ API ๋ถํ (
K=1ยท5) - ํ์ฌ burst ์ผ๊ฐํ ๋ถํ 140 RPS
- ์ฅ์ ยท๋ณต๊ตฌ RTO/RPO
- ํ ํฌ๊ธฐ ๋์กฐ(10โ20)์
-Xmx์กฐ์ ์คํ