SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์„ฑ๋Šฅ ๋ถ„์„ ๋ฐ ์กฐ์ •์€ ํด๋ผ์ด์–ธํŠธ์˜ ์„ฑ๋Šฅ ๊ทœ์ • ์ค€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ถ„์„์€ ํŠœ๋‹ ์‹คํ—˜ ํ…Œ์ŠคํŠธ์— ๊ณผํ•™์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋Š” Go ์›น ์„œ๋ฒ„๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์„ฑ๋Šฅ ๋ถ„์„ ๋ฐ ํŠœ๋‹์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Go์—๋Š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์ข‹์Šต๋‹ˆ๋‹ค. pprof ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์ „๋žต

๊ตฌ์กฐ ๋ถ„์„์„ ์œ„ํ•œ ์š”์•ฝ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง๊ด€์ด๋‚˜ ์ถ”์ธก์— ๊ธฐ์ดˆํ•˜์—ฌ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ์šฐ๋ฆฌ๋Š” ์ตœ์ ํ™” ๊ฒฝ๊ณ„(์š”๊ตฌ์‚ฌํ•ญ)๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์˜ ํŠธ๋žœ์žญ์…˜ ๋กœ๋“œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ(๋ฐ์ดํ„ฐ ์ƒ์„ฑ)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค - ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋ฉ๋‹ˆ๊นŒ?
  • ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณผํ•™์ ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๊ฐ€์„ค์„ ์„ธ์›๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ—˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๊ฐ„๋‹จํ•œ HTTP ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Golang์˜ ์ž‘์€ HTTP ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—.

๋ถ„์„ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด Postgresql์„ ํด๋งํ•˜๋Š” HTTP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ Prometheus, node_exporter ๋ฐ Grafana๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ‰ ํ™•์žฅ(๋ฐ ๊ณ„์‚ฐ ๋‹จ์ˆœํ™”)์„ ์œ„ํ•ด ๊ฐ ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๋ชฉํ‘œ ์ •์˜

์ด ๋‹จ๊ณ„์—์„œ ์šฐ๋ฆฌ๋Š” ๋ชฉํ‘œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ๋ถ„์„ํ•˜๋ ค๊ณ  ํ•˜๋Š”๊ฐ€? ์–ธ์ œ ๋๋‚ ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”? ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๊ณ  ์„œ๋น„์Šค๊ฐ€ ์ดˆ๋‹น 10๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ะ’ Google SRE ๋„์„œ ์„ ํƒ ๋ฐ ๋ชจ๋ธ๋ง ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ง€์—ฐ ์‹œ๊ฐ„: ์š”์ฒญ์˜ 99%๊ฐ€ 60ms ์ด๋‚ด์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์šฉ: ์„œ๋น„์Šค๋Š” ๋‹น์‚ฌ๊ฐ€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ตœ์†Œ ๊ธˆ์•ก์„ ์†Œ๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ตœ๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฉ๋Ÿ‰ ๊ณ„ํš: ์ „์ฒด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ์ˆ˜, ์ดˆ๊ธฐ ๋กœ๋“œ ๋ฐ ํ”„๋กœ๋น„์ €๋‹ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต์„ฑ n+1.

์ง€์—ฐ ์‹œ๊ฐ„์€ ๋ถ„์„ ์™ธ์—๋„ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฒ˜๋ฆฌ๋Ÿ‰์€ ๋ถ„๋ช…ํžˆ ๋ถ„์„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SRE SLO ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์—ฐ ์š”์ฒญ์€ ์ œํ’ˆ ์†Œ์œ ์ž๊ฐ€ ๋Œ€ํ‘œํ•˜๋Š” ๊ณ ๊ฐ์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ๋ถ€ํ„ฐ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์•„๋ฌด๋Ÿฐ ์„ค์ • ์—†์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ์˜๋ฌด๋ฅผ ์ดํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์˜ ๋„์›€์œผ๋กœ ์‹œ์Šคํ…œ์— ์ธก์ •๋œ ๋กœ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„์„ ์œ„ํ•ด ์›น ์„œ๋น„์Šค ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ฑฐ๋ž˜ ๋ถ€ํ•˜

์ด ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์กฐ๋กœ์šด ์ƒํ™œ์„ํ•˜๋‹ค ์ค‘์ง€๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž ์ง€์ • HTTP ์š”์ฒญ ์†๋„๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report

๊ด€์ธก

ํŠธ๋žœ์žญ์…˜ ๋กœ๋“œ๋Š” ๋Ÿฐํƒ€์ž„์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์š”์ฒญ ์ˆ˜, ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„) ๋ฐ ์šด์˜ ์ฒด์ œ(๋ฉ”๋ชจ๋ฆฌ, CPU, IOPS) ์ง€ํ‘œ ์™ธ์—๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜์™€ CPU ์‹œ๊ฐ„์ด ์†Œ๋น„๋˜๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋ง

ํ”„๋กœํŒŒ์ผ๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ CPU ์‹œ๊ฐ„์ด ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ธก์ • ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„์ด ์†Œ๋น„๋˜๋Š” ์œ„์น˜์™€ ์–‘์„ ์ •ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์ด ๋ฐ์ดํ„ฐ๋Š” ๋ถ„์„ ์ค‘์— ๋‚ญ๋น„๋˜๋Š” CPU ์‹œ๊ฐ„๊ณผ ๋ถˆํ•„์š”ํ•œ ์ž‘์—… ์ˆ˜ํ–‰์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์–ป๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go(pprof)๋Š” ํ‘œ์ค€ ๋„๊ตฌ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Flame ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ ๋’ท๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ ๋ฐ ์„ค์ • ๊ฐ€์ด๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰, ๊ด€์ฐฐ, ๋ถ„์„.

์‹คํ—˜์„ ํ•ด๋ณด์ž. ์„ฑ๊ณผ์— ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰, ๊ด€์ฐฐ, ๋ถ„์„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ด€์ฐฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ž„์˜๋กœ ๋‚ฎ์€ ํ•˜์ค‘ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ›„์† ๋‹จ๊ณ„์—์„œ๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์„ ํ†ตํ•ด ์„ ํƒ๋œ ํŠน์ • ๋ฐฐ์œจ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋“œ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์‹คํ–‰์€ ์กฐ์ •๋œ ์š”์ฒญ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. make load-test LOAD_TEST_RATE=X.

์ดˆ๋‹น ์š”์ฒญ 50๊ฐœ

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์œ„์ชฝ ๋‘ ๊ทธ๋ž˜ํ”„์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ์™ผ์ชฝ ์ƒ๋‹จ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ดˆ๋‹น 50๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋ฉฐ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์—๋Š” ๊ฐ ์š”์ฒญ์˜ ์ง€์† ์‹œ๊ฐ„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ ์„ฑ๋Šฅ ํ•œ๊ณ„ ๋‚ด์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„์˜ ๋นจ๊ฐ„์ƒ‰ ์„  HTTP ์š”์ฒญ ๋Œ€๊ธฐ ์‹œ๊ฐ„ 60ms์— SLO๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ ์€ ์ตœ๋Œ€ ์‘๋‹ต ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋น„์šฉ ์ธก๋ฉด์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ดˆ๋‹น ์š”์ฒญ 10000๊ฐœ / ์„œ๋ฒ„๋‹น ์š”์ฒญ 50๊ฐœ = ์„œ๋ฒ„ 200๊ฐœ + 1๊ฐœ

์ด ์ˆ˜์น˜๋Š” ์•„์ง ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๋‹น ์š”์ฒญ 500๊ฐœ

๋กœ๋“œ๊ฐ€ ์ดˆ๋‹น 500๊ฐœ์˜ ์š”์ฒญ์— ๋„๋‹ฌํ•˜๋ฉด ๋” ํฅ๋ฏธ๋กœ์šด ์ผ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๋‹ค์‹œ ํ•œ ๋ฒˆ ์™ผ์ชฝ ์ƒ๋‹จ ๊ทธ๋ž˜ํ”„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ ๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ทธ๋ž˜ํ”„๋Š” ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ์œผ๋ฉฐ, ์ดˆ๋‹น 500๊ฐœ์˜ ์š”์ฒญ์œผ๋กœ ์ธํ•ด 25~40ms์˜ ์‘๋‹ต ์ง€์—ฐ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 99๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์œ„์—์„œ ์„ ํƒํ•œ 60ms SLO์— ์ž˜ ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค.

๋น„์šฉ ์ธก๋ฉด์—์„œ:

์ดˆ๋‹น ์š”์ฒญ 10000๊ฐœ / ์„œ๋ฒ„๋‹น ์š”์ฒญ 500๊ฐœ = ์„œ๋ฒ„ 20๊ฐœ + 1๊ฐœ

๋ชจ๋“  ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๋‹น ์š”์ฒญ 1000๊ฐœ

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

ํ›Œ๋ฅญํ•œ ์ถœ์‹œ! ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ดˆ๋‹น 1000๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ SLO์— ๋”ฐ๋ผ ์ง€์—ฐ ์‹œ๊ฐ„ ์ œํ•œ์ด ์œ„๋ฐ˜๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๊ทธ๋ž˜ํ”„์˜ p99 ๋ผ์ธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. p100 ๋ผ์ธ์ด ํ›จ์”ฌ ๋†’๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹ค์ œ ์ง€์—ฐ์€ ์ตœ๋Œ€ 60ms๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ”„๋กœํŒŒ์ผ๋ง์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋ง

ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•ด ๋กœ๋“œ๋ฅผ ์ดˆ๋‹น 1000๊ฐœ ์š”์ฒญ์œผ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ pprof ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด CPU ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pprof, ๋กœ๋“œ ์‹œ ์ปฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๊ทธ๋ž˜ํ”„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด CPU ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ์œ„์น˜์™€ ์–‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์„ค๋ช…์—์„œ ๋ธŒ๋ Œ๋“  ๊ทธ๋ ˆ๊ทธ:

X์ถ•์€ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์Šคํƒ ํ”„๋กœํ•„ ๋ชจ์ง‘๋‹จ์ด๋ฉฐ(์‹œ๊ฐ„ ์•„๋‹˜), Y์ถ•์€ ์Šคํƒ ๊นŠ์ด๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ [์œ„์ชฝ]์—์„œ XNUMX๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ง์‚ฌ๊ฐํ˜•์€ ์Šคํƒ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์ด ๋„“์„์ˆ˜๋ก ์Šคํƒ์— ๋” ์ž์ฃผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งจ ์œ„์— ์žˆ๋Š” ๊ฒƒ์€ CPU์—์„œ ์‹คํ–‰๋˜๊ณ  ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ์€ ํ•˜์œ„ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ๋‹จ์ˆœํžˆ ํ”„๋ ˆ์ž„์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๋ถ„์„ - ๊ฐ€์„ค

ํŠœ๋‹์„ ์œ„ํ•ด ๋‚ญ๋น„๋˜๋Š” CPU ์‹œ๊ฐ„์„ ์ฐพ๋Š” ๋ฐ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์“ธ๋ชจ์—†๋Š” ์ง€์ถœ์˜ ๊ฐ€์žฅ ํฐ ์›์ธ์„ ์ฐพ์•„์„œ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ •ํ™•ํžˆ ์–ด๋””์—์„œ ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š”์ง€ ๋งค์šฐ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋ชฉํ‘œ์— ๊ทผ์ ‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Brendan Gregg์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ฐจํŠธ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ค„์—๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„(ํ•จ์ˆ˜ ํ˜ธ์ถœ)์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ ์œผ๋กœ, ๋‹ค๋ฅธ ๋ชจ๋“  ํ˜ธ์ถœ์˜ ์ƒ์œ„ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋‹ค๋ฅธ ๋ชจ๋“  ํ˜ธ์ถœ์˜ ์Šคํƒ์— ํ•ด๋‹น ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค). ๋‹ค์Œ ์ค„์€ ์ด๋ฏธ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๊ทธ๋ž˜ํ”„์˜ ํ•จ์ˆ˜ ์ด๋ฆ„ ์œ„์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋””๋ฒ„๊น… ์ค‘์— ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์Šคํƒ์— ์žˆ์—ˆ๋˜ ์ด ์‹œ๊ฐ„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. HTTPServe ๊ธฐ๋Šฅ์€ 65%์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์กด์žฌํ–ˆ๊ณ , ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. runtime.mcall, mstart ะธ gc, ๋‚˜๋จธ์ง€ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ์ด ์‹œ๊ฐ„์˜ 5%๊ฐ€ DNS ์ฟผ๋ฆฌ์— ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

ํ”„๋กœ๊ทธ๋žจ์ด ์ฐพ๋Š” ์ฃผ์†Œ๋Š” Postgresql์— ์†ํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ FindByAge:

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์›์น™์ ์œผ๋กœ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์›์ธ, ์ฆ‰ ์—ฐ๊ฒฐ ์—ด๊ธฐ ๋ฐ ๋‹ซ๊ธฐ, ๋ฐ์ดํ„ฐ ์š”์ฒญ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” DNS ์š”์ฒญ, ์—ฐ๊ฒฐ ์—ด๊ธฐ ๋ฐ ๋‹ซ๊ธฐ๊ฐ€ ์ด ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์•ฝ 13%๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฐ€์„ค: ํ’€๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ HTTP ์š”์ฒญ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค์–ด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค..

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • - ์‹คํ—˜

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด Postgresql์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•ด ๋ด…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ํ’€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์—์„œ. ์ด ์‹คํ—˜์—์„œ ์šฐ๋ฆฌ๋Š” ์„ค์ •ํ•˜์ž Go์šฉ SQL ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ ์—ฐ๊ฒฐ ํ’€๋ง:

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)

if err != nil {
   return nil, err
}

์‹คํ–‰, ๊ด€์ฐฐ, ๋ถ„์„

์ดˆ๋‹น 1000๊ฐœ์˜ ์š”์ฒญ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„ p99์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ˆ˜์ค€์ด SLO 60ms๋กœ ์ •์ƒ์œผ๋กœ ๋Œ์•„์˜จ ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค!

๋น„์šฉ์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

์ดˆ๋‹น ์š”์ฒญ 10000๊ฐœ / ์„œ๋ฒ„๋‹น ์š”์ฒญ 1000๊ฐœ = ์„œ๋ฒ„ 10๊ฐœ + 1๊ฐœ

๋” ์ž˜ํ•ด๋ณด์ž!

์ดˆ๋‹น ์š”์ฒญ 2000๊ฐœ

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๋กœ๋“œ๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์™ผ์ชฝ ์ƒ๋‹จ ๊ทธ๋ž˜ํ”„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ดˆ๋‹น 2000๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  p100์ด 60ms๋ณด๋‹ค ๋‚ฎ์œผ๋ฉฐ p99๊ฐ€ SLO๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋น„์šฉ ์ธก๋ฉด์—์„œ:

์ดˆ๋‹น ์š”์ฒญ 10000๊ฐœ / ์„œ๋ฒ„๋‹น ์š”์ฒญ 2000๊ฐœ = ์„œ๋ฒ„ 5๊ฐœ + 1๊ฐœ

์ดˆ๋‹น ์š”์ฒญ 3000๊ฐœ

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์—ฌ๊ธฐ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ 3000ms ๋ฏธ๋งŒ์˜ p99 ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ 60๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SLO๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋น„์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ดˆ๋‹น ์š”์ฒญ 10000๊ฐœ / ์„œ๋ฒ„๋‹น ์š”์ฒญ 3000๊ฐœ = ์„œ๋ฒ„ 4๊ฐœ + 1๊ฐœ (์ž‘๊ฐ€๋‹˜์ด ์ •๋ฆฌํ•˜์…จ๋„ค์š”. ์•ฝ. ์—ญ์ž)

๋˜ ๋‹ค๋ฅธ ๋ถ„์„์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ถ„์„ - ๊ฐ€์„ค

์ดˆ๋‹น 3000๊ฐœ์˜ ์š”์ฒญ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ฒ„๊น… ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

์—ฌ์ „ํžˆ 6%์˜ ์‹œ๊ฐ„์ด ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ’€์„ ์„ค์ •ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์†ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ƒˆ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์„ค: ํ’€์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—ฐ๊ฒฐ์ด ๊ณ„์† ์‚ญ์ œ๋˜๊ณ  ์ง€์›Œ์ง€๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฐ๊ฒฐ์„ ์žฌ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋ฅ˜ ์ค‘์ธ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ํ’€ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค..

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • - ์‹คํ—˜

์„ค์น˜ํ•˜๋Š” ์ค‘ MaxIdleConns ํ’€ ํฌ๊ธฐ์™€ ๋™์ผ(๋˜ํ•œ ์„ค๋ช…๋จ) ์—ฌ๊ธฐ์—):

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
   return nil, err
}

์‹คํ–‰, ๊ด€์ฐฐ, ๋ถ„์„

์ดˆ๋‹น ์š”์ฒญ 3000๊ฐœ

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

p99๋Š” 60ms ๋ฏธ๋งŒ์ด๊ณ  p100์€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค!

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

Flame ๊ทธ๋ž˜ํ”„๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์—ฐ๊ฒฐ์ด ๋” ์ด์ƒ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ข€ ๋” ์ž์„ธํžˆ ํ™•์ธํ•ด ๋ณผ๊นŒ์š” pg(*conn).query โ€” ์—ฌ๊ธฐ์„œ๋„ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

SRE: ์„ฑ๋Šฅ ๋ถ„์„. Go์—์„œ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„ค์ •๋ฐฉ๋ฒ•

๊ฒฐ๋ก 

์„ฑ๋Šฅ ๋ถ„์„์€ ๊ณ ๊ฐ์˜ ๊ธฐ๋Œ€์™€ ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ด€์ฐฐ ๋‚ด์šฉ๊ณผ ๊ณ ๊ฐ ๊ธฐ๋Œ€์น˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ถ„์„ํ•˜๋ฉด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๊ณผ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ๋ถ„์„์„ ๊ฐ„๋‹จํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚ด์žฅ๋œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€