402 V1 load test design v2 - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki
402 V1 ํ๊ณ ์ง์ ์ธก์ ์ ์ํ ๋ถํํ ์คํธ ์ค๊ณ V2
1. ๋ชฉ์ ๊ณผ ํ์ ์์น
์ด ํ ์คํธ์ ๋ชฉ์ ์ V1์ด ๋จ์ํ ๋ช RPS๋ฅผ ์ฒ๋ฆฌํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ค. ์ฌ์ฉ์ ์ฆ๊ฐ ์ ์ต์ด๋ก ํฌํ๋๋ ์์๊ณผ ์ฅ์ ์ ํ ๊ฒฝ๋ก๋ฅผ ์์น๋ก ํ์ธํ๊ณ ๋ค์ ํ์ฅ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
- ๋จ์ผ EC2์ ์์ง ํ์ฅ ๋๋ ์ปจํ ์ด๋ ์์ ์ฌ๋ฐฐ๋ถ์ผ๋ก ์ถฉ๋ถํ๊ฐ
- MySQL์ ๋ณ๋ ํธ์คํธ๋ RDS๋ก ๋ถ๋ฆฌํด์ผ ํ๋๊ฐ
- REST์ WebSocket์ ๋ถ๋ฆฌํด์ผ ํ๋๊ฐ
- ํผ์ก๋ ๊ณ์ฐยท์ธ๋ถ API ํธ์ถ์ ๋น๋๊ธฐํํ๊ฑฐ๋ ๋ณ๋ ์๋น์ค๋ก ๊ฒฉ๋ฆฌํด์ผ ํ๋๊ฐ
- ๋ฌด์ค๋จ ๋ชฉํ ๋๋ฌธ์ ๋ค์ค EC2์ ๋ก๋๋ฐธ๋ฐ์๊ฐ ํ์ํ๊ฐ
์ฑ๋ฅ ํ๊ณ๋ ๊ฐ์ฅ ๋์ ์๊ฐ RPS๊ฐ ์๋๋ผ SLO๋ฅผ ์ฐ์์ผ๋ก ๋ง์กฑํ๋ ์ต๋ ์ง์ ์ฒ๋ฆฌ๋์ผ๋ก ์ ์ํ๋ค.
C_knee = SLO ๋๋ ์ ํฉ์ฑ์ด ์ฒ์ ๊นจ์ง๋ ์ง์ ๋ถํ
C_safe = C_knee ร 0.7
ํ์ ์ฉ๋ = ๊ณํ ํผํฌ ร ๋ณ๋ ์ด์ ์ฌ์ ์จ
์๋ต์๊ฐยท์ค๋ฅ์จยท์ ํฉ์ฑ์ 1์ฐจ ํ์ ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ณ CPU, GC, HikariCP, MySQL lock, ๋์คํฌ ์งํ๋ ์์ธ์ ์ค๋ช ํ๋ ์ฆ๊ฑฐ๋ก ์ฌ์ฉํ๋ค.
2. MAUยทDAU ์ฌ์ ์ ๊ณผ RPS ์ฐ์
2.1 ์ธ๋ถ ๋ฒค์น๋งํฌ์ ๋ด๋ถ ๊ฐ์ ๋ถ๋ฆฌ
BlaBlaCar๋ ์ ์ฒด ์๋น์ค์ DAU๋ฅผ ๊ณต๊ฐํ์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ตญ๊ฐยท์ฐ๋ ๋ฒ์๊ฐ ์ผ์นํ๋ ์คํ์ธ 2025 ๊ณต์ ์๋ฃ๋ก DAU/MAU ํ๋ ํ๋ก์๋ฅผ ๋ง๋ ๋ค. ๋ชจ์ฌํ MAU๋ 1,150,000๋ช ์ผ๋ก ๊ณ ์ ํ๋ฉฐ ์ด ๊ฐ์ ์นจํฌ์จ์ ๋ค์ ์ ์ฉํ์ง ์๋๋ค.
| ๊ณต๊ฐ ์งํ | ๊ฐ | ์ฌ์ฉ ๋ฐฉ๋ฒ |
|---|---|---|
| 2025 ์คํ์ธ ํ๊ท ์๊ฐ ๊ณ ์ ํ์ฑ ์ฌ์ฉ์ | 300,000~400,000 | ์ค์๊ฐ 350,000์ MAU ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ |
| 2025 ์คํ์ธ ์ฐ๊ฐ ์น๊ฐ | 4,000,000 | ์ผ๊ฐ ์น๊ฐ ํ๋ ํ๋ก์ |
๊ณต๊ฐ๊ฐ์์ ๋ค์ ๋น์จ์ ๊ณ์ฐํ๋ค.
์ผ ํ๊ท ์น๊ฐ ํ๋ = 4,000,000 รท 365 = 10,959/day
์น๊ฐ ํ๋ DAU/MAU = 10,959 รท 300,000~400,000 = 2.740~3.653%
์ฑํ DAU/MAU = 10,959 รท 350,000 = 3.131%
๋ชจ์ฌํ DAU ๋ฒ์ = 1,150,000 ร 2.740~3.653% = 31,507~42,009
์ฑํ DAU = 1,150,000 ร 3.131% = 36,008
| ๊ณ ์ MAU | BlaBlaCar DAU/MAU ๋ฒ์ | ์ถ์ DAU ๋ฒ์ | ์ฑํ DAU |
|---|---|---|---|
| 1,150,000 | 2.740~3.653% | 31,507~42,009 | 36,008 |
์ DAU๋ ๋ก๊ทธ์ธ ๊ธฐ์ค ๊ณ ์ DAU ์ค์ธก๊ฐ์ด ์๋๋ผ ์น๊ฐ ๊ฑด์/365๋ฅผ ์ฌ์ฉํ
์ผ๊ฐ ํ๋ ํ๋ก์๋ค. ์ด์ ์ยท๊ฒ์๋ง ํ ์ฌ์ฉ์๋ฅผ ๋น ๋จ๋ฆฌ๊ณ ํ๋ฃจ ๋ณต์ ์ด์ฉ์๋ฅผ
์ค๋ณต ์ง๊ณํ ์ ์์ผ๋ฏ๋ก ์ ํ KPI๋ก ์ฐ์ง ์๋๋ค. ์ด์ ๋ก๊ทธ๊ฐ ์์ ๋
๋ถํํ
์คํธ ์ด๊ธฐ๊ฐ์ ์ ํ๋ ๋ฒค์น๋งํฌ์๋ง ์ฌ์ฉํ๊ณ , ์ดํ ๊ณ ์ DAUยท์ธ๋น
์ธ์
ยท์ธ์
๋น ํธ์ถ ํ์๋ก ๊ต์ฒดํ๋ค.
2.2 RPS ๊ณต์
์ผ ์ธ์
= DAU ร 1ํ
ํผํฌ ์ธ์
์์๋ฅ
= DAU ร ์ผ ์ธ์
/DAU ร ํผํฌ ์ง์ค๋ฅ 70%
รท ํผํฌ 4์๊ฐ ร ์๊ฐ ํผํฌ ๊ณ์ 2.0
ํผํฌ RPS = ํผํฌ ์ธ์
์์๋ฅ ร ์ธ์
๋น HTTP 13๊ฑด
| ๊ตฌ๋ถ | DAU/MAU | DAU | ํผํฌ ์ธ์ /s | ๊ณ์ฐ RPS |
|---|---|---|---|---|
| ํ๋จ | 2.740% | 31,507 | 3.063 | 39.82 |
| ์ค์ | 3.131% | 36,008 | 3.501 | 45.51 |
| ์๋จ | 3.653% | 42,009 | 4.084 | 53.09 |
๋ฐ๋ผ์ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ ๋์ ์ฒซ ํผํฉ ๋ถํ ๊ธฐ์ค์ ์ฝ 50 RPS๋ก ๋๋ฉด
๋๋ค. ์ธ๋น ์ผ ์ธ์
์ด 2ํ๋ฉด 91 RPS, 3ํ๋ฉด 137 RPS๋ก ์ ํ ์ฆ๊ฐํ๋ค.
์ด ๊ฐ์ V1 ์ฉ๋ ์ํ์ด ์๋๋ฏ๋ก ํ๊ณ ํ์์ ๋ณ๋๋ก
25โ50โ75โ100โ150โ200โ300โ400โ512 RPS๋ฅผ ์ ์ฉํด C_knee๊น์ง ๊ณ์ํ๋ค.
์ธ์ ๋น HTTP 13๊ฑด์ ํ์ฌ ์ํ์ค๋ฅผ ๋ชฉ๋กยท๊ฒ์ 4, ์์ธ 4, ํผ์ก๋ 3, ์ฐ๊ธฐ 1, ์ธ์ฆยท๊ธฐํ 1๋ก ๋ถํดํ ๋ด๋ถ ์ค๊ณ๊ฐ์ด๋ค. ์ค์ RPS 45.51์ endpoint ๋ถ๋ฐฐ๋ ๋ชฉ๋กยท๊ฒ์ 14.00, ์์ธ 14.00, ํผ์ก๋ 10.50, ์ฐ๊ธฐ 3.50, ์ธ์ฆยท๊ธฐํ 3.50 RPS๋ค. ์ด์ ๋ก๊ทธ๊ฐ ์๊ธฐ๋ฉด ๋ฐ๋์ ์ธ์ /DAU์ endpoint ํธ์ถ ํ์๋ก ๊ต์ฒดํ๋ค.
2.3 ํ์ฌ ์ข ๋ฃ burst ์ฌ๊ณ์ฐ
ํน์ ํ์ฌ ์ฌ์ฉ์๋ ํด๋น ๊ตฌ๊ฐ DAU์ 10%๊ฐ 10๋ถ ์์ ์ง์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค. ๊ฐ ์ฌ์ฉ์๋ ํ์ฌ ์ธ์ ์์ HTTP ์์ฒญ 15๊ฑด์ ๋ง๋ค๊ณ , 50%๊ฐ ์ฑํ ์ ์ ์ํ๋ฉฐ, ์ ์ ์ฌ์ฉ์๋ 10๋ถ ๋์ ๋ฉ์์ง 6๊ฑด์ ๋ณด๋ธ๋ค.
์์ฒญ๋ฅ ์ ์ด ์์ฒญ ์๋ฅผ ๋ณด์กดํ๋ ์ผ๊ฐํ ๋ถํ๋ก ๋ง๋ ๋ค.
0 โ 5๋ถ ๋์ peak๊น์ง ์์น โ 5๋ถ ๋์ 0๊น์ง ํ๊ฐ
peak RPS = 2 ร ์ด๋ฒคํธ ์ฌ์ฉ์ ร ์ฌ์ฉ์๋น ์์ฒญ รท 600์ด
| ๊ตฌ๋ถ | ์ด๋ฒคํธ ์ฌ์ฉ์ | HTTP peak | ์ต์ข WS ์ฐ๊ฒฐ | peak ์ฐ๊ฒฐ๋ฅ | inbound ๋ฉ์์ง peak |
|---|---|---|---|---|---|
| ํ๋จ | 3,151 | 157.5 RPS | 1,575 | 5.25/s | 31.5 msg/s |
| ์ค์ | 3,601 | 180.0 RPS | 1,800 | 6.00/s | 36.0 msg/s |
| ์๋จ | 4,201 | 210.0 RPS | 2,100 | 7.00/s | 42.0 msg/s |
4์ธ ํ์์ ๋ฐ์ ์๋ฅผ ์ ์ธํ 3๋ช
์๊ฒ ์ ๋ฌ๋๋ค๋ฉด ์ค์ ๊ธฐ์ค ๋คํธ์ํฌ
์ ๋ฌ๋์ ์ต๋ ์ฝ 108 deliveries/s๋ค. ์ด๋ฒคํธ ์ฌ์ฉ์ 10%, WS ์ ์ 50%,
15 HTTP/user, 6 messages/user๋ ๋ชจ๋ ๋ด๋ถ ๊ฐ์ ์ด๋ค. ์์ burst๋
160โ180โ210 RPS, ์ฉ๋ ํ์์ 250โ300โ400โ512 RPS๋ก ์ด์ด๊ฐ๋ค. WS๋
์ฐ๊ฒฐยท๋ฉ์์ง๋ฅผ ๋ณ๋ ์ฆ๊ฐ์์ผ ํ๊ณ๋ฅผ ์ฐพ๋๋ค. ๋ฐฉ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ฉด
inbound ร ํ๊ท ์์ ์ ์๋ก ๋ค์ ์ฐ์ ํ๋ค.
3. ๋ถํยท๊ด์ธก ๊ตฌ์กฐ
๋ณ๋ Terraform ์คํ์ loadtest-infra/์ ๋๊ณ ์์ PrometheusยทGrafana EC2,
๊ด์ธก์ฉ ์ ๊ทผ ๊ท์น, exporter ์ค์น ๋ฌธ์๋ง ๊ด๋ฆฌํ๋ค. ๋ถํ ๋ฐ์๊ธฐ EC2๋ ๋ง๋ค์ง
์์ผ๋ฉฐ ๊ธฐ์กด V1 Terraform state์ ํ์ผ์ ์์ ํ์ง ์๋๋ค. Public 80/443
๊ท์น์ ๊ธฐ์กด infra/ state๋ง ์์ ํ๊ณ , ๋ณ๋ ์คํ์ ํ
์คํธ ๊ธฐ๊ฐ์๋ง
monitoring SG์์ exporter port๋ก ๋ค์ด๊ฐ๋ ๊ท์น์ ์ถ๊ฐํ๋ค.
๋ก์ปฌ ๋ถํ ๋ฐ์๊ธฐ
โโ HTTP ํ๋ก์ธ์ค โโ
โโ WS ํ๋ก์ธ์ค โโโโโ Public DNS/EIP โ HTTPS/WSS โ Nginx โ Spring โโฌโ MySQL
โ โ โโ FastAPI โ ์ธ๋ถ LLM
โโ ๋ก์ปฌ JSON/CSV ๊ฒฐ๊ณผ
V1 EC2
โโ Node Exporter: ํธ์คํธ CPUยท๋ฉ๋ชจ๋ฆฌยท๋์คํฌยท๋คํธ์ํฌยทFD
โโ cAdvisor: ์ปจํ
์ด๋ CPUยท๋ฉ๋ชจ๋ฆฌยทthrottlingยทI/O
โโ Micrometer: HTTPยทTomcatยทJVMยทHikariCP
โโ mysqld-exporter: MySQL connectionยทlockยทbufferยทredo
โโ nginx exporter/access log: ์ฐ๊ฒฐยทupstream ์๊ฐ
โ 5์ด scrape
์์ Prometheus + Grafana EC2
๋ถํ ๊ฒฝ๋ก๋ ๋ฐ๋์ ๊ณต๊ฐ ๋๋ฉ์ธ ๋๋ EIP์ https://ยทwss://๋ฅผ
์ฌ์ฉํ๋ค. ์ด๋ก์จ ๊ณต๊ฐ DNS, ์ธํฐ๋ท ๊ฒฝ๋ก, TLS, Nginx๋ฅผ ํฌํจํ ์ค์
์ง์
๊ฒฝ๋ก๋ฅผ ์ธก์ ํ๋ค. V1 private IP๋ ๋ถํ ๋์์ด ์๋๋ฉฐ Prometheus EC2๊ฐ
exporter๋ฅผ ์์งํ๋ ๊ด์ธก ๊ฒฝ๋ก์๋ง ์ฌ์ฉํ๋ค.
Node Exporter์ cAdvisor๋ Terraform์ด ์์ฑํ SSM ๋ฌธ์๋ก ์ค์นยท์ ๊ฑฐํ ์ ์๋ค. Spring, MySQL, Nginx exporter๋ ์ธ์ฆ ์ ๋ณด์ ์๋น์ค ์ค์ ์ด ํ์ํ๋ฏ๋ก ์๊ฒฉ ์ฆ๋ช ์ Terraform state์ ๋ฃ์ง ์๊ณ ๋ณ๋๋ก ๊ตฌ์ฑํ ๋ค scrape target๋ง Terraform ๋ณ์๋ก ์ฐ๊ฒฐํ๋ค.
4. ๋ณ๋ชฉ๋ณ ์ธ๋ถํ ํ ์คํธ
T0. ๋ก์ปฌ ๋ถํ ๋ฐ์๊ธฐ ๊ฒ์ฆ
- V1 ํ ์คํธ ์ ์ ์๋ต์ด ๊ณ ์ ๋ endpoint๋ก ๋ก์ปฌ ํธ์คํธ์ ํ๊ณ๋ฅผ ์ธก์ ํ๋ค.
- ๋ก์ปฌ CPU 60% ๋ฏธ๋ง, swap 0, ์ค์ธก ์ ๋ก๋ ๋์ญํญ 70% ๋ฏธ๋ง, dropped iteration 0, ๋ชฉํ ์์ฒญ ๋๋ฌ๋ฅ 95% ์ด์์ ์ ์งํ๋ค.
- ์ ์ /Wi-Fi, VPNยทproxy ์ฌ์ฉ ์ฌ๋ถ, ๊ณต์ธ IP, target RTTยทjitterยทpacket loss์ ๋ก์ปฌ ํ๋์จ์ด ์ฌ์์ ๋ชจ๋ ๊ฒฐ๊ณผ์ ๊ธฐ๋กํ๋ค.
- HTTP์ WebSocket์ ๋ณ๋ ๋ก์ปฌ ํ๋ก์ธ์ค๋ก ์คํํ๋ค. ๋์ผ ํธ์คํธ์์ ์ฌ์ ์จ์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ๊ฐ์ ํต์ ๋คํธ์ํฌ์ ๋ก์ปฌ ๋จธ์ ๋ ๋๋ก ๋๋๋ค.
T1. ๋คํธ์ํฌยทTLSยทNginx ์ฐ๊ฒฐ ์ฒ๋ฆฌ
๋์ผํ ๊ฐ๋ฒผ์ด endpoint์ ๋ํด ๋ค์์ ๋น๊ตํ๋ค.
- keep-alive ํ์ฑ๊ณผ ๋งค ์์ฒญ ์ ๊ท ์ฐ๊ฒฐ
- HTTP์ HTTPS
- 1โ10โ50โ100โ200โ400 connections/s
์ธก์ ๊ฐ์ TCP connect, TLS handshake, Nginx active/reading/writing/waiting, accept ์คํจ, host socket ์, FD, listen queue, Nginx container CPU์ throttling์ด๋ค. upstream์ด ์ฌ์ ๋ก์ด ์ํ์์ connect ์๊ฐ์ด ๋จผ์ ์์นํ๋ฉด NginxยทOS ๊ณ์ธต ๋ณ๋ชฉ์ผ๋ก ํ์ ํ๋ค.
T2. Spring ์์ฒญ ์ฒ๋ฆฌ์ JVM
DBยท์ธ๋ถ API๋ฅผ ํธ์ถํ์ง ์๋ ๊ฐ์ฅ ๊ฐ๋ฒผ์ด endpoint์ ์ค์ endpoint๋ฅผ ๋น๊ตํ๋ค.
- BlaBlaCar ํ๋๋ฅ ๊ธฐ์ค 40โ46โ53 RPS๋ฅผ ๋จผ์ ์ฌํ
- ํ๊ณ ํ์์ 25โ50โ75โ100โ150โ200โ300โ400โ512 RPS
- ์๊ณ์ ๋ถ๊ทผ๋ถํฐ 10~20% ๋จ์ ์ฆ๊ฐ
- ๊ฐ ๋จ๊ณ ์๋ฐ์ 5๋ถ, ์ธก์ 10๋ถ, 3ํ ๋ฐ๋ณต
Tomcat busy/max, ์์ฒญ queue, JVM heapยทdirect memory, allocation rate, GC pause, process CPU, context switch, container throttling์ ์ธก์ ํ๋ค. DB ์ง์ฐ ์์ด Tomcat๊ณผ CPU๊ฐ ๋จผ์ ํฌํ๋๋ฉด Spring ๊ณ์ฐยท์ง๋ ฌํยทthread ์ค์ ๋ฌธ์ ๋ค.
T3. ๋ชฉ๋ก ์ฟผ๋ฆฌ
๋ค์ ์ถ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ๊พผ๋ค.
- ํ์ฌ V1, MAU 115๋ง ์์ ๋์ ์น, ๊ทธ 2๋ฐฐ์ ๋ฐ์ดํฐ ๊ฑด์
- ์ฒซ ํ์ด์ง์ ๊น์ ํ์ด์ง
- ๋์ผ ๊ฒ์์กฐ๊ฑด ๋ฐ๋ณต๊ณผ ๋ค์ํ ์์นยทํํฐ
- cold cache์ warm cache
- ๋ชฉ๋ก ํฌ๊ธฐ 10ยท20ยท50
์ฟผ๋ฆฌ p95/p99, rows examined/sent, buffer-pool hit, temporary table, sort, MySQL CPU, disk read latency, Hikari usage/acquire/pending์ ์ธก์ ํ๋ค. ์ฒซ ํ์ด์ง ๋ฐ๋ณต ๊ฒฐ๊ณผ๋ง์ผ๋ก ์กฐํ ์ฉ๋์ ํ์ ํ์ง ์๋๋ค.
T4. ์์ธ ์กฐํ์ N+1ยท์ง๋ ฌํ
- ์กด์ฌํ๋ ํ๊ณผ ์๋ ํ
- ์ฐธ์ฌ์ยท์ ์ฐยท์ฑํ ์ด๋ ฅ ํฌ๊ธฐ๋ณ ์์ธ
- ๋์ผ ์์ธ ๋ฐ๋ณต๊ณผ ID ๋ถ์ฐ
DB query count/request, SQL ํฉ๊ณ์๊ฐ, ์๋ต ์ง๋ ฌํ ์๊ฐ, response bytes, Spring CPU์ GC๋ฅผ ์ธก์ ํ๋ค. DB ์๊ฐ์ด ์งง์ง๋ง ์ ์ฒด ์๋ต์ด ๊ธธ๋ฉด ๊ฐ์ฒด ๋ณํยทJSON ์ง๋ ฌํ ๋๋ ๊ณผ๋ํ ์๋ต ํฌ๊ธฐ๋ก ํ์ ํ๋ค.
T5. ํผ์ก๋ ์ธ๋ถ ํธ์ถ
์ธ๋ถ ์์กด์ฑ์ ๋ค์ ๊ณ ์ ์กฐ๊ฑด์ผ๋ก ๋ฐ๊ฟ๊ฐ๋ฉฐ ํ ์คํธํ๋ค.
- ์ง์ฐ 50ยท200ยท1,000ยท3,000ms
- ์ค๋ฅ์จ 0ยท1ยท5ยท20%
- ๋์ผ spot๊ณผ 10ยท100๊ฐ spot ๋ถ์ฐ
Spring outbound connection pool, pending call, Tomcat busy, FastAPI worker queue, timeout, retry ์๋ฅผ ์ธก์ ํ๋ค. ํธ๋์ญ์ ยทHikari ์ฌ์ฉ ์๊ฐ์ด ์ธ๋ถ ์ง์ฐ๊ณผ ํจ๊ป ์ฆ๊ฐํ๋ฉด ํธ๋์ญ์ ๋ฒ์๊ฐ ์ธ๋ถ ํธ์ถ์ ํฌํจํ ๊ฒ์ด๋ค.
T6. ํผ์ก๋ DB ์ต์ ๊ฐยท์ด๋ ฅ ์ ์ฅ
์ธ๋ถ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ์ ํด ์ธ๋ถ API ์ํฅ์ ์ ๊ฑฐํ ๋ค ๋ค์์ ๋น๊ตํ๋ค.
- ์ต์ ๊ฐ upsert๋ง ์ํ
- ์ด๋ ฅ insert ํฌํจ
- ๋์ผ spot๊ณผ ๋ค์ spot ๋ถ์ฐ
K=1ยท5ยท20
row lock current waits/time, deadlock, transaction duration, redo bytes, fsync, dirty page, EBS queueยทawait, Hikari pending์ ์ธก์ ํ๋ค. ๋์ผ spot์์๋ง ๊ธ๊ฒฉํ ๋๋น ์ง๋ฉด row lock, ๋ชจ๋ spot์์ ๋๋น ์ง๋ฉด redoยทI/O ๋๋ ์ธ๋ฑ์ค ๋น์ฉ์ด๋ค.
T7. ์ฐธ์ฌ ์์ฒญ ์ ์ฅ
์๋ก ๋ค๋ฅธ ํ์ ์ฐ๊ธฐ๋ฅผ ๋ถ์ฐํด ๋จ์ insert ์ฒ๋ฆฌ๋์ ๋จผ์ ์ธก์ ํ๋ค. ์ด ๊ฐ์ ์ข์ ๊ฒฝ์๊ณผ ๋ถ๋ฆฌ๋ ์ฐ๊ธฐ ๊ธฐ์ค์ ์ด๋ค.
- 1โ5โ10โ20โ40โ80 writes/s
- ์ฑ๊ณตยท์ค๋ณตยท์ ์ฝ์กฐ๊ฑด ์ค๋ฅ๋ฅผ ๋ถ๋ฆฌ ์ง๊ณ
T8. ์ธ๊ธฐ ํ ์น์ธ hot-row
RPS๊ฐ ์๋๋ผ ๋์์ ๊ฐ์ ํ ํ์ ๋์ฐฉํ๋ ์์ฒญ ์๋ฅผ ์ ์ดํ๋ค.
- ๊ฐ์ ํ์ 2ยท5ยท10ยท20ยท50ยท100 ๋์ ์น์ธ
- ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ๋์์ฑ์ ์ฃผ๋ ๋์กฐ๊ตฐ
- lock์ 0ยท100ยท500ยท2,000ms ์ ์ ํ๋ ์กฐ๊ฑด
lock wait, deadlock, Hikari pending, ์น์ธ latency์ ํจ๊ป ์์ฌ ์ข์ ์์, ์ ์ ์ด๊ณผ, ์ค๋ณต ์น์ธ์ ๊ฒ์ฆํ๋ค. ์ ํฉ์ฑ ์ค๋ฅ๋ ๋จ ํ ๊ฑด์ด์ด๋ ์คํจ๋ค.
T9. WebSocket ์ฐ๊ฒฐ ์์ฒด
๋ฉ์์ง๋ฅผ ๋ณด๋ด์ง ์๊ณ ์ฐ๊ฒฐ ๋น์ฉ๋ง ์ธก์ ํ๋ค.
- ์์ ์์ธก ๋์ ์ฐ๊ฒฐ 1,575โ1,800โ2,100, ์ฉ๋ ํ์ 500โ1,000โ1,500โ3,000โ5,000
- ์ฐ๊ฒฐ๋ฅ 5.25โ6โ7โ10โ20โ50 connections/s
- 30๋ถ idle ์ ์ง ํ ์ฐ๊ฒฐ ํด์ ์ ์ฌ์ฐ๊ฒฐ
handshake p95/p99, ์ฑ๊ณต๋ฅ , Nginx์ Spring FD, ESTABLISHED/TIME_WAIT, heapยทdirect memory/connection, GC, heartbeat traffic์ ์ธก์ ํ๋ค.
T10. WebSocket ๋ฉ์์งยทfan-outยท์ ์ฅ
์ฐ๊ฒฐ ์๋ฅผ ๊ณ ์ ํ๊ณ ๋ค์ ์ถ์ ๋ถ๋ฆฌํ๋ค.
- ์ ์ฅ ์๋ heartbeat์ DB ์ ์ฅ ์ฑํ ๋ฉ์์ง
- ํ ๋ฐฉ ์ง์ค๊ณผ ์ฌ๋ฌ ๋ฐฉ ๋ถ์ฐ
- ์์ ์ 1ยท3ยท9๋ช
- ์์ ์์ธก inbound 31.5โ36โ42 msg/s
- ์ฉ๋ ํ์ inbound 10โ20โ50โ100โ300 msg/s
end-to-end ์ ๋ฌ p95/p99, ์ ์คยท์ค๋ณตยท์์ ์ค๋ฅ, outbound deliveries/s, Spring CPU, network, DB commit, Hikari pending์ ์ธก์ ํ๋ค.
T11. RESTยทWebSocket ๊ณต์ ์์ ๊ฐ์ญ
WebSocket ์ฐ๊ฒฐ์ 0, ์์ธก ํ๋จยท์ค์ยท์๋จ 1,575ยท1,800ยท2,100, ์ฉ๋ ํ์๊ฐ 3,000ยท5,000์ผ๋ก ๊ณ ์ ํ๊ณ ๊ฐ์ REST ๋ถํ๋ฅผ ๋ฐ๋ณตํ๋ค. ์ฐ๊ฒฐ์ด ์๋ ๋์กฐ๊ตฐ ๋๋น REST p95, ์ฒ๋ฆฌ๋, Spring CPUยท๋ฉ๋ชจ๋ฆฌ ๋ณํ์จ์ ๊ธฐ๋กํ๋ค. ์์์ WS ๋จ๊ณ์์ REST p95๊ฐ 20% ์ด์ ์ ํ๋๊ณ ์์ ์๊ด๊ด๊ณ๊ฐ ํ์ธ๋๋ฉด WebSocket ์คํ๊ธฐ ๋๋ ์๋น์ค ๋ถ๋ฆฌ๋ฅผ ์ฐ์ ๊ฒํ ํ๋ค.
T12. ์ฅ์ ยท๋ณต๊ตฌ
C_safe์ 70% ๋ถํ์์ Nginx, Spring, FastAPI, MySQL์ ํ๋์ฉ ์ค์งยท๋ณต๊ตฌํ๋ค.
EC2 reboot์ ๋ฐฑ์
๋ณต์์ ๋ณ๋ ๊ฒฉ๋ฆฌ ํ๊ฒฝ์์ ์ํํ๋ค.
- ์ค๋ฅ๊ฐ ์์๋ ์๊ฐ๋ถํฐ 5๋ถ ์ฐ์ ์ ์ํ๋ ๋๊น์ง์ RTO
- ๊ธฐ๋ฅ๋ณ ์ฅ์ ๋ฒ์
- WebSocket ์ฌ์ฐ๊ฒฐ๋ฅ
- retry storm๊ณผ queue ํ๋ณต ์๊ฐ
- ๋ง์ง๋ง ์ ์ ๋ฐฑ์ ๋ถํฐ์ RPO
๋จ์ผ EC2ยท๋จ์ผ MySQL์ ํธ์คํธ ์ฅ์ ์ค ๋ฌด์ค๋จ์ ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก ์ด ํ ์คํธ๋ ๊ณ ๊ฐ์ฉ์ฑ์ ์ฆ๋ช ํ๋ ๊ฒ์ด ์๋๋ผ ํ์ฌ ๋ณต๊ตฌ ๋ฅ๋ ฅ์ ์์นํํ๋ค.
5. ๋จ๊ณ์ ์ค๋จ ์กฐ๊ฑด
- ๊ณ ์ ๋ ์ด๋ฏธ์งยทDB snapshotยทCPU credit ์ํ๋ฅผ ๊ธฐ๋กํ๋ค.
- ๋จ์ผ ์ฌ์ฉ์ ๊ธฐ๋ฅ๊ณผ ๊ฒฐ๊ณผ ์ ํฉ์ฑ์ ๊ฒ์ฆํ๋ค.
- 5๋ถ ์๋ฐ์ ํ ๊ฒฉ๋ฆฌ ํ ์คํธ๋ฅผ ์ํํ๋ค.
- BlaBlaCar ๊ธฐ์ค 40โ46โ53 RPS์ ์ธ์ ๋ฏผ๊ฐ๋ 91โ137 RPS ์์ผ๋ก ํผํฉ ๋ถํ๋ฅผ ์ํํ๋ค.
- ์ต์ด ์๊ณ์ ๋ถ๊ทผ์ 10~20% ๊ฐ๊ฒฉ์ผ๋ก ๋ค์ ์ธก์ ํ๋ค.
C_safe์์ 60~120๋ถ soak test๋ฅผ ์ํํ๋ค.- ์์ธก burst 160โ180โ210 RPS์ 250โ300โ400โ512 RPS ํ์ burst์ ๋ณต๊ตฌ๋ฅผ ์ธก์ ํ๋ค.
- ํ ๋ฒ์ ๊ฐ์ ํ๋๋ง ์ ์ฉํ๊ณ ๋์ผ snapshotยท์๋๋ฆฌ์ค๋ก ์ฌ์ธก์ ํ๋ค.
๋ค์ ์ค ํ๋๋ฉด ํด๋น ๋จ๊ณ๋ฅผ ์ค์งํ๋ค.
- 5xxยทtimeout 5% ์ด๊ณผ๊ฐ 2๋ถ ์ง์
- OOM, container restart, disk full
- ์ข์ ๋๋ ๋ฉ์์ง ์ ํฉ์ฑ ์๋ฐ
- ๋ถํ ๋ฐ์๊ธฐ๊ฐ ๋ชฉํ RPS์ 95%๋ฅผ ์ ๋ฌํ์ง ๋ชปํจ
- DB ๋ณต๊ตฌ๊ฐ ํ์ํ ๋น์ ์ ์ํ
6. ํ์ฅ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ ๊ฒฐ๊ณผํ
| ์ฆ๊ฑฐ | ํ์ฅ ํ๋จ |
|---|---|
| Host CPUยทcontainer throttling์ด ๋จผ์ ํฌํ, DB ์ฌ์ | EC2 ํฌ๊ธฐยท์ปจํ ์ด๋ quota ์ฌ๋ฐฐ๋ถ ์ฐ์ |
| MySQL CPUยทlockยทI/O์ Hikari pending์ด ํจ๊ป ์ฆ๊ฐ | ์ฟผ๋ฆฌยทํธ๋์ญ์ ๊ฐ์ ํ DB ๋ถ๋ฆฌ/RDS ๊ฒํ |
| ์ธ๋ถ API ์ง์ฐ์ Tomcat busyยทoutbound pending์ด ๋น๋ก | timeoutยทcacheยทsingle-flightยทbulkheadยท๋น๋๊ธฐํ |
| WebSocket ์ฐ๊ฒฐ๋ง์ผ๋ก heapยทFD๊ฐ ํฌํ | WS gateway ๋๋ Spring ํ๋ก์ธ์ค ๋ถ๋ฆฌ |
| ๋ฉ์์ง ์ ์ฅ ์์๋ง REST๊ฐ ์ ํ | ์ฑํ ์ ์ฅ ๋น๋๊ธฐํ ๋๋ DB ์ฐ๊ธฐ ๊ฒฝ๋ก ๋ถ๋ฆฌ |
| ๋จ์ผ ์ปจํ ์ด๋ ์ฅ์ RTO๋ ์ถฉ์กฑํ์ง๋ง EC2 RTO ๋ถ์ถฉ์กฑ | ๋ค์ค EC2ยทALBยท์ธ๋ถ DB ํ์ |
C_safe < ๊ณํ ํผํฌ ร ์ด์ ์ฌ์ ์จ |
์ต์ ํ ๋๋ ์ํ/์์ง ํ์ฅ ํ ์ฌ์ํ |
์ต์ข
๋ณด๊ณ ์์๋ ์๋๋ฆฌ์ค๋ณ ๋ชฉํยท์ค์ RPS, p50/p95/p99, ์ค๋ฅ์จ,
๋ก์ปฌ ๋ฐ์๊ธฐ headroom, ์ต์ด ํฌํ ์งํ, C_knee, C_safe, ์ ํฉ์ฑ, RTO/RPO,
์์ ๊ฒฐ๊ณผ ์์น์ ๋์ผ ์กฐ๊ฑด 3ํ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ค.