์„œ๋ฒ„ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์€ ์–ด๋””์„œ ๋ฐœ์ƒํ• ๊นŒ?

2023. 11. 29. 21:16ยท๋ฉ”๋ชจ
728x90

์ฃผ๋ง ๋™์•ˆ ๊ฐ‘์ž๊ธฐ ์„œ๋ฒ„ ํŠœ๋‹์„ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ

๊ทธ๋ฆผ2. ???: ์•„ ์š”์ฒญ ์ฒ˜๋ฆฌ์ข€ ํ•˜์ž๊ณ !!

ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์ „ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ๋‹จ์ผ ์„œ๋ฒ„๋กœ ์˜จ์ „ํžˆ ์ธ์Šคํ„ด์Šค ํ•œ ๋Œ€๊ฐ€ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ž˜ํ”ฝ ์–‘์„ ํ…Œ์ŠคํŠธํ•  ์˜ˆ์ •์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€ ์š”์ธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ €์‚ฌ์–‘ ์™ธ๋ถ€ 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๋ช…์”ฉ ๐Ÿซ 

๊ฒฐ๊ณผ

๊ทธ๋ฆผ3. 1์ฐจ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

๋ถ„์„

๊ทธ๋ฆผ4. ๊ทธ๋™์•ˆ ์‹œ์ฒญํ•ด์ฃผ์‹  ์—ฌ๋Ÿฌ๋ถ„..

Requests per second(์ดํ•˜ RPS)๊ฐ€ ๋ฌด๋ ค 3์ธ ์—„์ฒญ๋‚œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•ด ๋ฒ„๋ ธ๋‹ค! ์ „ ์„ธ๊ณ„ ์‚ฌ๋žŒ๋“ค์ด ์ค„์„ ์„œ์„œ ์ดˆ๋‹น 3๋ช…์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ง์•˜๋‹ค.

 

์œ„ Total requests per second(์ดํ•˜ TPS) ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ๋น„๋ก€ํ•˜๋ฉฐ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ œํ•œ๋œ ์ž์›์„ ๊ฒฝ์Ÿํ•˜๋ฉฐ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋˜ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด ์š”์ฒญ ์ž์ฒด๋Š” ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ณ  ์„œ๋ฒ„ ๋‚ด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Connection pool ํฌ๊ธฐ ์กฐ์ ˆ

๊ทธ๋ฆผ5. Connection request timed out

์ฒ˜์Œ ์‹คํŒจ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์ฒญ์€ ์‹œ์ž‘์œผ๋กœ๋ถ€ํ„ฐ ์•ฝ 30์ดˆ๊ฐ€ ํ๋ฅธ ์ง€์ ์ด๋‹ค. ์ด๋•Œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์—์„œ Connection request timed out์ด ๋ฐœ์ƒํ•˜๋ฉด์„œ ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

show max_connections;

 

ํ˜„์žฌ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ max_connections๋Š” 25 ์ด๋ฏ€๋กœ, 5->23(minimum-idle ์„ค์ •๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด DB client ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.)๋กœ ์„ค์ •์„ ์กฐ์ ˆํ•ด ๋ณด์ž.

๊ทธ๋ฆผ6. HikariCP maximum pool size ์กฐ์ ˆ

(์•„ ์‚ฌ์ง„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฑธ ๊นœ๋นกํ–ˆ๋„ค.) ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ปค๋„ฅ์…˜ ํ’€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์„ ์กฐ์ ˆํ–ˆ๋‹ค. ๊ทธ ์™ธ๋กœ minimum-idle ์ˆ˜๋ฅผ ๊ธฐ๋ณธ ๊ฐ’์„ ์œ ์ง€ํ•ด maximum-pool-size์™€ ๋™์ผํ•˜๋„๋ก ํ–ˆ๋‹ค.

2์ฐจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

DB connection pool์„ DB max_connections๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋„๋ก ๊ฐœ์„ 

 

์ด์ „ ์„ธ์…˜์—์„œ๋Š” connection-pool-size๋ฅผ ์กฐ์ ˆํ•ด ๋ดค๋‹ค. connection-pool์€ db์™€ ์—ฐ๊ฒฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด์ „์— ์—ฐ๊ฒฐํ•œ ์ปค๋„ฅ์…˜์„ ์žฌํ™œ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฒˆ ์„œ๋ฒ„์—์„œ๋Š” hikariCP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฒฐ๊ณผ

๊ทธ๋ฆผ7. pool size๋ฅผ ๋Š˜๋ ค ์š”์ฒญ ์‚ฌ์šฉ์ž ์ค‘ ์ผ๋ถ€๋ฅผ ๋” ์ฒ˜๋ฆฌ

๋ถ„์„

์ด์ „ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ์•ฝ 1๋ถ„ ์ •๋„ ์‹œ๊ฐ„์„ ๋ฒŒ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์‘๋‹ต์‹œ๊ฐ„์ด ๊ธฐ๋ณธ 2์ดˆ ๋Œ€๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, connection-time์œผ๋กœ ์„ค์ •ํ•œ 15์ดˆ์—์„œ ๋‹ค ๋Š๊ธฐ๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ์ˆ˜ํ–‰๋˜๋Š” ์ฟผ๋ฆฌ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, connection์ด ๊ธธ์–ด์ ธ ๋ฐœ์ƒํ•œ ์žฅ์• ์˜ ๊ฒฝ์šฐ pool size๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ž€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฑ์Šค ์„ค์ •

๊ทธ๋ฆผ7. ์ตœ์‹  ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ query plan

์ˆ˜ํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด ๋ณด๊ธฐ๋งŒ ํ•ด๋„ ๋ฐฐ๊ฐ€ ๋“ ๋“ ํ•ด์ง€๋Š” ๊ฒฐ๊ณผ๐Ÿš๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜ํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด, ์ปค์„œ ๊ธฐ๋ฐ˜ ์กฐํšŒ๋กœ ๊ฒŒ์‹œ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ ํ›„ page size๋งŒํผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์‹คํ–‰ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  1. ์ „์ฒด ํ…Œ์ด๋ธ”์„ ์ˆœ์ฐจ ํƒ์ƒ‰์„ ํ•˜๋ฉฐ ๋น„๊ต์  ํšจ์œจ์ ์ธ ๋™์ž‘์„ ์œ„ํ•ด woker node์ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(deleted_at IS NULL ํ•„ํ„ฐ)ํ•œ๋‹ค.
  2. posted_at ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ถ„ํ• ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ woker node๊ฐ€ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์—ฌ๊ธฐ์„œ Page size ๋งŒํผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ LIMIT์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— top-N heapsort ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์‚ฌ์šฉํ•œ๋‹ค.)
  3. ๊ฐ ๊ทธ๋ฃน์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ๋‚ด ์ƒ์œ„ N๊ฐœ๋ฅผ ์กฐํšŒ ํ›„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด Gather merge๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์„œ ๊ฐœ์„ ํ•œ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ๊ฐœ์„  ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๊ทธ๋งŒํผ ๋น„์šฉ๋„ ์กด์žฌํ•˜๊ธฐ์— ํ•œ ๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋Œ€์ƒ ํ…Œ์ด๋ธ”์€ ๊ฒŒ์‹œ๊ธ€์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”๋กœ ํ˜„์žฌ ์„œ๋น„์Šค ๋‚ด ํ™œ์šฉ์„ฑ์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ตœ์‹ ์ˆœ/์ˆ˜์ •์ˆœ ๋“ฑ์œผ๋กœ ์กฐํšŒ
  2. ํŠน์ • ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์กฐํšŒ
  3. ์ œ๋ชฉ/๋‚ด์šฉ ๊ฒ€์ƒ‰

์œ„ ์กฐ๊ฑด์„ ํ™•์ธํ•ด ๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ "๊ฒ€์ƒ‰"์— ๋Œ€ํ•œ ํ‚ค์›Œ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ์š”๊ตฌํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋„“๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์ƒ ๊ฒ€์ƒ‰ ์š”๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์ธ๋ฑ์Šค(์ตœ์‹ ์ˆ˜, ์ˆ˜์ •์ˆœ, ์ œ๋ชฉ, ๊ทธ๋ฃน, ์ž‘์„ฑ์ž ๋“ฑ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋ฐœ์ƒ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋Š” ํ•ด๋‹น ๋„๋ฉ”์ธ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ถ”๊ฐ€๋กœ ๋” ํ•œ๋‹ค๋ฉด ์ œ๋ชฉ๊ณผ ๊ฐ™์€ ๊ณณ์— ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ์ด์ƒ์˜ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์„œ๋ฒ„ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ž‘์„ฑ์ผ์— ํ•ด๋‹นํ•˜๋Š” posted_at ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•œ๋‹ค.

create index "idx_journal_posted_at_deleted_at" on "journal" ("posted_at", "deleted_at")

3์ฐจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

์ธ๋ฑ์Šค ์ถ”๊ฐ€๋กœ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋˜๋Š” API ์„ฑ๋Šฅ ์ตœ์ ํ™”

 

์ด์ „ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•œ API ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ€ํ•˜๋ฅผ ๋” ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ 10,000 ์œ ์ €๊ฐ€ ์š”์ฒญํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ˆ˜ํ–‰ํ•ด ๋ณด์ž.

๊ฒฐ๊ณผ

๊ทธ๋ฆผ8. ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ 

๋ถ„์„

๊ทธ๋ฆผ9. DB ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ์ฒ˜๋ฆฌ ์ง€์—ฐ

[๊ทธ๋ฆผ 8]์€ ๋‘ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์™ผ์ชฝ์€ ์ดˆ๋‹น ์‚ฌ์šฉ์ž๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ด๊ณ , ์˜ค๋ฅธ์ชฝ์€ ์ดˆ๋‹น ์‚ฌ์šฉ์ž๊ฐ€ 100์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค. TPS๋ฅผ ๋ณด๋ฉด ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์ด ์‹คํŒจ๋˜๊ณ  ์žˆ๋‹ค. ์ด๋•Œ ์ดˆ๋ก์ค„๊ณผ ๋นจ๊ฐ„ ์ค„ ๊ฐ„๊ฒฉ์ด ํ˜„์žฌ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” TPS๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ๋Š” Connection pool size์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค. ๋จผ์ € ์‘๋‹ต์‹œ๊ฐ„๋ฌธ์ œ๋Š” ๋’ค์—์„œ ๋‹ค๋ค„๋ณด๊ณ , ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ถ„์„์„ ํ•ด๋ณด์ž.

 

์ง€๊ธˆ์€ ๋ฌธ์ œ๊ฐ€ ๋œ ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ด 2์ฐจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ๋งŽ์€ ์‚ฌ์šฉ์ž ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒฐ๊ตญ DB connection์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ์ผ์ • ์ด์ƒ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

Reader DB ์ถ”๊ฐ€

๊ทธ๋ฆผ9. ํ…… ๋นˆ ๋‚ด ์ง€๊ฐ‘

์‘๋‹ต์‹œ๊ฐ„์€ ๋‘˜์งธ ์น˜๊ณ , ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” 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์ด ํ’๋ถ€ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์ง„ํ–‰

๊ฒฐ๊ณผ

๊ทธ๋ฆผ10. 4์ฐจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

๋ถ„์„

3์ฐจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์™€ ๋น„๊ตํ•ด์„œ ํ™•์‹คํžˆ TPS๊ฐ€ ์ฆ๊ฐ„ํ•œ ๊ฒƒ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด์ „ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์—์„œ ๋ณ‘๋ชฉ ์ง€์ ์€ ์™ธ๋ถ€ ์ž์›์— ๋Œ€ํ•œ ๊ฒฝ์Ÿ ์ƒํƒœ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ธ ๊ฒƒ์ด ์ฆ๋ช…๋๋‹ค.

 

์•ž์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ฐ€์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค(DB pool size๊ฐ€ ์ถฉ๋ถ„ํ•œ ์ƒํ™ฉ)๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ž์›์ด ๋ถ€์กฑํ•ด ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์–ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์š”์ฒญ์— ๋Œ€ํ•œ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด๊ฒƒ์€ ํ†ฐ์บฃ ๋‚ด๋ถ€ Thread pool๊ณผ ๊ด€๋ จ ์žˆ๋‹ค.

๊ทธ๋ฆผ11. K6 ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์‹œ๊ฐํ™”

ํ˜„์žฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ดˆ๋‹น 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๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚˜๋ฉด์„œ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์น˜์‚ฌํ•˜์ง€๋งŒ "์ ์ •"์ˆ˜์ค€์˜ ํฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ ์ • ์ˆ˜์ค€์€ ์„œ๋น„์Šค ๊ตฌ์กฐ์™€ ์šด์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€?

๊ทธ๋ฆผ12. ๊ทธ๋ฆผ์ž ๋ถ„์‹ ์ˆ ์˜ ๊ทผ๋ณธ

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ 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๋ฅผ ๋Š˜๋ฆฐ๋‹ค.

๊ทธ๋ฆผ13. thread pool์ด 1056 ์„ค์ •

๊ฒฐ๋ก  1 ๋ถ„์„

tomcat nio connector๊ฐ€ ๊ฐ€์šฉํ•˜๋Š” thread ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ์ดˆ๋‹น ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์š”์ฒญ์ด 1K๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ผ ์„œ๋ฒ„ ๋‚ด thread๋ฅผ ๊ฒฝ์Ÿํ•˜๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ thread๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•œ ์š”์ฒญ๋“ค์€ ๋ชจ๋‘ ์‹คํŒจ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ํฅ๋ฏธ๋กœ์šด ์ ์€ ๊ฐ€์žฅ ์ฒ˜์Œ ๋ฐœํ–‰๋œ ์š”์ฒญ๋“ค์ด 30์ดˆ ๋’ค ๋ชจ๋‘ timeout์ด ๋ฐœ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉด, ์ƒˆ๋กœ์šด ์š”์ฒญ๋“ค์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด ์ฒ˜์Œ ๋“ค์–ด์˜จ ์š”์ฒญ์— ๋Œ€ํ•ด์„  starvation์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์ถ”์ธกํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ณผ 2 - ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€ ๊ตฌ์„ฑํ•œ๋‹ค.

๊ทธ๋ฆผ15. ์„œ๋ฒ„ ํ™•์žฅ

๊ฒฐ๊ณผ 2 ๋ถ„์„

๊ทธ๋ฆผ14. 5๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋ฒ„

์ด๋ฒˆ์—” ์„œ๋ฒ„๋ฅผ ๋Š˜๋ฆฐ ๊ฒฝ์šฐ์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ๊ฐ’(200)์œผ๋กœ ์„ค์ •๋œ ์„œ๋ฒ„๋ฅผ 5๋Œ€ ์ƒ์„ฑํ•œ ์‹คํ—˜ ํ•ด๋ดค๋‹ค. ๋‹จ์ผ ์„œ๋ฒ„์— ๋Œ€ํ•œ thread pool๋ฅผ ๋Š˜๋ ธ์„ ๋•Œ๋ณด๋‹ค ๋ช‡๋ช‡ ์ˆ˜์น˜๊ฐ€ ์กฐ๊ธˆ์”ฉ ์ฆ๊ฐ€ํ–ˆ์ง€๋งŒ http_req_duration (max)์˜ ์ˆ˜์น˜๊ฐ€ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์•„์กŒ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋˜ ์ฒซ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๋ฐœ์ƒํ•˜๋˜ request timeout ์—†์ด ์ฒ˜๋ฆฌ๋œ ๊ฒƒ๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ15. ๋ˆ์ด ์ตœ๊ณ ์•ผ!

์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค ์ž์ฒด๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๊ฐ CPU scheduling์— ์˜ํ•ด ๋” ๋งŽ์ด ์„ ํƒ๋˜๊ณ , ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” thread ๊ฐ„ context switching ๋น„์šฉ๋„ ์ค„์–ด๋“ค๊ฒŒ ๋˜๋ฉฐ ๋‹น์—ฐํ•˜๊ฒŒ ์„ฑ๋Šฅ์ด ์˜ฌ๋ผ๊ฐ„ ์ƒํ™ฉ์ด๋‹ค.

 

์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ํ†ตํ•ด ์ตœ์•…์˜ ๊ฒฝ์šฐ 60์ดˆ->12์ดˆ๋กœ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ 12์ดˆ๋Œ€ ์‘๋‹ต์„ ๊ฐ€์ง„ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ํ•œ ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด 1์ดˆ์—์„œ 3์ดˆ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์ดํƒˆ๋ฅ ์ด 30% ์ฆ๊ฐ€ํ•˜๊ณ , 6์ดˆ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด 106% ์ฆ๊ฐ€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

ํ…Œ์ŠคํŠธ API๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ 2000ms๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋„, ์ตœ์•…์˜ 13s๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

  1. ์‹คํŒจํ•œ ์‘๋‹ต์ด๋ผ๋„ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ , ์„œ๋ฒ„ ์ž์›์„ ์ ˆ์•ฝํ•œ๋‹ค.
  2. ์„œ๋ฒ„๋ฅผ FLEX๐Ÿ’ฐ ํ•ด๋ฒ„๋ฆฐ๋‹ค.
  3. ๋ณ‘๋ชฉ์ด ์ƒ๊ธฐ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.
  4. ์‹ค์‹œ๊ฐ„์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ฒˆ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์žฌ๋ฏธ๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

๊ทธ๋ฆผ16. ๊ฐ€์Šด์ด ์›…์žฅํ•ด์ง€๋Š” ๊ฒฐ๊ณผ

ํ˜„์žฌ ์„œ๋ฒ„ ๊ตฌ์„ฑ์€ 4 core 16Gb์˜ ๋…ธ๋“œ 3๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค. ์ด 30๋Œ€์˜ ์„œ๋ฒ„ ์ž์›์„ ํ™•์žฅํ•œ ๊ฒฐ๊ณผ 13s -> 4s๋กœ ์ค„์–ด๋“  ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋Š” API์˜ ๊ฒฝ์šฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ 2s ํ›„ ์‘๋‹ต์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— thread pool์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„ ๋“ฑ์„ ๊ณ ๋ คํ•˜๋ฉด ์–ด๋А ์ •๋„ ํ•ฉ๋‹นํ•œ ์‘๋‹ต ์‹œ๊ฐ„์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

์ฐธ๊ณ 

  • http://ksetup.com/news/news_view.php?idx_no=10424
  • https://sungwookkang.com/1508
  • http://cloudrain21.com/mysql-replication
  • https://blog.hbsmith.io/aws-aurora-%EB%8F%84%EC%9E%85%EC%97%90-%EB%8C%80%ED%95%9C-%EB%AA%87%EA%B0%80%EC%A7%80-%EC%82%AC%EC%8B%A4-45eb602bad58
  • https://junuuu.tistory.com/799

'๋ฉ”๋ชจ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Keycloak and ArgoCD integration  (0) 2025.06.06
์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์‹œ๊ฐ์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ  (0) 2023.12.25
'๋ฉ”๋ชจ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Keycloak and ArgoCD integration
  • ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์‹œ๊ฐ์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ
mooowu
mooowu
  • mooowu
    ์ˆ˜๋‹ฌ๋‹ฌ ๐Ÿฆฆ
    mooowu
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (6)
      • ๊ณต๋ถ€ (0)
      • ๋…์„œ (1)
        • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์šด์˜์ฒด์ œ (0)
        • ๋„คํŠธ์›Œํฌ (1)
      • ๋ฉ”๋ชจ (3)
      • ํ”„๋กœ์ ํŠธ (1)
        • ๊ฐœ๋ฐœ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
mooowu
์„œ๋ฒ„ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์€ ์–ด๋””์„œ ๋ฐœ์ƒํ• ๊นŒ?
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”