์ฑ๋ฅ ๋ถ์ ๋ฐ ์กฐ์ ์ ํด๋ผ์ด์ธํธ์ ์ฑ๋ฅ ๊ท์ ์ค์๋ฅผ ํ์ธํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
์ฑ๋ฅ ๋ถ์์ ํ๋ ์คํ ํ ์คํธ์ ๊ณผํ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ณ๋ชฉ ํ์์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์์์๋ Go ์น ์๋ฒ๋ฅผ ์๋ก ๋ค์ด ์ฑ๋ฅ ๋ถ์ ๋ฐ ํ๋์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ์ํฉ๋๋ค.
Go์๋ ํ๋กํ์ผ๋ง ๋๊ตฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํนํ ์ข์ต๋๋ค. pprof
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ต๋๋ค.
์ ๋ต
๊ตฌ์กฐ ๋ถ์์ ์ํ ์์ฝ ๋ชฉ๋ก์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ง๊ด์ด๋ ์ถ์ธก์ ๊ธฐ์ดํ์ฌ ๋ณ๊ฒฝํ๋ ๋์ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ ๊ฒ์ ๋๋ค:
- ์ฐ๋ฆฌ๋ ์ต์ ํ ๊ฒฝ๊ณ(์๊ตฌ์ฌํญ)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ์์คํ ์ ํธ๋์ญ์ ๋ก๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ํ ์คํธ(๋ฐ์ดํฐ ์์ฑ)๋ฅผ ์ํํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ๊ด์ฐฐํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ๋ถ์ํฉ๋๋ค - ๋ชจ๋ ์๊ตฌ ์ฌํญ์ด ์ถฉ์กฑ๋ฉ๋๊น?
- ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ณผํ์ ์ผ๋ก ์ค์ ํ๊ณ ๊ฐ์ค์ ์ธ์๋๋ค.
- ์ฐ๋ฆฌ๋ ์ด ๊ฐ์ค์ ๊ฒ์ฆํ๊ธฐ ์ํด ์คํ์ ์ํํฉ๋๋ค.
๊ฐ๋จํ HTTP ์๋ฒ ์ํคํ ์ฒ
์ด ๊ธฐ์ฌ์์๋ Golang์ ์์ HTTP ์๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ธฐ์ฌ์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค
๋ถ์ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ์์ฒญ์ ๋ํด Postgresql์ ํด๋งํ๋ HTTP ์๋ฒ์ ๋๋ค. ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์์คํ ๋ฉํธ๋ฆญ์ ์์งํ๊ณ ํ์ํ๊ธฐ ์ํ Prometheus, node_exporter ๋ฐ Grafana๊ฐ ์์ต๋๋ค.
๋จ์ํํ๊ธฐ ์ํด ์ํ ํ์ฅ(๋ฐ ๊ณ์ฐ ๋จ์ํ)์ ์ํด ๊ฐ ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํจ๊ป ๋ฐฐํฌ๋๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค.
๋ชฉํ ์ ์
์ด ๋จ๊ณ์์ ์ฐ๋ฆฌ๋ ๋ชฉํ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌด์์ ๋ถ์ํ๋ ค๊ณ ํ๋๊ฐ? ์ธ์ ๋๋ ์ง ์ด๋ป๊ฒ ์ ์ ์๋์? ์ด ๊ธฐ์ฌ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ์๋น์ค๊ฐ ์ด๋น 10๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
ะ
- ์ง์ฐ ์๊ฐ: ์์ฒญ์ 99%๊ฐ 60ms ์ด๋ด์ ์๋ฃ๋์ด์ผ ํฉ๋๋ค.
- ๋น์ฉ: ์๋น์ค๋ ๋น์ฌ๊ฐ ํฉ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๋ ์ต์ ๊ธ์ก์ ์๋นํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฒ๋ฆฌ๋์ ์ต๋ํํฉ๋๋ค.
- ์ฉ๋ ๊ณํ: ์ ์ฒด ํ์ฅ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ์คํํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ธ์คํด์ค ์, ์ด๊ธฐ ๋ก๋ ๋ฐ ํ๋ก๋น์ ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ฐ ํ์ํ ์ธ์คํด์ค ์๋ฅผ ์ดํดํ๊ณ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.
์ค๋ณต์ฑ n+1 .
์ง์ฐ ์๊ฐ์ ๋ถ์ ์ธ์๋ ์ต์ ํ๊ฐ ํ์ํ ์ ์์ง๋ง ์ฒ๋ฆฌ๋์ ๋ถ๋ช ํ ๋ถ์๋์ด์ผ ํฉ๋๋ค. SRE SLO ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ ๋ ์ง์ฐ ์์ฒญ์ ์ ํ ์์ ์๊ฐ ๋ํํ๋ ๊ณ ๊ฐ์ด๋ ๋น์ฆ๋์ค๋ก๋ถํฐ ๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์๋น์ค๋ ์๋ฌด๋ฐ ์ค์ ์์ด ์ฒ์๋ถํฐ ์ด ์๋ฌด๋ฅผ ์ดํํ ๊ฒ์ ๋๋ค!
ํ ์คํธ ํ๊ฒฝ ์ค์
ํ ์คํธ ํ๊ฒฝ์ ๋์์ผ๋ก ์์คํ ์ ์ธก์ ๋ ๋ก๋๋ฅผ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ๋ถ์์ ์ํด ์น ์๋น์ค ์ฑ๋ฅ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
๊ฑฐ๋ ๋ถํ
์ด ํ๊ฒฝ์์๋
$ 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 ์๊ฐ์ด ์ด๋๋ก ๊ฐ๋์ง ํ์ธํ ์ ์๋ ์ธก์ ์ ํ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก์ธ์ ์๊ฐ์ด ์๋น๋๋ ์์น์ ์์ ์ ํํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๋ฐ์ดํฐ๋ ๋ถ์ ์ค์ ๋ญ๋น๋๋ CPU ์๊ฐ๊ณผ ๋ถํ์ํ ์์ ์ํ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ป๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. Go(pprof)๋ ํ์ค ๋๊ตฌ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํ์ ์์ฑํ๊ณ ์ด๋ฅผ Flame ๊ทธ๋ํ๋ก ์๊ฐํํ ์ ์์ต๋๋ค. ๊ธฐ์ฌ ๋ท๋ถ๋ถ์์ ์ฌ์ฉ ๋ฐ ์ค์ ๊ฐ์ด๋์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์คํ, ๊ด์ฐฐ, ๋ถ์.
์คํ์ ํด๋ณด์. ์ฑ๊ณผ์ ๋ง์กฑํ ๋๊น์ง ์ํ, ๊ด์ฐฐ, ๋ถ์ํ๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๊ด์ฐฐ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ์์๋ก ๋ฎ์ ํ์ค ๊ฐ์ ์ ํํ์ฌ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๊ฐ ํ์ ๋จ๊ณ์์๋ ์ฝ๊ฐ์ ๋ณํ์ ํตํด ์ ํ๋ ํน์ ๋ฐฐ์จ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ๊ฐ ๋ถํ ํ
์คํธ ์คํ์ ์กฐ์ ๋ ์์ฒญ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. make load-test LOAD_TEST_RATE=X
.
์ด๋น ์์ฒญ 50๊ฐ
์์ชฝ ๋ ๊ทธ๋ํ์ ์ฃผ๋ชฉํ์ธ์. ์ผ์ชฝ ์๋จ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋น 50๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ์ถ์ ๋๋ฉฐ ์ค๋ฅธ์ชฝ ์๋จ์๋ ๊ฐ ์์ฒญ์ ์ง์ ์๊ฐ์ด ํ์๋ฉ๋๋ค. ๋ ๋งค๊ฐ๋ณ์ ๋ชจ๋ ์ฑ๋ฅ ํ๊ณ ๋ด์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ทธ๋ํ์ ๋นจ๊ฐ์ ์ HTTP ์์ฒญ ๋๊ธฐ ์๊ฐ 60ms์ SLO๋ฅผ ํ์ํฉ๋๋ค. ์ด ์ ์ ์ต๋ ์๋ต ์๊ฐ๋ณด๋ค ํจ์ฌ ๋ฎ์์ ๋ํ๋ ๋๋ค.
๋น์ฉ ์ธก๋ฉด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋น ์์ฒญ 10000๊ฐ / ์๋ฒ๋น ์์ฒญ 50๊ฐ = ์๋ฒ 200๊ฐ + 1๊ฐ
์ด ์์น๋ ์์ง ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด๋น ์์ฒญ 500๊ฐ
๋ก๋๊ฐ ์ด๋น 500๊ฐ์ ์์ฒญ์ ๋๋ฌํ๋ฉด ๋ ํฅ๋ฏธ๋ก์ด ์ผ์ด ๋ฐ์ํ๊ธฐ ์์ํฉ๋๋ค.
๋ค์ ํ ๋ฒ ์ผ์ชฝ ์๋จ ๊ทธ๋ํ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ก๋๋ฅผ ๊ธฐ๋กํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค. ์๋ต ๋๊ธฐ ์๊ฐ ๊ทธ๋ํ๋ ์ค๋ฅธ์ชฝ ์๋จ์ ์์ผ๋ฉฐ, ์ด๋น 500๊ฐ์ ์์ฒญ์ผ๋ก ์ธํด 25~40ms์ ์๋ต ์ง์ฐ์ด ๋ฐ์ํ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. 99๋ฒ์งธ ๋ฐฑ๋ถ์์๋ ์ฌ์ ํ ์์์ ์ ํํ 60ms SLO์ ์ ๋ค์ด๋ง์ต๋๋ค.
๋น์ฉ ์ธก๋ฉด์์:
์ด๋น ์์ฒญ 10000๊ฐ / ์๋ฒ๋น ์์ฒญ 500๊ฐ = ์๋ฒ 20๊ฐ + 1๊ฐ
๋ชจ๋ ๊ฒ์ ์ฌ์ ํ โโ๊ฐ์ ๋ ์ ์์ต๋๋ค.
์ด๋น ์์ฒญ 1000๊ฐ
ํ๋ฅญํ ์ถ์! ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋น 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
๊ทธ๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด CPU ์๊ฐ์ ์๋นํ๋ ์์น์ ์์ ๋ณด์ฌ์ค๋๋ค. ์ค๋ช
์์
X์ถ์ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌ๋ ์คํ ํ๋กํ ๋ชจ์ง๋จ์ด๋ฉฐ(์๊ฐ ์๋), Y์ถ์ ์คํ ๊น์ด๋ฅผ ํ์ํ๋ฉฐ [์์ชฝ]์์ XNUMX๋ถํฐ ๊ณ์ฐ๋ฉ๋๋ค. ๊ฐ ์ง์ฌ๊ฐํ์ ์คํ ํ๋ ์์ ๋๋ค. ํ๋ ์์ด ๋์์๋ก ์คํ์ ๋ ์์ฃผ ๋ํ๋ฉ๋๋ค. ๋งจ ์์ ์๋ ๊ฒ์ CPU์์ ์คํ๋๊ณ ์๋์ ์๋ ๊ฒ์ ํ์ ์์์ ๋๋ค. ์์์ ์ผ๋ฐ์ ์ผ๋ก ์๋ฌด ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ๋จ์ํ ํ๋ ์์ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋ฌด์์๋ก ์ ํ๋ฉ๋๋ค.
๋ถ์ - ๊ฐ์ค
ํ๋์ ์ํด ๋ญ๋น๋๋ CPU ์๊ฐ์ ์ฐพ๋ ๋ฐ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ธ๋ชจ์๋ ์ง์ถ์ ๊ฐ์ฅ ํฐ ์์ธ์ ์ฐพ์์ ์ ๊ฑฐํ ๊ฒ์ ๋๋ค. ํ๋กํ์ผ๋ง์ ํตํด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ ํํ ์ด๋์์ ํ๋ก์ธ์ ์๊ฐ์ ์๋นํ๋์ง ๋งค์ฐ ์ ํํ๊ฒ ์ ์ ์์ผ๋ฏ๋ก ์ด ์์ ์ ์ฌ๋ฌ ๋ฒ ์ํํด์ผ ํ ์๋ ์๊ณ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ์ฑ๋ฅ์ด ๋ชฉํ์ ๊ทผ์ ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
Brendan Gregg์ ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ผ ์ฐจํธ๋ฅผ ์์์ ์๋๋ก ์ฝ๊ฒ ์ต๋๋ค. ๊ฐ ์ค์๋ ์คํ ํ๋ ์(ํจ์ ํธ์ถ)์ด ํ์๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์ ํ๋ก๊ทธ๋จ์ ์ง์ ์ ์ผ๋ก, ๋ค๋ฅธ ๋ชจ๋ ํธ์ถ์ ์์ ํญ๋ชฉ์ ๋๋ค(์ฆ, ๋ค๋ฅธ ๋ชจ๋ ํธ์ถ์ ์คํ์ ํด๋น ํญ๋ชฉ์ด ํฌํจ๋ฉ๋๋ค). ๋ค์ ์ค์ ์ด๋ฏธ ๋ค๋ฆ ๋๋ค.
๊ทธ๋ํ์ ํจ์ ์ด๋ฆ ์์ ์ปค์๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋๋ฒ๊น
์ค์ ํด๋น ํจ์๊ฐ ์คํ์ ์์๋ ์ด ์๊ฐ์ด ํ์๋ฉ๋๋ค. HTTPServe ๊ธฐ๋ฅ์ 65%์ ์๊ฐ ๋์ ์กด์ฌํ๊ณ , ๋ค๋ฅธ ๋ฐํ์ ๊ธฐ๋ฅ๋ ์์์ต๋๋ค. runtime.mcall
, mstart
ะธ gc
, ๋๋จธ์ง ์๊ฐ์ ์ฐจ์งํ์ต๋๋ค. ์ฌ๋ฏธ์๋ ์ฌ์ค: ์ด ์๊ฐ์ 5%๊ฐ DNS ์ฟผ๋ฆฌ์ ์์๋ฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ์ฐพ๋ ์ฃผ์๋ Postgresql์ ์ํฉ๋๋ค. ํด๋ฆญ FindByAge
:
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ด ํ๋ก๊ทธ๋จ์ ์์น์ ์ผ๋ก ์ง์ฐ์ ์ถ๊ฐํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ์์ธ, ์ฆ ์ฐ๊ฒฐ ์ด๊ธฐ ๋ฐ ๋ซ๊ธฐ, ๋ฐ์ดํฐ ์์ฒญ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์์์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ํ๋ DNS ์์ฒญ, ์ฐ๊ฒฐ ์ด๊ธฐ ๋ฐ ๋ซ๊ธฐ๊ฐ ์ด ์คํ ์๊ฐ์ ์ฝ 13%๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ฐ์ค: ํ๋ง์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๋ฉด ๋จ์ผ HTTP ์์ฒญ ์๊ฐ์ด ์ค์ด๋ค์ด ์ฒ๋ฆฌ๋์ด ๋์ด๋๊ณ ๋๊ธฐ ์๊ฐ์ด ๋ฎ์์ง๋๋ค..
์ ํ๋ฆฌ์ผ์ด์ ์ค์ - ์คํ
์์ค ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๊ฐ ์์ฒญ์ ๋ํด Postgresql์ ๋ํ ์ฐ๊ฒฐ์ ์ ๊ฑฐํด ๋ด
๋๋ค. ์ฒซ ๋ฒ์งธ ์ต์
์ ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
if err != nil {
return nil, err
}
์คํ, ๊ด์ฐฐ, ๋ถ์
์ด๋น 1000๊ฐ์ ์์ฒญ์ผ๋ก ํ ์คํธ๋ฅผ ๋ค์ ์์ํ ํ p99์ ๋๊ธฐ ์๊ฐ ์์ค์ด SLO 60ms๋ก ์ ์์ผ๋ก ๋์์จ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค!
๋น์ฉ์ ์ผ๋ง์ ๋๊น?
์ด๋น ์์ฒญ 10000๊ฐ / ์๋ฒ๋น ์์ฒญ 1000๊ฐ = ์๋ฒ 10๊ฐ + 1๊ฐ
๋ ์ํด๋ณด์!
์ด๋น ์์ฒญ 2000๊ฐ
๋ก๋๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ฉด ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ํ์๋ฉ๋๋ค. ์ผ์ชฝ ์๋จ ๊ทธ๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋น 2000๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ p100์ด 60ms๋ณด๋ค ๋ฎ์ผ๋ฉฐ p99๊ฐ SLO๋ฅผ ์ถฉ์กฑํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋น์ฉ ์ธก๋ฉด์์:
์ด๋น ์์ฒญ 10000๊ฐ / ์๋ฒ๋น ์์ฒญ 2000๊ฐ = ์๋ฒ 5๊ฐ + 1๊ฐ
์ด๋น ์์ฒญ 3000๊ฐ
์ฌ๊ธฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ 3000ms ๋ฏธ๋ง์ p99 ๋๊ธฐ ์๊ฐ์ผ๋ก 60๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. SLO๋ฅผ ์๋ฐํ์ง ์์ผ๋ฉฐ ๋น์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค.
์ด๋น ์์ฒญ 10000๊ฐ / ์๋ฒ๋น ์์ฒญ 3000๊ฐ = ์๋ฒ 4๊ฐ + 1๊ฐ (์๊ฐ๋์ด ์ ๋ฆฌํ์ จ๋ค์. ์ฝ. ์ญ์)
๋ ๋ค๋ฅธ ๋ถ์์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ถ์ - ๊ฐ์ค
์ด๋น 3000๊ฐ์ ์์ฒญ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฒ๊น ๊ฒฐ๊ณผ๋ฅผ ์์งํ๊ณ ํ์ํฉ๋๋ค.
์ฌ์ ํ 6%์ ์๊ฐ์ด ์ฐ๊ฒฐ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ ์ค์ ํ๋ฉด ์ฑ๋ฅ์ด ํฅ์๋์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ์ฐ๊ฒฐ์ ์์ฑํ๋ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์ค: ํ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๊ฒฐ์ด ๊ณ์ ์ญ์ ๋๊ณ ์ง์์ง๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐ๊ฒฐ์ ์ฌ์ค์ ํด์ผ ํฉ๋๋ค. ๋ณด๋ฅ ์ค์ธ ์ฐ๊ฒฐ ์๋ฅผ ํ ํฌ๊ธฐ๋ก ์ค์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฐ๊ฒฐ์ ์์ฑํ๋ ๋ฐ ์์๋๋ ์๊ฐ์ ์ต์ํํ์ฌ ๋๊ธฐ ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค..
์ ํ๋ฆฌ์ผ์ด์ ์ค์ - ์คํ
์ค์นํ๋ ์ค
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
return nil, err
}
์คํ, ๊ด์ฐฐ, ๋ถ์
์ด๋น ์์ฒญ 3000๊ฐ
p99๋ 60ms ๋ฏธ๋ง์ด๊ณ p100์ ํจ์ฌ ์ ์ต๋๋ค!
Flame ๊ทธ๋ํ๋ฅผ ํ์ธํด๋ณด๋ฉด ์ฐ๊ฒฐ์ด ๋ ์ด์ ๋์ ๋์ง ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค! ์ข ๋ ์์ธํ ํ์ธํด ๋ณผ๊น์ pg(*conn).query
โ ์ฌ๊ธฐ์๋ ์ฐ๊ฒฐ์ด ์ค์ ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ฑ๋ฅ ๋ถ์์ ๊ณ ๊ฐ์ ๊ธฐ๋์ ๋น๊ธฐ๋ฅ์ ์๊ตฌ ์ฌํญ์ด ์ถฉ์กฑ๋๊ณ ์๋์ง ์ดํดํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ด์ฐฐ ๋ด์ฉ๊ณผ ๊ณ ๊ฐ ๊ธฐ๋์น๋ฅผ ๋น๊ตํ์ฌ ๋ถ์ํ๋ฉด ํ์ฉ ๊ฐ๋ฅํ ๊ฒ๊ณผ ํ์ฉ๋์ง ์๋ ๊ฒ์ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Go๋ ๋ถ์์ ๊ฐ๋จํ๊ณ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ฅ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ถ์ฒ : habr.com