์ „์ฒด ๊ธ€ 32

Virtual Thread ์ ์šฉ๊ณผ Pinning ๋ฌธ์ œ

์ด์ „ Scale-Out ๊ณผ์ •์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ ๊ธ€์—์„œ Blocking ๋ชจ๋ธ์˜ ํ•œ๊ณ„์ ์œผ๋กœ ์ธํ•œ ๋ณ‘๋ชฉ์ง€์ ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด Spring MVC์™€ ํ†ฐ์บฃ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ๋Š” ์ธํ„ฐ์…‰ํ„ฐ, ํ•„ํ„ฐ, ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ์š”์ฒญ์ด Blocking ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด I/O ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๊ฐ€ Timed-Waiting ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋˜๊ณ  CPU๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ตœ๋Œ€ 200๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ Timed-waiting ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๋ถ€ํ•˜๋ฅผ ๊ณ„์†ํ•ด์„œ ๋Š˜๋ฆฌ๋”๋ผ๋„ CPU ์‚ฌ์šฉ๋ฅ ์ด 60~80%๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Non-Blocki..

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ณ€๊ฒฝ (Feat.Nginx)

์ง€๋‚œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ์—์„œ Blocking ์ž‘์—…์œผ๋กœ ์ธํ•ด CPU ์‚ฌ์šฉ๋ฅ ์ด 70%์— ๋จธ๋ฌด๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ค๋ค˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Blocking ์ž‘์—…์ด๋ผ๊ณ ๋Š” Redis ์š”์ฒญ๋ฐ–์— ์—†๋Š” ์ƒํ™ฉ์—์„œ ์ด๋Š” ๋„ˆ๋ฌด ๋‚ฎ์€ ์ˆ˜์น˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋˜ํ•œ  ์ด๋•Œ๊นŒ์ง€ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•ญ์ƒ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ์˜ ์ง„ํญ์ด ์™œ์ด๋ ‡๊ฒŒ ํฌ์ง€...๊ฐ€๋”์”ฉ ์™œ ๊ทธ๋ž˜ํ”„๊ฐ€ ํŠˆ๊นŒ...์™€ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ•ญ์ƒ ํ•ด์™”๋‹ค. ์ด๋Ÿฌํ•œ ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ธํ”„๋ผ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋‚ด๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๊พธ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ์ ์„ ์ฐพ๊ณ ์žํ–ˆ๋‹ค.    โ˜‘๏ธ Ngrinder Agent์™€ Controller ๋ถ„๋ฆฌ ๊ธฐ์กด์—๋Š” ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํˆด๋กœ ์‚ฌ์šฉํ•˜๋˜ Ngrinder์˜ Agent์™€ Controller๋ฅผ ํ•˜๋‚˜์˜ PC์—์„œ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋•Œ ๋‘ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ I/O ๋“ฑ ๊ฐ™..

๊ณ ๊ฐ€์šฉ์„ฑ ์ธํ”„๋ผ ๊ตฌ์ถ•

โ˜‘๏ธ ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ์žฅ์• ๋‚ด๊ตฌ์„ฑ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์ค‘ WAS๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” EC2๊ฐ€ ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ์šด์˜๋˜๋Š” ์ค‘์— ์ด์™€ ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๊ฐ€์šฉ์„ฑ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•จ์— ์žˆ์–ด์„œ ์„ฑ๋Šฅ๋ณด๋‹ค ์ค‘์š”ํ•œ ์š”์†Œ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๊ธ€์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์ด์–ด ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ์žฅ์• ๋‚ด๊ตฌ์„ฑ, ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ ์ž ๋…ธ๋ ฅํ–ˆ๋˜ ๊ฒฝํ—˜์„ ๊ธ€๋กœ ๋‚จ๊ฒจ๋ณด๊ณ ์žํ•œ๋‹ค.  ๋จผ์ € ๊ณ ๊ฐ€์šฉ์„ฑ์ด๋ผ๋Š” ์šฉ์–ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ๊ณ ๊ฐ€์šฉ์„ฑ์€ ๋ณต์›๋ ฅ๊ณผ ๊ด€๋ จ๋œ ์šฉ์–ด์ด๋ฉฐ ๋ง ๊ทธ๋Œ€๋กœ ๋†’์€ ๊ฐ€์šฉ์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ์ž์„ธํ•˜๊ฒŒ๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์„œ๋น„์Šค๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ์ด 100์‹œ๊ฐ„ ์ค‘ 1์‹œ๊ฐ„๋™์•ˆ ์˜๋„์น˜์•Š๊ฒŒ..

AWS

Scale out ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ถ„์„

โ˜‘๏ธ Scale-Out ์ ์šฉ ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉํ‘œ์ด์ „ ๊ธ€์—์„œ Redis์™€ Lua Script๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ Scale-up์„ ์ง„ํ–‰ํ–ˆ๋‹ค. Scale-up์„ ๊ณ„์†ํ•ด์„œ ํ•ด ๋‚˜๊ฐ„๋‹ค๋ฉด ๋‹จ์ผ ์„œ๋ฒ„์˜ ์ž์›์„ ์ฆ์„คํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ์ • ๋ถ€๋ถ„๊นŒ์ง€ ํšจ๊ณผ์ ์ด์ง€๋งŒ ๋น„์šฉ์ ์ธ ํ•œ๊ณ„์™€ ํ•˜๋“œ์›จ์–ด์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Scale-out์„ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ WAS ์„œ๋ฒ„์— ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ  Auto Scaling๊ณผ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ ์ž ํ–ˆ๋‹ค.   Scale-Out ์„ค๊ณ„ ๐Ÿ’  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญWAS EC2 ์ธ์Šคํ„ด์Šค ์ถ”๊ฐ€ - ๊ธฐ์กด ์ธํ”„๋ผ์— ์ถ”๊ฐ€์ ์œผ๋กœ WAS EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ๋‹ค์ค‘ ์„œ๋ฒ„ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.Application Load Balancer ๋ฐฐ์น˜ - ALB๋ฅผ ํ†ตํ•ด..

Cache Stampede ๋ฌธ์ œ ํ•ด๊ฒฐ (PER, ๋ถ„์‚ฐ๋ฝ)

โ˜‘๏ธ Scale-Up ์ด์ „ ๊ธ€์—์„œ ๋งํ•œ ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Scale-up (1vCpu, 1GB RAM → 2vCpu, 2GB RAM) ํ•œ ๊ฒฐ๊ณผ, ํ‰๊ท  TPS๊ฐ€ 1093๊นŒ์ง€ ์ฆ๊ฐ€ํ–ˆ์œผ๋ฉฐ, ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์€ 167ms๋กœ ๊ฐ์†Œํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ๊ฐ„ํ—์ ์œผ๋กœ TPS๊ฐ€ ๋Œ€ํญ ๊ฐ์†Œํ•˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.  ๋ฌธ์ œ ์›์ธ์„ ์ฐพ๊ธฐ์œ„ํ•ด Pinpoint๋ฅผ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, TPS๊ฐ€ ๊ฐ์†Œํ•œ ์‹œ์ ๋งˆ๋‹ค ์บ์‹œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์–ด ๋‹ค์ˆ˜์˜ ์š”์ฒญ์ด DB๋กœ ํ–ฅํ•˜๊ณ  ์žˆ์—ˆ๊ณ  Redis์— ์บ์‹œ๋ฅผ ์ ์žฌํ•˜๋Š” ๋ฌด์˜๋ฏธํ•œ ์ค‘๋ณต ์“ฐ๊ธฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Cache Stampede ๋ผ๊ณ  ํ•œ๋‹ค. DB ์กฐํšŒ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ DB ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€๊ฒฝ์šฐ Cache Stampede๋Š” ์น˜๋ช…์ ์ด๋‹ค. ๋งŒ์•ฝ ..

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 

๋ชฉ์ฐจ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ์ธ๋ฑ์Šค ๊ฐœ์„ EC2 Redis VS ElasticacheScale-upCache Stampede (TTL, ๋ถ„์‚ฐ๋ฝ, PER)Lua ScriptScale-out๊ณ ๊ฐ€์šฉ์„ฑ ์ธํ”„๋ผ ๊ตฌ์ถ•Virtual Thread ์ ์šฉ๊ณผ Pinning ๋ฌธ์ œ  ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ ์ด์ „ ๊ธ€ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ์‹ค์ œ ์„œ๋น„์Šค์šฉ DB ์„œ๋ฒ„์—์„œ๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๊ฒƒ์ด๊ณ  ์ด์— ๋”ฐ๋ผ ์ž์›์„ ์ ์œ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ๋А๋ฆฐ ์„ฑ๋Šฅ์„ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.์ด๋Ÿฌํ•œ ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ด๋ฒˆ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ API๋ฅผ ์š”์ฒญํ•˜๊ณ  API์˜ ์š”์ฒญ ๋น„์œจ์„ ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ํ†ตํ•ด ์กฐ์ ˆํ•˜๋Š” ๋“ฑ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ๊ณผ ์ตœ๋Œ€ํ•œ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ–ˆ๋‹ค.    โ˜‘๏ธ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ ๋ถ€ํ•˜ ํ…Œ..