์ฃผ๋ง ๋์ ๊ฐ์๊ธฐ ์๋ฒ ํ๋์ ํด๋ณด๊ณ ์ถ์๋ค.
ํ์ฌ ์ํ
ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ ์ด์ ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ํ ์ ์์ผ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์ ๋จ์ผ ์๋ฒ๋ก ์จ์ ํ ์ธ์คํด์ค ํ ๋๊ฐ ํ์ฉํ ์ ์๋ ํธ๋ํฝ ์์ ํ ์คํธํ ์์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ถ ์์ธ์ ์ถ๊ฐํ๊ธฐ ์ํด์ ์ ์ฌ์ ์ธ๋ถ RDB๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ค.
๋๋ฏธ ๋ฐ์ดํฐ ์์ฑ
๋ถํ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋๋ถ๋ถ์ DB์์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ฒ์ ๊ฒ ์กฐํ/์์ ์ ํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ ํ ๋ ๋๋ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด ๋๋ค. ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ PostgreSQL๋ก ๋๋ฏธ ๋ฐ์ดํฐ ์์ฑ์ ์ ํฉํ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
A, B, C ๊ฐ๊ฐ 100,000๊ฐ, 200,000๊ฐ, 10,000๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด ๊ด๊ณ๋ A <-B, A <-C ๊ด๊ณ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ธ๋ฑ์ค
์ฒ์ ์์ํ๋ ๊ฒ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ํ๋ก ์๋ํ ์์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ ํ๋ฉด์ ๋๋์ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ๋ ์ค๋จ ์์ด ์ด๋ป๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ์ ์๋์ง ํ ์คํธํ ์์ ์ด๋ค.
ํน์ด์ฌํญ
ํ์ฌ ๋๋ฉ์ธ ์ค๊ณ ์ ์ธ์ ๋ ์ง ํ ์ด๋ธ์ด ๋ถ๋ฆฌ๋ ์ ์๋ค๋ ๊ฐ์ ํ์ ๋์ผํ ์๊ทธ๋ฆฌ๊ฒ์ด์ ์ด ์๋ ํ ์ด๋ธ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ FK๋ฅผ ๋งบ๊ณ ์์ง ์๋ค. ๋ฐ๋ผ์ FK ์ค์ ์ ์๋์ผ๋ก ์์ฑ๋๋ ์ธ๋ฑ์ค๋ ์๋ ์ํฉ!
1์ฐจ ๋ถํ ํ ์คํธ
๋ถํํ ์คํธ๋ locust๋ฅผ ์ด์ฉํด ์งํํ ์์ ์ด๋ค. ์น UI๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ์ฉ์๋ฅผ ์ ์ง์ ์ผ๋ก ๋๋ฆฌ๋ฉฐ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ์๊ฐ๋ถํฐ ํธ๋ํฝ์ ๋ฌด๋ฆฌ๊ฐ ๊ฐ๋์ง ํ์ธํ๊ธฐ ํธํด์ ์ ํํ์๋ค.
์ฒ์์ ๊ธฐ๋ณธ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋งค ์ด๋ง๋ค 10๋ช
์ ์ฌ์ฉ์๊ฐ ์ฆ๊ฐํ๋ ์๋๋ฆฌ์ค๋ก ์์ํ๋ค.๋ผ๊ณ ํ์ง๋ง ๋ฐ๋ก connection refuse๊ฐ ๋จ๋ฉด์ ์์ฒญ ์ ๋๋ถ๋ถ์ด ์ ์ค๋๊ธฐ ๋๋ฌธ์ 1๋ช
์ฉ ๐ซ
๊ฒฐ๊ณผ
๋ถ์
Requests per second(์ดํ RPS)๊ฐ ๋ฌด๋ ค 3์ธ ์์ฒญ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํด ๋ฒ๋ ธ๋ค! ์ ์ธ๊ณ ์ฌ๋๋ค์ด ์ค์ ์์ ์ด๋น 3๋ช ์ด ์ฌ์ฉํ ์ ์๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ง์๋ค.
์ Total requests per second(์ดํ TPS) ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ์ฑ๊ณต๊ณผ ์คํจ๊ฐ ๋น๋กํ๋ฉฐ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ, ์ ํ๋ ์์์ ๊ฒฝ์ํ๋ฉฐ ์ฒ๋ฆฌ๋๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ ๋ค๋ฅด๊ฒ ํํํ์๋ฉด ์์ฒญ ์์ฒด๋ ์๋ฒ์ ๋๋ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ์์์๋ ๋ฌธ์ ๊ฐ ์๊ณ ์๋ฒ ๋ด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Connection pool ํฌ๊ธฐ ์กฐ์
์ฒ์ ์คํจ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ ์์ฒญ์ ์์์ผ๋ก๋ถํฐ ์ฝ 30์ด๊ฐ ํ๋ฅธ ์ง์ ์ด๋ค. ์ด๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ Connection request timed out์ด ๋ฐ์ํ๋ฉด์ ์์ฒญ์ด ์คํจํ๋ ๊ฒ์ ์ ์ ์๋ค.
show max_connections;
ํ์ฌ ์ด์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ max_connections๋ 25 ์ด๋ฏ๋ก, 5->23(minimum-idle ์ค์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ต๋๋ก ์ฌ์ฉํ๋ฉด DB client ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.)๋ก ์ค์ ์ ์กฐ์ ํด ๋ณด์.
(์ ์ฌ์ง์ ์์ ํ๋ ๊ฑธ ๊น๋นกํ๋ค.) ์ฌ์ฉํ๊ณ ์๋ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ์ ์กฐ์ ํ๋ค. ๊ทธ ์ธ๋ก minimum-idle ์๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ ์ ์งํด maximum-pool-size์ ๋์ผํ๋๋ก ํ๋ค.
2์ฐจ ๋ถํ ํ ์คํธ
DB connection pool์ DB max_connections๋ฅผ ์ต๋ํ ํ์ฉํ๋๋ก ๊ฐ์
์ด์ ์ธ์ ์์๋ connection-pool-size๋ฅผ ์กฐ์ ํด ๋ดค๋ค. connection-pool์ db์ ์ฐ๊ฒฐ ์ ๋ฐ์ํ๋ ๋น์ฉ์ ์ ์ฝํ๊ธฐ ์ํด์ ์ด์ ์ ์ฐ๊ฒฐํ ์ปค๋ฅ์ ์ ์ฌํ์ฉํ๋ ๊ฒ์ผ๋ก ์ด๋ฒ ์๋ฒ์์๋ hikariCP๋ฅผ ์ฌ์ฉํ๋ค.
๊ฒฐ๊ณผ
๋ถ์
์ด์ ๋ถํ ํ ์คํธ๋ณด๋ค ์ฝ 1๋ถ ์ ๋ ์๊ฐ์ ๋ฒ์๋ค. ํ์ง๋ง ์ฌ์ ํ ์๋ต์๊ฐ์ด ๊ธฐ๋ณธ 2์ด ๋๋ฅผ ์ ์งํ๋ฉฐ, connection-time์ผ๋ก ์ค์ ํ 15์ด์์ ๋ค ๋๊ธฐ๋ ๊ฒ์ ๋ณด๋ ์ํ๋๋ ์ฟผ๋ฆฌ ์์ฒด๊ฐ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฆ, connection์ด ๊ธธ์ด์ ธ ๋ฐ์ํ ์ฅ์ ์ ๊ฒฝ์ฐ pool size๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ํด๊ฒฐ์ฑ ์ด ์๋๋ ๊ฒ์ ์ ์ ์๋ค.
์ธ๋ฑ์ค ์ค์
์ํ๋๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ๋ณด๋ฉด ๋ณด๊ธฐ๋ง ํด๋ ๋ฐฐ๊ฐ ๋ ๋ ํด์ง๋ ๊ฒฐ๊ณผ๐๋ฅผ ๋ณผ ์ ์๋ค. ์ํ๋๋ ์ฟผ๋ฆฌ๋ฅผ ๋๋ต์ ์ผ๋ก ์ค๋ช ํ์๋ฉด, ์ปค์ ๊ธฐ๋ฐ ์กฐํ๋ก ๊ฒ์์ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ํ page size๋งํผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ค. ๋ฐ๋ผ์ ์ ์คํ ๊ณํ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ์ ์ฒด ํ ์ด๋ธ์ ์์ฐจ ํ์์ ํ๋ฉฐ ๋น๊ต์ ํจ์จ์ ์ธ ๋์์ ์ํด woker node์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ(deleted_at IS NULL ํํฐ)ํ๋ค.
- posted_at ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋ ๋ถํ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ woker node๊ฐ ์ ๋ ฌ์ ์ํํ๋ค. (์ฌ๊ธฐ์ Page size ๋งํผ ์กฐํํ๊ธฐ ์ํด์ LIMIT์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ top-N heapsort ์๊ณ ๋ฆฌ๋ฌ์ ์ฌ์ฉํ๋ค.)
- ๊ฐ ๊ทธ๋ฃน์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ๋ด ์์ N๊ฐ๋ฅผ ์กฐํ ํ ๋ณํฉํ๊ธฐ ์ํด Gather merge๊ฐ ์ํ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํด์ ๊ฐ์ ํ๋ค. ์ธ๋ฑ์ค๋ ๊ฐ๋ ฅํ ์ฑ๋ฅ ๊ฐ์ ๋ฐฉ๋ฒ์ด์ง๋ง ๊ทธ๋งํผ ๋น์ฉ๋ ์กด์ฌํ๊ธฐ์ ํ ๋ฒ ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ ๊ฒฝ์ฐ ๋ค์ํ๊ฒ ํ์ฉ๋ ์ ์๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค. ๋์ ํ ์ด๋ธ์ ๊ฒ์๊ธ์ ํด๋นํ๋ ํ ์ด๋ธ๋ก ํ์ฌ ์๋น์ค ๋ด ํ์ฉ์ฑ์ ์๊ฐํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ต์ ์/์์ ์ ๋ฑ์ผ๋ก ์กฐํ
- ํน์ ๊ทธ๋ฃน์ ๋ํ ์กฐํ
- ์ ๋ชฉ/๋ด์ฉ ๊ฒ์
์ ์กฐ๊ฑด์ ํ์ธํด ๋ณด๋ฉด ๋๋ถ๋ถ "๊ฒ์"์ ๋ํ ํค์๋๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ๊ฒ์์ ๊ฒฝ์ฐ ์๊ตฌํ๋ ํํ๊ฐ ๋๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์ ๊ฒ์ ์๊ฑด์ ๋ง์กฑํ๋ ์ธ๋ฑ์ค(์ต์ ์, ์์ ์, ์ ๋ชฉ, ๊ทธ๋ฃน, ์์ฑ์ ๋ฑ๋ฑ)๋ฅผ ์์ฑํ๊ธฐ์๋ ๋น์ฉ์ด ๋ง์ด ๋ฐ์๋๋ค๊ณ ์๊ฐํ๋ค. ๋ฐ๋ผ์ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ ํด๋น ๋๋ฉ์ธ ๋ฒ์ ๋ด์์ ํ์ฉ๋ ์ ์๋ ํํ๋ก ์ถ๊ฐ๋๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค. ์ถ๊ฐ๋ก ๋ ํ๋ค๋ฉด ์ ๋ชฉ๊ณผ ๊ฐ์ ๊ณณ์ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๊ณ ๊ทธ ์ด์์ ๋ณต์กํ ๊ฒ์์ ๊ตฌํํ๋ ค๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํํ์ ์๋ฒ ๊ตฌ์กฐ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค. ์ฌ๊ธฐ์๋ ์์ฑ์ผ์ ํด๋นํ๋ posted_at ์ปฌ๋ผ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๋ค.
create index "idx_journal_posted_at_deleted_at" on "journal" ("posted_at", "deleted_at")
3์ฐจ ๋ถํ ํ ์คํธ
์ธ๋ฑ์ค ์ถ๊ฐ๋ก ๋ณ๋ชฉ ์ง์ ์ด ๋๋ API ์ฑ๋ฅ ์ต์ ํ
์ด์ ํ ์คํธ์์ ๋ฐ์ํ API ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํด ํด๊ฒฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถํ๋ฅผ ๋ ๋๋ฆฌ๊ธฐ ์ํด์ 10,000 ์ ์ ๊ฐ ์์ฒญํ๋ ์๋๋ฆฌ์ค๋ฅผ ์ํํด ๋ณด์.
๊ฒฐ๊ณผ
๋ถ์
[๊ทธ๋ฆผ 8]์ ๋ ์์ญ์ผ๋ก ๋๋ ๋ณผ ์ ์๋๋ฐ, ์ผ์ชฝ์ ์ด๋น ์ฌ์ฉ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋ ์๋๋ฆฌ์ค์ด๊ณ , ์ค๋ฅธ์ชฝ์ ์ด๋น ์ฌ์ฉ์๊ฐ 100์ฉ ์ฆ๊ฐํ๋ ์๋๋ฆฌ์ค์ด๋ค. TPS๋ฅผ ๋ณด๋ฉด ์ผ์ ํ ๊ฐ๊ฒฉ์ ์ฒ๋ฆฌํ๋ค ๋๋์ ์์ฒญ์ด ์คํจ๋๊ณ ์๋ค. ์ด๋ ์ด๋ก์ค๊ณผ ๋นจ๊ฐ ์ค ๊ฐ๊ฒฉ์ด ํ์ฌ ์๋ฒ์์ ์ฒ๋ฆฌํ ์ ์๋ TPS๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ๋ Connection pool size์ ์์กดํ๊ณ ์๋ค. ๋จผ์ ์๋ต์๊ฐ๋ฌธ์ ๋ ๋ค์์ ๋ค๋ค๋ณด๊ณ , ์์ฒญ์ด ์คํจํ๋ ๊ฒฝ์ฐ์ ๋ํ ๋ถ์์ ํด๋ณด์.
์ง๊ธ์ ๋ฌธ์ ๊ฐ ๋ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ํด 2์ฐจ ๋ถํ ํ ์คํธ๋ณด๋ค ๋ง์ ์ฌ์ฉ์ ํธ๋ํฝ์ ๊ฒฌ๋ ์ ์์ง๋ง, ๊ฒฐ๊ตญ DB connection์ ์ ์ฝ์ผ๋ก ์ธํด ์ผ์ ์ด์์ ์ฌ์ฉ์๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
Reader DB ์ถ๊ฐ
์๋ต์๊ฐ์ ๋์งธ ์น๊ณ , ํ์ฌ ์ํฉ์์๋ DB connection pool ์์์ด ๋ถ์กฑํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์๋ค. ์ด ๊ฒฝ์ฐ Reader DB connection pool์ ์ด์ ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ๋๋ ค์ฃผ๋ ๋ฐฉ์์ ๊ฒํ ํ ์ ์๋ค. AWS๋ฅผ ์ด์ฉํ๊ณ ์๋ค๋ฉด Aurora DB cluster๋ฅผ ์ด์ฉํด ๋ณด๋ ๊ฒ์ด ์ข์ ์ ํ์ง๊ฐ ์๋๊น ์๊ฐ์ด ๋ ๋ค.
ํ์ง๋ง ํด๋น ์๋น์ค๋ฅผ ์ด์ฉํ๋ ค๋ฉด ๋น์ฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ํ ๋ฐฑ์ ์ค๊ณ ์ ์ (1๋ 7๊ฐ์) ์ ์ฅ์ผ๋ก ๋ง์น DB ๋ณ๋ชฉ์ด ์๊ธฐ๋ ๊ฒ์ฒ๋ผ ๋์ํ๋๋ก API๋ฅผ ์ถ๊ฐํ ์์ ์ด๋ค.
@GetMapping("/test")
public ResponseEntity<String> test() {
try {
Thread.sleep((long) (Math.random() * 1950 + 50));
} catch (InterruptedException e) {
e.printStackTrace();
}
return ResponseEntity.ok("test");
}
์ด ์ง์ ์ RDB ์์์ ๋ฌดํํ๊ฒ ์ถ๊ฐํ ์ ์๋ ํ์ฌ์ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ฉฐ ๋ง์น ๋๋ค ํ๊ฒ 50ms~2000ms๊ฐ ์์๋๋ ํ ์คํธ API๋ฅผ ์ถ๊ฐํด ๋ณด์.
Reader DB๋ฅผ ๋ฌดํํ๊ฒ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ๋ต์ผ๊น?
๋น์ฐํ๊ฒ๋ ์๋ ๊ฒ์ด๋ค. Reader DB๊ฐ Primary DB์ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋๊ธฐ ์ํด์ Primary DB๊ฐ ๋ณ๊ฒฝ์ฌํญ์ binary log๋ก ๊ธฐ๋กํ๊ณ , ์ด๋ฅผ ๊ฐ Reader DB๋ก ๋๊ธฐํํ๋ ์์ ์ด ์ํ๋๋ค. ์ด ๊ณผ์ ์ replication ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋ฐฉ์์ด ๋ค๋ฅผ ๊ฒ์ด์ง๋ง ๊ฐ์ฅ ๊ฐ๋จํ 1:N ๊ตฌ์กฐ๋ก ๋ณธ๋ค๋ฉด Master DB๋ ๊ฐ Reader DB์ ์ฐ๊ฒฐํ๊ณ ๋ณ๊ฒฝ์ฌํญ์ ๋งค๋ฒ ์ ๋ฌํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฉ์ ์ธ ๋ฌธ์ ๋ ์๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์บ์ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก DB ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๋ ์ถ๊ฐํ๋ ๊ฒ ์ด์์ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์บ์ ๋ ์ด์ด๋ ํ๋ฐ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ ๋ถ์ผ๋ ๋ชจ๋ ๊ฒ์ ์ฆ๋ช ํ๋ ๋จ ํ๋์ ์์์ด ์๋ฏ์ด ๋ค์ํ ์๋น์ค ๊ตฌ์กฐ์ ํต์ผ๋๋ ๋จ ํ๋์ ๊ตฌ์กฐ๋ ์๋ ๊ฒ์ด๋ค! โจ
4์ฐจ ๋ถํ ํ ์คํธ
DB connection์ด ํ๋ถํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๊ณ ์งํ
๊ฒฐ๊ณผ
๋ถ์
3์ฐจ ๋ถํ ํ ์คํธ์ ๋น๊ตํด์ ํ์คํ TPS๊ฐ ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์ ์ ์๋ค. ์ฆ, ์ด์ ๋ถํ ํ ์คํธ์์ ๋ณ๋ชฉ ์ง์ ์ ์ธ๋ถ ์์์ ๋ํ ๊ฒฝ์ ์ํ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํด ๋ฐ์ํ ๋ฌธ์ ์ธ ๊ฒ์ด ์ฆ๋ช ๋๋ค.
์์ ํ ์คํธ๋ฅผ ์ํ ๊ฐ์ ์๋๋ฆฌ์ค(DB pool size๊ฐ ์ถฉ๋ถํ ์ํฉ)๋ฅผ ํตํด ์ธ๋ถ ์์์ด ๋ถ์กฑํด ์์ฒญ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ ์์ด์ก๋ค. ํ์ง๋ง ์ฌ์ ํ ์์ฒญ์ ๋ํ ์คํจ๊ฐ ๋ฐ์ํ๋๋ฐ ์ด๊ฒ์ ํฐ์บฃ ๋ด๋ถ Thread pool๊ณผ ๊ด๋ จ ์๋ค.
ํ์ฌ ์๋๋ฆฌ์ค๋ ์ด๋น 100๋ช ์ ์ฌ์ฉ์๊ฐ ์ฆ๊ฐํ๋ฉฐ ์ต๋ 10K๊น์ง ์ฆ๊ฐํ๋ ์๋น์ค์ด๋ค. ์ด๋ฒ ๋ถ์์์๋ K6๋ ํจ๊ป ์ด์ฉํด ๋ณด์. ์ผ์ชฝ ์ฌ์ง์ ๋ณด๋ฉด ์์ฒญ ์์ ํ 30์ด ํ RPS๊ฐ ํฐ๋ฉด์ ์ดํ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์ ์ ์๋ค.
์ฒ๋ฆฌ๋๋ ์์ฒญ์ ์๋ฅผ ๋ณด๋ฉด ๋งค ์ด๋น 200๊ฐ์ ์ฒ๋ฆฌ๊ฐ ๋๋ฉฐ 30์ด๊ฐ ์ง๋ ์์ฒญ์ timeout์ด ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ํ์ฌ ์๋ฒ์ thread pool์ ํฌ๊ธฐ๋ฅผ ์ ์ ์๋ค.
๋๋ฌธ์ ์๋ฌด๋ฆฌ ์ธ๋ถ ์์์ด ํ๋ถํ ์ํฉ์ด๋๋ผ๋ ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ task๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ฐ์ ์์ฒญ๋ค์ task queue์์ ๋๊ธฐํ ์๋ฐ์ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด ์ ํ์ OS๊ฐ ํจ์จ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ํ์ด๋ฏ๋ก ๋ฌด์์ thread pool์ ๋๋ฆฌ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ ์ ์ ํ์ง ๋ชปํ ์ ํ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด Thread pool์ ํฌ๊ธฐ๋ ์ด๋ ์ ๋๊ฐ ์ ์ ํ๊ฐ?
์์ ์ฌ๋ฌ ์๋๋ฅผ ํด๋ณด๋ฉด ์ ์ ์๋ฏ ์๋ฒ๊ฐ ์๋ฌด๋ฆฌ ๋ง์ thread๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํด๋, DB connection pool์ด ๋ถ์กฑํ๊ฑฐ๋, ๊ผญ MSA๊ฐ ์๋๋๋ผ๋ ์์ ์๋น์ค๋ผ๋ฆฌ ์๋ก ํต์ ํ๋ฉฐ ์ด์๋๋ ์๋น์ค๋ ๋ด๋ถ ํต์ ์ ์ํ connection pool์ด ์์ ์ ์๋ค.
๋ CPU bound ์์ ์ด ๋ง์ ์๋น์ค์ ๊ฒฝ์ฐ thread ์๋ฅผ ๋๋ฆฌ๋ฉด context switch๊ฐ ์์ฃผ ์ผ์ด๋๋ฉด์ ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์น์ฌํ์ง๋ง "์ ์ "์์ค์ ํฌ๊ธฐ๊ฐ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ์ ์์ค์ ์๋น์ค ๊ตฌ์กฐ์ ์ด์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์?
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ scale-out์ด ๋ ์ ์๋ค. ํ์ง๋ง ์์ ์ธ๊ธํ๋ฏ์ด ์๋ฒ๊ฐ ํ์ฉํ ์ ์๋ ์์์ด ์ถฉ๋ถํ ์ํ์์ scale-out์ด ์ด๋ค์ ธ์ผ ์ํ๋ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ์๋(๊๊(แตแแต*)ใ ใ ใ ใ ๐ณ๐ํฌํญํญํญ) ํด์ผ ํ๋ค.
๋๋ ์บ์ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ๋ชฉ์ ์ ๋ง๊ฒ ์๋ฒ ์ธ๋ถ์ ๋ ๊ฒ์ธ์ง, ๋ด๋ถ์ ๋ ๊ฒ์ธ์ง๋ฅผ ๊ณ ๋ฏผํด์ผ ํ๋ค. ๋ง์ฝ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์บ์ ๋ ์ด์ด๋ฅผ ๋๋ ๊ฒฝ์ฐ ์ฆ, ์ ๋ฐ์ดํธ๊ฐ ๋ง์ด ์๋ ๋ฐ์ดํฐ์ ๋ํด์ ์๋ฒ์ ๋๋ฌํ์ง ์๊ณ ์บ์ ๋ ์ด์ด์์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ๋ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ๊ฐฑ์ ์ด ๋น๋ฒํ ์์ฒญ์ ๋ํด ์ด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋๊ณ ์ ์ ๊ฒฝํ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด ๋ํ ๊ธฐ๋ฅ์ ๋ชฉ์ ์ฑ์ ๋ง๊ฒ ์ ์ ํํด์ผ ํ๋ค.
๋์์์
์ด์ฐ ๋๋ ํ์ฌ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๊ฐ์ ์์ด ๋ ์ค๋ฅผ ์ ์๋ค.
- ๋จ์ผ ์๋ฒ์ thread pool์ ๋๋ฆฐ๋ค.
- ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋ ๊ตฌ์ฑํ๋ค.
์ฌ์ค ์ต๋ํ ์์์ ํ์ฉํ๋๋ก thread pool์ ์กฐ์ ํ๊ณ , ์ถ๊ฐ ํธ๋ํฝ์ด ๋ ๋ฐ์ํ๋ฉด ์๋ฒ๋ฅผ ์ถ๊ฐํด ๋ถํ๋ฅผ ๋ถ์ฐ ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค.
๋จ์ผ ์๋ฒ์ thread pool์ ๋๋ฆฐ๋ค.
server:
tomcat:
threads:
max: 200
max-connections: 8192
accept-count: 100
connection-timeout: 30000
Spring boot์์ tomcat thread pool์ ๋ํ ์ค์ ์ application.yaml์ ํตํด ์ฝ๊ฒ ์ค์ ํ ์ ์๋ค. ์ด ์ค์ ์ ๋ด์ฅ tomcat์์ ์ฌ์ฉ๋๋ nio connecto์ ์ค์ ๊ฐ์ผ๋ก ์ด ๋ถ๋ถ์ ์ดํ ์์ธํ๊ฒ ์์๋ณด๋๋ก ํ์. 5์ฐจ ๋ถํ ํ ์คํธ์์๋ ์ผ๋ฐ์ ์ธ ์น ์๋น์ค๋ฅผ ๊ฐ์ ํ์ฌ I/O bound๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด์.
5์ฐจ ๋ถํ ํ ์คํธ
์์ฒญ ์ฒ๋ฆฌ์ ํ์ํ ์์ ํ ๋น
๊ฒฐ๊ณผ 1 - ๋จ์ผ ์๋ฒ์ thread pool๋ฅผ ๋๋ฆฐ๋ค.
๊ฒฐ๋ก 1 ๋ถ์
tomcat nio connector๊ฐ ๊ฐ์ฉํ๋ thread ์๋ฅผ ์กฐ์ ํ์ฌ ์ด๋น ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ์ด 1K๋ฅผ ์ ์งํ๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ๋จ์ผ ์๋ฒ ๋ด thread๋ฅผ ๊ฒฝ์ํ๋ฉฐ ์ต์ข ์ ์ผ๋ก thread๋ฅผ ํ ๋น๋ฐ์ง ๋ชปํ ์์ฒญ๋ค์ ๋ชจ๋ ์คํจ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์ ์ ์๋ค. ํนํ ํฅ๋ฏธ๋ก์ด ์ ์ ๊ฐ์ฅ ์ฒ์ ๋ฐํ๋ ์์ฒญ๋ค์ด 30์ด ๋ค ๋ชจ๋ timeout์ด ๋ฐ์๋๋ ๊ฒ์ ๋ณด๋ฉด, ์๋ก์ด ์์ฒญ๋ค์ ๋ํ ์ฐ์ ์์๊ฐ ๋ ๋๊ฒ ์ฒ๋ฆฌ๋์ด ์ฒ์ ๋ค์ด์จ ์์ฒญ์ ๋ํด์ starvation์ด ๋ฐ์ํ๋ ๊ฒ์ด ์๋๊ฐ ์ถ์ธกํด ๋ณผ ์ ์๋ค.
๊ฒฐ๊ณผ 2 - ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋ ๊ตฌ์ฑํ๋ค.
๊ฒฐ๊ณผ 2 ๋ถ์
์ด๋ฒ์ ์๋ฒ๋ฅผ ๋๋ฆฐ ๊ฒฝ์ฐ์ ๋น๊ตํ๊ธฐ ์ํด ๊ธฐ๋ณธ๊ฐ(200)์ผ๋ก ์ค์ ๋ ์๋ฒ๋ฅผ 5๋ ์์ฑํ ์คํ ํด๋ดค๋ค. ๋จ์ผ ์๋ฒ์ ๋ํ thread pool๋ฅผ ๋๋ ธ์ ๋๋ณด๋ค ๋ช๋ช ์์น๊ฐ ์กฐ๊ธ์ฉ ์ฆ๊ฐํ์ง๋ง http_req_duration (max)์ ์์น๊ฐ ํ๊ธฐ์ ์ผ๋ก ๋ฎ์์ก์์ ์ ์ ์๋ค. ๋ ์ฒซ ์์ฒญ์ ๋ํด์ ๋ฐ์ํ๋ request timeout ์์ด ์ฒ๋ฆฌ๋ ๊ฒ๋ ์ ์ ์๋ค.
์ฆ, ์๋ก ๋ค๋ฅธ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฐ์ง ํ๋ก์ธ์ค ์์ฒด๊ฐ ์ฆ๊ฐํ๊ฒ ๋๋ฉด์ ๊ฐ CPU scheduling์ ์ํด ๋ ๋ง์ด ์ ํ๋๊ณ , ๋ด๋ถ์์ ๋ฐ์ํ๋ thread ๊ฐ context switching ๋น์ฉ๋ ์ค์ด๋ค๊ฒ ๋๋ฉฐ ๋น์ฐํ๊ฒ ์ฑ๋ฅ์ด ์ฌ๋ผ๊ฐ ์ํฉ์ด๋ค.
์๋ฒ ํด๋ฌ์คํฐ๋ง์ ํตํด ์ต์ ์ ๊ฒฝ์ฐ 60์ด->12์ด๋ก ์ฑ๋ฅ์ด ๊ฐ์ ๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก 12์ด๋ ์๋ต์ ๊ฐ์ง ์๋น์ค๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ์์ฒญ๋ ์ํฅ์ ๋ฏธ์น๋ค. ํ ํต๊ณ์ ๋ฐ๋ฅด๋ฉด 1์ด์์ 3์ด๊ฐ ๋์ด๊ฐ๋ฉด ์ดํ๋ฅ ์ด 30% ์ฆ๊ฐํ๊ณ , 6์ด๊ฐ ๋์ด๊ฐ๋ฉด 106% ์ฆ๊ฐํ๋ค๊ณ ํ๋ค.
ํ ์คํธ API๊ฐ ์ต์ ์ ๊ฒฝ์ฐ 2000ms๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๊ณ ๋ คํด๋, ์ต์ ์ 13s๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์๊น?
- ์คํจํ ์๋ต์ด๋ผ๋ ๋น ๋ฅด๊ฒ ์ฌ์ฉ์์๊ฒ ๋ฐ์ํ๊ณ , ์๋ฒ ์์์ ์ ์ฝํ๋ค.
- ์๋ฒ๋ฅผ FLEX๐ฐ ํด๋ฒ๋ฆฐ๋ค.
- ๋ณ๋ชฉ์ด ์๊ธฐ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ํ๋ค.
- ์ค์๊ฐ์ฑ์ด ์๊ตฌ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
์ด๋ฒ ์๋๋ฆฌ์ค๋ ์ฌ๋ฏธ๋ฅผ ์ํด ์๋ฒ๋ฅผ ํ์ฅํด๋ณผ ์์ ์ด๋ค.
ํ์ฌ ์๋ฒ ๊ตฌ์ฑ์ 4 core 16Gb์ ๋ ธ๋ 3๋๋ก ๊ตฌ์ฑ๋ ์๋ฒ๋ฅผ ์ด์ํ๊ณ ์๋ค. ์ด 30๋์ ์๋ฒ ์์์ ํ์ฅํ ๊ฒฐ๊ณผ 13s -> 4s๋ก ์ค์ด๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ฌ ํ ์คํธ์ ์ฌ์ฉ๋๋ API์ ๊ฒฝ์ฐ ์ต์ ์ ๊ฒฝ์ฐ 2s ํ ์๋ต์ ์ฃผ๊ธฐ ๋๋ฌธ์ thread pool์์ ๋๊ธฐํ๋ ์๊ฐ ๋ฑ์ ๊ณ ๋ คํ๋ฉด ์ด๋ ์ ๋ ํฉ๋นํ ์๋ต ์๊ฐ์ด๋ผ๊ณ ์๊ฐ๋๋ค.
์ฐธ๊ณ
'๋ฉ๋ชจ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Keycloak and ArgoCD integration (0) | 2025.06.06 |
---|---|
์์ธ์ ๋ํ ์๋ก์ด ์๊ฐ์ ๋ํ ๋ด ์๊ฐ (0) | 2023.12.25 |