404 V1 limit analysis report outline - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki

404 V1 ํ•œ๊ณ„ ๋ถ„์„ ๋ณด๊ณ ์„œ โ€” ๋ฌธ์„œ ๊ณจ๊ฒฉ

์ด ๋ฌธ์„œ๋Š” ๋‚ด์šฉ์„ ์“ฐ๊ธฐ ์ „์— ๋ชฉ์ฐจ์™€ ๊ฐ ์ ˆ์ด ๋ฌด์—‡์„ ์ฆ๋ช…ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ณ ์ •ํ•œ ๊ฒƒ์ด๋‹ค. ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์„ค๊ณ„ยท์‹คํ–‰์€ 403์—, V1/V2 ํ๋ฆ„๋„๋Š” KTB4-๋ชจ์—ฌํƒ€-v1-v2-lock-flow.drawio์— ์žˆ๋‹ค.

0. ์ž‘์„ฑ ๊ทœ์น™

0.1 ๋ชจ๋“  ์žฅ์€ ๊ฐ™์€ ์‚ฌ์Šฌ์„ ๋”ฐ๋ฅธ๋‹ค

์„œ๋น„์Šค ํŠน์„ฑ๋งŒ ์“ฐ๊ณ  ๋๋‚ด๋ฉด ์•ˆ ๋œ๋‹ค. ๊ฐ ์žฅ์€ ์˜ˆ์™ธ ์—†์ด 7๊ฐœ ์†Œ์ ˆ์„ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฐ€์ง€๋ฉฐ, ์•ž ์†Œ์ ˆ์ด ๋’ค ์†Œ์ ˆ์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค.

โ‘  ์„œ๋น„์Šค ๋™์ž‘ (์œ ์ €ํ”Œ๋กœ์šฐ์˜ ์–ด๋А ๊ตฌ๊ฐ„)
    โ†“ ๊ทธ๋ž˜์„œ ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์˜ค๋Š”๊ฐ€
โ‘ก ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ ์ง€ํ‘œ (์ˆซ์ž)
    โ†“ ๊ทธ๋ž˜์„œ ์–ด๋–ค ์„ฑ๊ฒฉ์˜ ๋ถ€ํ•˜์ธ๊ฐ€
โ‘ข ๋ถ€ํ•˜ ํŠน์„ฑ (์š”์ฒญ ์œ ํ˜• ยท ๋™์‹œ์„ฑ ยท ์ง€์†์‹œ๊ฐ„ ยท ๋ฐ์ดํ„ฐ ํฌ๊ธฐ)
    โ†“ ๊ทธ๋ž˜์„œ ์–ด๋–ค ์ž์›์„ ์“ฐ๋Š”๊ฐ€
โ‘ฃ ์‚ฌ์šฉํ•˜๋Š” ์ธํ”„๋ผ ์ž์› (๊ฒฝ๋กœ + ์ž์› ์ข…๋ฅ˜ + V1 ๋ฐฐ์ •๋Ÿ‰)
    โ†“ ๊ทธ๋ž˜์„œ ๋ฌด์—‡์„ ์žฌ์•ผ ํ•˜๋Š”๊ฐ€
โ‘ค ์ธก์ • ์„ค๊ณ„ (์‹œ๋‚˜๋ฆฌ์˜ค ยท ๋ถ€ํ•˜ ๋‹จ๊ณ„ ยท control/treatment)
    โ†“ ์‹ค์ œ๋กœ ๋ฌด์—‡์ด ๋ณ€ํ–ˆ๋Š”๊ฐ€
โ‘ฅ ์ธก์ • ๊ฒฐ๊ณผ (์ง€ํ‘œ ๋ณ€ํ™” ยท ์ตœ์ดˆ ํฌํ™” ์ž์› ยท C_knee)
    โ†“ ๊ทธ๋ž˜์„œ ๋ฌด์—‡์„ ๋ฐ”๊พธ๋Š”๊ฐ€
โ‘ฆ ํŒ์ •๊ณผ ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ

โ‘ฆ์„ ์“ธ ์ˆ˜ ์—†๋Š” ์žฅ์€ โ‘ค๊ฐ€ ์ž˜๋ชป ์„ค๊ณ„๋œ ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ โ‘ก์˜ ์ˆซ์ž ์—†์ด โ‘ฅ์˜ ๊ฒฐ๊ณผ๋งŒ ์žˆ์œผ๋ฉด "์ด ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•œ๊ฐ€"๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค.

0.2 ๊ฐ ์žฅ์˜ ์ฒซ ์ค„์€ ํ•œ ์ค„ ๊ฒฐ๋ก 

๋…์ž๊ฐ€ ์‚ฌ์Šฌ์„ ๋จผ์ € ๋ณด๊ฒŒ ํ•œ๋‹ค.

๊ฒฐ๋ก . ์ฑ„ํŒ… ์—ฐ๊ฒฐ N๊ฐœ์—์„œ heap์ด X MB/์—ฐ๊ฒฐ๋กœ ์ฆ๊ฐ€ํ•ด -Xmx512m์˜ Y%๋ฅผ ์ ์œ ํ•˜๊ณ , ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์˜ REST p95๊ฐ€ Z% ์•…ํ™”๋œ๋‹ค. โ†’ WebSocket์„ ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

0.3 ์ˆซ์ž์—๋Š” ์ถœ์ฒ˜๋ฅผ ๋ถ™์ธ๋‹ค

์ข…๋ฅ˜ ํ‘œ๊ธฐ ๋ฐฉ๋ฒ•
ํŠธ๋ž˜ํ”ฝ ๊ฐ€์ • ๋‚ด๋ถ€ ๊ฐ€์ •์ธ์ง€ ์™ธ๋ถ€ ๊ณต๊ฐœ๊ฐ’์ธ์ง€ ๋ช…์‹œ, ๊ณ„์‚ฐ์‹ ๋…ธ์ถœ
๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์‹ค์ธก RUN_ID + ์ธก์ •์ฐฝ ๊ธธ์ด + ๋ฐ˜๋ณต ํšŸ์ˆ˜
์ธํ”„๋ผ ์ง€ํ‘œ ์ง€ํ‘œ ์ด๋ฆ„(PromQL) + Grafana ํŒจ๋„ ์ด๋ฆ„
ํŒŒ์ƒ๊ฐ’ ๊ณ„์‚ฐ์‹ (403 ยง2.2)

๋‹จ์ผ ์ธก์ •(๋ฐ˜๋ณต ์—†์Œ)์€ ๊ทธ ์‚ฌ์‹ค์„ ํ‘œ์— ๋‚จ๊ธฐ๊ณ , ์ง€์—ฐ ์ฐจ์ด๋Š” 30% ์ด์ƒ์ผ ๋•Œ๋งŒ ์‹ค์žฌ๋กœ ์ธ์ •ํ•œ๋‹ค. CPU credit ์†Œ๋ชจ ๊ตฌ๊ฐ„์˜ ์ €ํ•˜๋Š” ์šฉ๋Ÿ‰ ํ•œ๊ณ„๋กœ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.


1. ์„œ๋น„์Šค ๊ฐœ์š”์™€ ์œ ์ €ํ”Œ๋กœ์šฐ

๋ชฉ์ : ์ดํ›„ ๋ชจ๋“  ์žฅ์˜ โ‘ ์ด ์ฐธ์กฐํ•  ๊ตฌ๊ฐ„ ์ด๋ฆ„์„ ํ™•์ •ํ•œ๋‹ค.

  • 1.1 ์„œ๋น„์Šค ์ •์˜ โ€” ํŒ๊ต ์ถœํ‡ด๊ทผ ๋งค์นญยท์ฑ„ํŒ…ยท์ •์‚ฐยท๊ฒŒ์‹œ๊ธ€
  • 1.2 ์œ ์ €ํ”Œ๋กœ์šฐ (๋…ธ์…˜ ์œ ์ €ํ”Œ๋กœ์šฐ ๋‹ค์ด์–ด๊ทธ๋žจ ์‚ฝ์ž…)
    • ๊ฐ ๊ตฌ๊ฐ„์— ์ด ๋ฌธ์„œ์—์„œ ์“ธ ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค: ํƒ์ƒ‰ยท์กฐํšŒ / ํŒŸ ์ƒ์„ธ / ์ฐธ์—ฌ ์š”์ฒญ / ์ขŒ์„ ์Šน์ธ / ์ฑ„ํŒ… ์—ฐ๊ฒฐ / ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ / ์ •์‚ฐ / ํ˜ผ์žก๋„ ์กฐํšŒ
  • 1.3 ๊ตฌ๊ฐ„๋ณ„ ๊ธฐ๋Šฅ ์š”๊ตฌ์™€ ์‹ค์‹œ๊ฐ„์„ฑ ์š”๊ตฌ
    • ์–ด๋А ๊ตฌ๊ฐ„์ด ๋™๊ธฐ ์‘๋‹ต์ด์–ด์•ผ ํ•˜๋Š”์ง€, ์–ด๋А ๊ตฌ๊ฐ„์ด ์ง€์—ฐ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€. ์ด ํŒ๋‹จ์ด 7์žฅยท8์žฅ์˜ "๋น„๋™๊ธฐํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€" ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค.
  • 1.4 V1 ์•„ํ‚คํ…์ฒ˜ (drawio: AWS ์„œ๋น„์Šค ๋ฐฐ์น˜)
    • ๋‹จ์ผ AZ ยท Public Subnet ยท Prod/Dev EC2 2๋Œ€ ยท ์ปจํ…Œ์ด๋„ˆ 4๊ฐœ

โ‘ ์— ์“ธ ๋ฌธ์žฅ ํ˜•ํƒœ: "์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ… ์—ฐ๊ฒฐ ๊ตฌ๊ฐ„์— ์ง„์ž…ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ Nginx๋ฅผ ๊ฑฐ์ณ Spring Boot์— WebSocket ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๋งค์นญ ์„ฑ์‚ฌ๊นŒ์ง€ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ๋‹ค."

2. ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ ์ง€ํ‘œ

๋ชฉ์ : ์ดํ›„ ๋ชจ๋“  ์žฅ์˜ โ‘ก๊ฐ€ ์ฐธ์กฐํ•  ๊ธฐ์ค€ ์ˆซ์ž๋ฅผ ํ•œ๊ณณ์— ๋‘”๋‹ค.

  • 2.1 V1 ๊ทœ๋ชจ ๊ฐ€์ • โ€” DAU 1,500 / ํ”ผํฌ ์กฐํšŒ 1.25 RPS / ์“ฐ๊ธฐ 0.27 RPS
  • 2.2 V2 ์„ฑ์žฅ ๊ฐ€์ • โ€” ์ˆ˜๋„๊ถŒ ์—…๋ฌด์ง€๊ตฌ 6๊ฐœ ๊ฑฐ์  / MAU 115๋งŒ / DAU 3.6๋งŒ
  • 2.3 DAU โ†’ RPS ํ™˜์‚ฐ์‹๊ณผ ๊ทผ๊ฑฐ (402 ยง2 ์žฌ์‚ฌ์šฉ, ์™ธ๋ถ€ ๊ณต๊ฐœ๊ฐ’๊ณผ ๋‚ด๋ถ€ ๊ฐ€์ • ๋ถ„๋ฆฌ)
  • 2.4 ๊ตฌ๊ฐ„๋ณ„ ํŠธ๋ž˜ํ”ฝ ๋ถ„ํ•ดํ‘œ โ† ๊ฐ ์žฅ์˜ โ‘ก๊ฐ€ ์ด ํ‘œ์˜ ํ•œ ํ–‰์„ ๊ฐ€์ ธ๊ฐ„๋‹ค
๊ตฌ๊ฐ„ ํ”ผํฌ RPS ๋˜๋Š” ๋™์‹œ์„ฑ ์‚ฐ์ถœ ๊ทผ๊ฑฐ ๊ด€๋ จ ์žฅ
ํƒ์ƒ‰ยท์กฐํšŒ 14.0 RPS ์„ธ์…˜๋‹น 4๊ฑด ร— ํ”ผํฌ ์„ธ์…˜๋ฅ  9์žฅ
ํŒŸ ์ƒ์„ธ 14.0 RPS ์„ธ์…˜๋‹น 4๊ฑด 9์žฅ
ํ˜ผ์žก๋„ ์กฐํšŒ 10.5 RPS ์„ธ์…˜๋‹น 3๊ฑด (๋ฒ”์œ„ ๋ฐ–)
์ฐธ์—ฌยท์Šน์ธ ์“ฐ๊ธฐ 3.5 RPS, ์ธ๊ธฐํŒŸ ๋™์‹œ N๊ฑด ์„ธ์…˜๋‹น 1๊ฑด + ์ธ๊ธฐํŒŸ ์ง‘์ค‘ 7์žฅ
์ฑ„ํŒ… ์—ฐ๊ฒฐ ๋™์‹œ 1,800 (1,575~2,100) ์ด๋ฒคํŠธ ์‚ฌ์šฉ์ž 50% ์ ‘์† 3ยท4ยท8์žฅ
์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ 36 msg/s (inbound) ์ ‘์†์ž 10๋ถ„๊ฐ„ 6๊ฑด 5ยท6์žฅ
ํ–‰์‚ฌ ์ข…๋ฃŒ burst 180 RPS ์‚ผ๊ฐํ˜• ๋ถ€ํ•˜, 10๋ถ„ (๋ฒ”์œ„ ๋ฐ–)
  • 2.5 ์ด๋ฒˆ ์ธก์ •์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์€ ๊ตฌ๊ฐ„๊ณผ ์ด์œ  (ํ˜ผ์žก๋„ ์™ธ๋ถ€ API, burst)

3. ์ฑ„ํŒ… ์—ฐ๊ฒฐ ์œ ์ง€ โ€” ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ Spring ์ž์›์„ ์ ์œ ํ•˜๋Š”๊ฐ€

  • 3.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ์ฑ„ํŒ… ์—ฐ๊ฒฐ ๊ตฌ๊ฐ„, ๋งค์นญ ์„ฑ์‚ฌ๊นŒ์ง€ ์—ฐ๊ฒฐ ์œ ์ง€, 1์‹œ๊ฐ„ ๋ฌดํ™œ๋™ ์‹œ ์ข…๋ฃŒ
  • 3.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” ๋™์‹œ 1,800 ์—ฐ๊ฒฐ (ํƒ์ƒ‰ ๋ฒ”์œ„ 3,000)
  • 3.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์žฅ์‹œ๊ฐ„ ์œ ์ง€๋˜๋Š” ์ƒํƒœ ๋ณด์œ ํ˜• ๋ถ€ํ•˜. ์š”์ฒญ๋Ÿ‰์ด ์•„๋‹ˆ๋ผ ์„ธ์…˜ ์ˆ˜๊ฐ€ ์ž์›์„ ์ ์œ ํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์–ด๋„ ๋น„์šฉ์ด 0์ด ์•„๋‹ˆ๋‹ค.
  • 3.4 ์‚ฌ์šฉํ•˜๋Š” ์ธํ”„๋ผ ์ž์›
    ํด๋ผ์ด์–ธํŠธ โ†’ Nginx(0.25 CPU/128MB, FD 2๊ฐœ/์—ฐ๊ฒฐ)
              โ†’ Spring Boot(0.75 CPU/768MB, -Xmx512m, Tomcat max-connections 8192, FD 16384)
    ์ž์›: JVM heap(์„ธ์…˜ ๊ฐ์ฒด) ยท direct buffer(NIO) ยท FD ยท Tomcat ์ปค๋„ฅ์…˜ ์Šฌ๋กฏ
    
  • 3.5 ์ธก์ • ์„ค๊ณ„ โ€” ws-connect.js, 0โ†’3,000 ์„ ํ˜• ๋žจํ”„. ๋žจํ”„๋ฅผ ๋…๋ฆฝ๋ณ€์ˆ˜๋กœ ์จ์„œ lab_ws_connections ๋Œ€๋น„ ์ž์›์„ ํšŒ๊ท€ํ•œ๋‹ค. REST ์—†์Œ(์ˆœ์ˆ˜ ๋‹จ๊ฐ€). RUN_ID=a-ramp3000
  • 3.6 ์ธก์ • ๊ฒฐ๊ณผ
    ์ง€ํ‘œ ์ถœ์ฒ˜ ๊ฐ’
    ์—ฐ๊ฒฐ๋‹น heap collect-window.py ๋žจํ”„ ํšŒ๊ท€ heap_bytes_per_conn
    ์—ฐ๊ฒฐ๋‹น direct ๋™ direct_bytes_per_conn
    1,000 ์—ฐ๊ฒฐ๋‹น CPU ๋™ cpu_cores_per_1k_conn
    ์—ฐ๊ฒฐ 3,000์—์„œ working set backend_ws_mb (ํ•œ๊ณ„ 768MB)
    ์ˆ˜์šฉ ๊ฐ€๋Šฅ ์—ฐ๊ฒฐ ์ƒํ•œ (512MBร—0.7 โˆ’ ๊ธฐ์ € heap) รท ์—ฐ๊ฒฐ๋‹น heap
    • ๊ทธ๋ž˜ํ”„: JVM heap used, Container working-set memory, Container CPU cores
  • 3.7 ํŒ์ •๊ณผ ๋ณ€๊ฒฝ โ€” ์ƒํ•œ์ด ์˜ˆ์ธก ํ”ผํฌ 2,100์„ ๋ฐ‘๋Œ๋ฉด ์—ฐ๊ฒฐ ์ˆ˜ ์ž์ฒด๊ฐ€ V1 ํ•œ๊ณ„. ์„ ํƒ์ง€: WS ํ”„๋กœ์„ธ์Šค ๋ถ„๋ฆฌ / backend ๋ฉ”๋ชจ๋ฆฌ ์ฆ์„ค / ์„ธ์…˜ ์ƒํƒœ ์ถ•์†Œ. ์žฌ๊ฒ€์ฆ ๋ฐฉ๋ฒ•๋„ ํ•จ๊ป˜ ์ ๋Š”๋‹ค.

4. ์ฑ„ํŒ…๋ฐฉ ์ง„์ž… ํญ์ฃผ โ€” ์—ฐ๊ฒฐ ์‹œ๋„์œจ์ด ์ง„์ž… ๊ณ„์ธต์„ ํฌํ™”์‹œํ‚ค๋Š”๊ฐ€

  • 4.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ๋งค์นญ ์„ฑ์‚ฌยทํ–‰์‚ฌ ์ข…๋ฃŒ ์งํ›„ ๋‹ค์ˆ˜๊ฐ€ ๋™์‹œ์— ์ฑ„ํŒ…๋ฐฉ ์ง„์ž…
  • 4.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” 6 conn/s (peak 7), ํƒ์ƒ‰ 20ยท50ยท100ยท200 conn/s
  • 4.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์งง๊ณ  ๋น„์‹ผ ์ˆœ๊ฐ„ ๋ถ€ํ•˜. ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ๋งˆ๋‹ค TLS ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
  • 4.4 ์ธํ”„๋ผ ์ž์› โ€” Nginx 0.25 CPU ยท worker_processes 1 ยท accept queue ยท listen backlog. ์ด ๊ณ„์ธต์ด Spring๋ณด๋‹ค ๋จผ์ € ํฌํ™”๋  ์ˆ˜ ์žˆ๋‹ค
  • 4.5 ์ธก์ • ์„ค๊ณ„ โ€” ์—ฐ๊ฒฐ 1,000 ๊ณ ์ •, CONNECT_RATE 20/100/200. ์ธก์ •์ฐฝ์€ ramp ๊ตฌ๊ฐ„. RUN_ID=b-rate20|100|200
  • 4.6 ๊ฒฐ๊ณผ โ€” handshake(ws_connecting) p95/p99, 101 ์„ฑ๊ณต๋ฅ , nginx_cpu_cores, Nginx active/reading/writing/waiting, listen overflow
  • 4.7 ํŒ์ • โ€” Nginx CPU๊ฐ€ ๋จผ์ € quota๋ฅผ ์ฑ„์šฐ๋ฉด ํ•œ๊ณ„๋Š” ์ง„์ž… ๊ณ„์ธต์ด๋‹ค. ๋ณ€๊ฒฝ: Nginx CPUยทworker ์žฌ๋ฐฐ๋ถ„ / TLS ์ข…๋ฃŒ ์œ„์น˜ ๋ณ€๊ฒฝ / ALB ๋„์ž… ๊ฒ€ํ† 

5. ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์œ ํ˜• โ€” ๋ฌด์—‡์ด CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋จน๋Š”๊ฐ€

  • 5.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๊ตฌ๊ฐ„. ๊ธด ์•ˆ๋‚ดยท์ •์‚ฐ ๋‚ด์—ญ๊ณผ ์งง์€ ๋Œ€ํ™”๊ฐ€ ์„ž์ธ๋‹ค
  • 5.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” 36 msg/s (ํƒ์ƒ‰ 120), 4์ธ ํŒŸ
  • 5.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ๋‘ ์ถ•์ด ์„ž์ธ ๋ถ€ํ•˜. ๋ฉ”์‹œ์ง€ ๊ฑด์ˆ˜์™€ payload ๋ฐ”์ดํŠธ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋น„์šฉ์„ ๋งŒ๋“ ๋‹ค. ๋‘˜์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์›์ธ์„ ๋ชป ์ฐพ๋Š”๋‹ค
  • 5.4 ์ธํ”„๋ผ ์ž์› โ€” Spring ์Šค๋ ˆ๋“œยทํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌยท์—ญ์ง๋ ฌํ™”(๊ฑด์ˆ˜) / ๋ฒ„ํผยท์ง๋ ฌํ™”ยท๋„คํŠธ์›Œํฌ(๋ฐ”์ดํŠธ) / heap allocation rate์™€ GC
  • 5.5 ์ธก์ • ์„ค๊ณ„ โ€” 2ร—2 ์š”์ธ ์„ค๊ณ„, 120 msg/s ๊ณ ์ •, echo ๊ฒฝ๋กœ(์ €์žฅ ์—†์Œ)
    ์…€ ์—ฐ๊ฒฐ payload RUN_ID
    ๊ธฐ์ค€ 200 256 B c1-200c-256b
    ํฐ ์ปจํ…์ŠคํŠธยท์ ์€ ์—ฐ๊ฒฐ 200 8,000 B c2-200c-8000b
    ์งง์€ ๋ฉ”์‹œ์ง€ยท๋งŽ์€ ์—ฐ๊ฒฐ 1,800 256 B c3-1800c-256b
    ๊ต์ฐจ 1,800 8,000 B c4-1800c-8000b
  • 5.6 ๊ฒฐ๊ณผ โ€” ํšŒ๊ท€ CPU โ‰ˆ a + bยทR + cยท(Rร—S)๋กœ ๋ฉ”์‹œ์ง€๋‹น CPU-ms์™€ KB๋‹น CPU-ms๋ฅผ ๋ถ„๋ฆฌ. GC pauseยทallocation rate ๋น„๊ต. ๋ฐ˜๋ณต์€ g-c3-repeat
  • 5.7 ํŒ์ • โ€” b ์ง€๋ฐฐ โ†’ ๋ฐฐ์นญยทACK ๊ฒฝ๋Ÿ‰ํ™” / c ์ง€๋ฐฐ โ†’ payload ์ƒํ•œยท์••์ถ•ยท๋ณธ๋ฌธ ๋ถ„๋ฆฌ

6. ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์˜์†ํ™” โ€” ๋น„๋™๊ธฐยท์บ์‹œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

  • 6.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ๋ฉ”์‹œ์ง€ ์ €์žฅ ํ›„ ์ „๋‹ฌ(ํ˜„์žฌ๋Š” ์ปค๋ฐ‹ ํ›„ ACK)
  • 6.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” 36 msg/s (ํƒ์ƒ‰ 120)
  • 6.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์‘๋‹ต ๊ฒฝ๋กœ๊ฐ€ DB ํŠธ๋žœ์žญ์…˜์— ๋ฌถ์ธ ๋ถ€ํ•˜. ์ปค๋„ฅ์…˜ ์ ์œ ์‹œ๊ฐ„์ด ๊ณง ์ฒ˜๋ฆฌ๋Ÿ‰ ์ƒํ•œ์„ ๋งŒ๋“ ๋‹ค
  • 6.4 ์ธํ”„๋ผ ์ž์› โ€” HikariCP 10๊ฐœ(์—ฐ๊ฒฐ ํš๋“ ํƒ€์ž„์•„์›ƒ 1s) ยท MySQL 0.5 CPU ยท redoยทfsync ยท EBS. ์ด ํ’€์„ REST ์กฐํšŒยท์Šน์ธ๊ณผ ๊ณต์œ ํ•œ๋‹ค
  • 6.5 ์ธก์ • ์„ค๊ณ„ โ€” ์ €์žฅ ์—†์Œ(5์žฅ c3) โ†’ ์ €์žฅ(d1-save-h50) โ†’ ์ €์žฅ+REST(d2-*, control d0-rest-control). chat_hold_ms๋กœ ์ ์œ ์‹œ๊ฐ„ ์กฐ์ ˆ
  • 6.6 ๊ฒฐ๊ณผ โ€” chat_commit_p95_ms, hikari_pending_max, hikari_acquire_p95_ms, chat_errors, ๋ณ‘ํ–‰ REST p95ยท5xx. ์˜ˆ์ธก(10 รท ์ ์œ ์‹œ๊ฐ„)๊ณผ ์‹ค์ธก ๋น„๊ตํ‘œ
  • 6.7 ํŒ์ • โ€” ํ’€ ๋Œ€๊ธฐ ์ง€๋ฐฐ โ†’ ์ €์žฅ ๋น„๋™๊ธฐํ™”(ํ+๋ฐฐ์น˜ insert) / MySQL I/O ์ง€๋ฐฐ โ†’ ๋ฐฐ์น˜ ์ปค๋ฐ‹ยทDB ๋ถ„๋ฆฌ / ์กฐํšŒ ์•…ํ™” โ†’ ์บ์‹œยท์ฝ๊ธฐ ํ’€ ๋ถ„๋ฆฌ

7. ์ธ๊ธฐ ํŒŸ ์ขŒ์„ ์Šน์ธ ๊ฒฝํ•ฉ โ€” ์‚ฌ์šฉ์ž ์ฆ๊ฐ€๊ฐ€ ๋‹ค๋ฅธ API๋ฅผ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š”๊ฐ€

drawio์˜ "V2 ํŠธ๋ž˜ํ”ฝ ์‹œ๋‚˜๋ฆฌ์˜ค โ€” ์ธ๊ธฐํŒŸ ์ขŒ์„ Lock ๊ฒฝํ•ฉ" ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฒ€์ฆํ•˜๋Š” ์žฅ.

  • 7.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ์ขŒ์„ ์Šน์ธ ๊ตฌ๊ฐ„. ๋™์ผ pod_id์— ์š”์ฒญ์ด ์ง‘์ค‘๋œ๋‹ค
  • 7.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” ์“ฐ๊ธฐ 3.5 RPS์ด์ง€๋งŒ ์ธ๊ธฐํŒŸ์€ ๊ฐ™์€ ํ–‰์— ๋™์‹œ N๊ฑด
  • 7.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์ง๋ ฌํ™”๋˜๋Š” ๊ฒฝํ•ฉ ๋ถ€ํ•˜. RPS๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์‹œ ๋„์ฐฉ ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜. ๋Œ€๊ธฐ ์ค‘์—๋„ ์ปค๋„ฅ์…˜์„ ์ ์œ ํ•œ๋‹ค
  • 7.4 ์ธํ”„๋ผ ์ž์› โ€” SELECT ... FOR UPDATE row lock ยท innodb_lock_wait_timeout 3s ยท ๊ณต์šฉ Hikari 10 ยท Spring ์Šค๋ ˆ๋“œ
  • 7.5 ์ธก์ • ์„ค๊ณ„ โ€” hot-row.js ๋™์ผ ํŒŸ ๋™์‹œ์„ฑ 5/20/50/100(e-same-c*), ๋ถ„์‚ฐ ํŒŸ ๋Œ€์กฐ๊ตฐ(e-dist-c50), REST ๋ณ‘ํ–‰(e-mix-*), control e0-rest-control
  • 7.6 ๊ฒฐ๊ณผ โ€” ๋‘ ์‹คํŒจ ๋ชจ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์ œ์‹œ
    ํ’€ timeout : ๋™์‹œ์„ฑ > 10 โ†’ ํš๋“ 1s ์ดˆ๊ณผ โ†’ 503
                 ์ฆ๊ฑฐ hikari_pending_max, hikari_acquire_p95_ms โ‰ˆ 1000ms
    lock wait  : ๋™์‹œ์„ฑ ร— lock_hold > 3s โ†’ 503
                 ์ฆ๊ฑฐ innodb_row_lock_current_waits, seat_lock_p95_ms โ‰ˆ 3000ms
    
    ์ •ํ•ฉ์„ฑ: approved + remaining == capacity, ์Œ์ˆ˜ ์ขŒ์„ยท์ค‘๋ณต ์Šน์ธ 0๊ฑด
  • 7.7 ํŒ์ • โ€” ๋™์ผ ํŒŸ๋งŒ ์•…ํ™”๋˜๊ณ  ๋ถ„์‚ฐ์€ ํ‰ํƒ„ โ†’ hot-row ๊ตฌ์กฐ ๋ณ€๊ฒฝ (Redis ์›์ž ์นด์šดํ„ฐยท๋ฉฑ๋“ฑํ‚คยท๋Œ€๊ธฐ์—ด). ๋ณ‘ํ–‰ REST๊นŒ์ง€ ์•…ํ™” โ†’ ํ’€ ๋ถ„๋ฆฌยทํƒ€์ž„์•„์›ƒ ์กฐ์ •

8. ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ์ด ์ผ๋ฐ˜ API์— ์ฃผ๋Š” ๊ฐ„์„ญ โ€” REST์™€ WS๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€

V2 ์„ค๊ณ„์˜ ํ•ต์‹ฌ ๊ฒฐ์ •์ด ๊ฑธ๋ฆฐ ์žฅ.

  • 8.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ์ฑ„ํŒ… ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์กฐํšŒยท์ƒ์„ธ๋ฅผ ํ˜ธ์ถœ
  • 8.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” WS 1,800~2,100 ์œ ์ง€ + REST 50 RPS
  • 8.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์ž์› ๊ณต์œ ํ˜• ๊ฐ„์„ญ. ๋‘ ๋ถ€ํ•˜๊ฐ€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋‹ค
  • 8.4 ์ธํ”„๋ผ ์ž์› โ€” ๊ฐ™์€ 0.75 CPU ยท ๊ฐ™์€ 512MB heap ยท ๊ฐ™์€ Tomcat ์Šค๋ ˆ๋“œ ยท ๊ฐ™์€ Hikari 10. frontendยทmysql์€ ๋ณ„๋„ quota์ด๋ฏ€๋กœ ํ•จ๊ป˜ ์•…ํ™”๋˜๋ฉด ์›์ธ์ด ๋‹ค๋ฅด๋‹ค
  • 8.5 ์ธก์ • ์„ค๊ณ„ โ€” control(f1c-rest-control) โ†’ WS 2,100 ์œ ์ง€ + ๋™์ผ REST(f1c-rest-treatment). ๋‘ ์‹คํ–‰์„ ์—ฐ์† ๋ฐฐ์น˜ํ•ด credit ์กฐ๊ฑด์„ ๋งž์ถค
  • 8.6 ๊ฒฐ๊ณผ
    ํ•ญ๋ชฉ control treatment ๋ณ€ํ™”์œจ
    REST p95 / p99 / ์˜ค๋ฅ˜์œจ
    backend CPU ยท throttling
    heap ยท GC pause ยท Tomcat busy
    frontend ยท mysql CPU (๊ฒฉ๋ฆฌ ํ™•์ธ)
    CPU credit balance (ํŽธํ–ฅ ํ™•์ธ)
  • 8.7 ํŒ์ • โ€” p95 20% ์ด์ƒ ์•…ํ™” + backend ์ž์› ์ƒ๊ด€ โ†’ WS ๋ถ„๋ฆฌ. frontendยทmysql ๋™๋ฐ˜ ์•…ํ™” โ†’ ํ˜ธ์ŠคํŠธ CPUยทcredit ๋ฌธ์ œ๋กœ ์žฌํ•ด์„

9. ์ผ๋ฐ˜ ์กฐํšŒ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ โ€” t3.medium ์ปจํ…Œ์ด๋„ˆ๋Š” ์–ด๋””์„œ ๊บพ์ด๋Š”๊ฐ€

  • 9.1 ์„œ๋น„์Šค ๋™์ž‘ โ€” ํƒ์ƒ‰ยท์กฐํšŒ, ํŒŸ ์ƒ์„ธ
  • 9.2 ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ โ€” ์กฐํšŒ 14 RPS + ์ƒ์„ธ 14 RPS, ํ˜ผํ•ฉ ํ”ผํฌ 45.5 RPS
  • 9.3 ๋ถ€ํ•˜ ํŠน์„ฑ โ€” ์ •์ƒ ์ƒํƒœ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ถ€ํ•˜. ์š”์ฒญ๋‹น ๋น„์šฉ์ด ๊ณง ์šฉ๋Ÿ‰์„ ์ •ํ•œ๋‹ค
  • 9.4 ์ธํ”„๋ผ ์ž์› โ€” DB ๋ฏธ์‚ฌ์šฉ ๊ฒฝ๋กœ(Spring CPUยทTomcat) vs DB ์‚ฌ์šฉ ๊ฒฝ๋กœ(+HikariยทMySQL)
  • 9.5 ์ธก์ • ์„ค๊ณ„ โ€” light 50โ†’700, detail 50โ†’300, ๊ฐ 90์ดˆ ๋‹จ๊ณ„, WS ์—†์Œ. RUN_ID=f-light-*, f-detail-*
  • 9.6 ๊ฒฐ๊ณผ โ€” RPSโ€“p95 ๊ณก์„ , ์š”์ฒญ๋‹น CPU-ms, quota ์ด๋ก  ์ƒํ•œ = 750 รท ์š”์ฒญ๋‹น CPU-ms, throttling ์‹œ์ž‘ RPS, C_knee/C_safe, credit balance ์ถ”์ด
  • 9.7 ํŒ์ • โ€” ๋ชฉํ‘œ ํ”ผํฌ ๋Œ€๋น„ ์—ฌ์œ ์œจ. light๋งŒ ํ‰ํƒ„ํ•˜๊ณ  detail์ด ๊บพ์ด๋ฉด ํ•œ๊ณ„๋Š” DB ๊ฒฝ๋กœ. ๋ณ€๊ฒฝ: ์ธ์Šคํ„ด์Šค ์ƒํ–ฅ / quota ์žฌ๋ฐฐ๋ถ„ / ์ฟผ๋ฆฌยท์ธ๋ฑ์Šคยท์บ์‹œ

10. V1 ํ•œ๊ณ„ ์ข…ํ•ฉ

  • 10.1 ์ตœ์ดˆ ํฌํ™” ์ž์› ์ˆœ์œ„ํ‘œ โ€” ์–ด๋А ๋ถ€ํ•˜๊ฐ€ ์–ด๋А ์ž์›์„ ๊ฐ€์žฅ ๋จผ์ € ํฌํ™”์‹œ์ผฐ๋Š”๊ฐ€ | ์ˆœ์œ„ | ๋ถ€ํ•˜ ํŠน์„ฑ | ์ตœ์ดˆ ํฌํ™” ์ž์› | C_knee | ๋ชฉํ‘œ ํ”ผํฌ ๋Œ€๋น„ ์—ฌ์œ  | ๊ทผ๊ฑฐ RUN_ID |
  • 10.2 ์žฅ์•  ์ „ํŒŒ ์ง€๋„ โ€” drawio ๊ฒฝ๋กœ์— ์‹ค์ธก๊ฐ’์„ ์–น์€ ๊ทธ๋ฆผ (์–ด๋А ์ง€ํ‘œ๊ฐ€ ๋ช‡์—์„œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋ฌด๋„ˆ๋œจ๋ ธ๋Š”๊ฐ€)
  • 10.3 V1์ด ๊ฐ๋‹น ๊ฐ€๋Šฅํ•œ ๊ทœ๋ชจ ์žฌ์‚ฐ์ • โ€” DAUยท๋™์‹œ ์—ฐ๊ฒฐยทRPS ๊ธฐ์ค€์œผ๋กœ

11. V2 ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ๊ฒฐ์ •

  • 11.1 ๊ฒฐ์ •ํ‘œ โ€” ์ฆ๊ฑฐ โ†’ ๋ณ€๊ฒฝ โ†’ ๊ธฐ๋Œ€ํšจ๊ณผ โ†’ ๊ฒ€์ฆ ๋ฐฉ๋ฒ• | ๊ด€์ธก ์ฆ๊ฑฐ(์žฅยท์ง€ํ‘œ) | ๊ตฌ์„ฑ ๋ณ€๊ฒฝ | ๊ธฐ๋Œ€ํšจ๊ณผ | ์žฌ๊ฒ€์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค |
  • 11.2 ๋ณ€๊ฒฝ์•ˆ ์ƒ์„ธ โ€” ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค ๋Œ€์•ˆ๊ณผ ํƒˆ๋ฝ ์ด์œ ๊นŒ์ง€ (RESTยทWS ๋ถ„๋ฆฌ / ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค / ์ €์žฅ ๋น„๋™๊ธฐํ™” / hot-row ๊ตฌ์กฐ / DB ๋ถ„๋ฆฌยทRDS / scale-outยทLB / ์ธ์Šคํ„ด์Šค ํƒ€์ž…)
  • 11.3 ์ ์šฉ ์ˆœ์„œ์™€ ๊ธฐ์ค€ โ€” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์ ์šฉํ•˜๊ณ  ๋™์ผ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์žฌ์ธก์ •
  • 11.4 V2 ๋ชฉํ‘œ SLO์™€ ์ˆ˜์šฉ ๊ธฐ์ค€

12. ์ธก์ •์˜ ํ•œ๊ณ„

๊ฒฐ๋ก ์˜ ์‹ ๋ขฐ ๋ฒ”์œ„๋ฅผ ์Šค์Šค๋กœ ๋ฐํžˆ๋Š” ์žฅ. ์ด๊ฑธ ๋นผ๋ฉด ์œ„์˜ ์ˆซ์ž๊ฐ€ ๊ณผ๋Œ€ํ‰๊ฐ€๋œ๋‹ค.

  • 12.1 ํ”ฝ์Šค์ฒ˜์™€ ์‹ค์ œ ์„œ๋น„์Šค์˜ ์ฐจ์ด โ€” fan-outยท๋ฐฉ ๊ฐœ๋… ์—†์Œ, ์ธ์ฆ ์—†์Œ, ์ฟผ๋ฆฌ ๋ณต์žก๋„ ์ฐจ์ด, ํ•ฉ์„ฑ ์ง€์—ฐ(chat_hold_msยทlock_hold_ms)
  • 12.2 ์ธก์ •์ฐฝ๊ณผ ๋ฐ˜๋ณต โ€” ๋‹จ์ผ ์ธก์ •, 90~150์ดˆ ์ฐฝ, 30๋ถ„ idle hold ์—†์Œ, soak ์—†์Œ
  • 12.3 CPU credit โ€” ์ธก์ • ๊ตฌ๊ฐ„๋ณ„ credit ์ƒํƒœ์™€ ๋ณด์ • ๋ฐฉ๋ฒ•
  • 12.4 ๋ถ€ํ•˜ ๋ฐœ์ƒ๊ธฐ ํ•œ๊ณ„ โ€” ๋กœ์ปฌ 1๋Œ€, ๋ชฉํ‘œ ์ „๋‹ฌ๋ฅ ยทdropped iterations
  • 12.5 ๋‹ค์Œ ์ฐฝ์—์„œ ์ธก์ •ํ•  ํ•ญ๋ชฉ โ€” ํ’€ ํฌ๊ธฐ ๋Œ€์กฐ(10โ†”20), WS_PER_CONNECTION_BYTES, ํ˜ผ์žก๋„ ์™ธ๋ถ€ API, ํ–‰์‚ฌ burst, ์žฅ์• ยท๋ณต๊ตฌ(RTO/RPO)

๋ถ€๋ก

  • A. ์‹คํ–‰ ๋ช…๋ น๊ณผ RUN_ID ๋ชฉ๋ก (403 ยง13.3)
  • B. ์ง€ํ‘œ ์ •์˜์™€ PromQL (403 ยง2.1)
  • C. ํŒŒ์ƒ๊ฐ’ ๊ณ„์‚ฐ์‹ (403 ยง2.2)
  • D. ์›์‹œ ๊ฒฐ๊ณผ ์œ„์น˜ โ€” loadtest-scenarios/results/, runs.tsv, derived-*.csv, Grafana ๊ตฌ๊ฐ„ ๋งํฌ, TSDB ๋ณด๊ด€ ์œ„์น˜
  • E. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ณ ์ •๊ฐ’ โ€” target.env, ์ด๋ฏธ์ง€ digest, ์ปจํ…Œ์ด๋„ˆ ์ž์› ์˜ˆ์‚ฐ, ํ”ฝ์Šค์ฒ˜ run ์„ค์ •

์ด ๊ณจ๊ฒฉ์„ ์ฑ„์šฐ๋Š” ์ˆœ์„œ

  1. 1ยท2์žฅ์„ ๋จผ์ € ํ™•์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ •ํ•œ ๊ตฌ๊ฐ„ ์ด๋ฆ„๊ณผ ์ˆซ์ž๋ฅผ 3~9์žฅ์ด ๊ณ„์† ์ฐธ์กฐํ•œ๋‹ค.
  2. 3~9์žฅ์€ โ‘คโ‘ฅ์„ ๋จผ์ € ์ฑ„์šด๋‹ค(์ธก์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ). ๊ทธ๋‹ค์Œ โ‘ โ‘กโ‘ขโ‘ฃ๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒ€์‚ฐํ•˜๋ฉด "์ธก์ •ํ•˜์ง€ ์•Š์€ ์ž์›์„ ๊ทผ๊ฑฐ๋กœ ์“ด ์žฅ"์ด ๋“œ๋Ÿฌ๋‚œ๋‹ค.
  3. โ‘ฆ์€ 10ยท11์žฅ์„ ์“ฐ๋ฉด์„œ ํ™•์ •ํ•œ๋‹ค. ์žฅ๋ณ„ โ‘ฆ์ด ์„œ๋กœ ์ถฉ๋Œํ•˜๋ฉด 11.3์˜ ์ ์šฉ ์ˆœ์„œ๋กœ ํ•ด์†Œํ•œ๋‹ค.
  4. 12์žฅ์„ ๋งˆ์ง€๋ง‰์ด ์•„๋‹ˆ๋ผ 3~9์žฅ์„ ์“ฐ๋Š” ๋„์ค‘์— ํ•จ๊ป˜ ์ฑ„์šด๋‹ค. ๊ทธ ์žฅ์—์„œ ๋ชป ๋ณธ ๊ฒƒ์„ ๊ทธ๋•Œ ์ ์–ด์•ผ ๋น ์ง€์ง€ ์•Š๋Š”๋‹ค.