ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ด ๊ธ€์€ ์ตœ๊ทผ์— ์žˆ์—ˆ๋˜ ์„œ๋ฒ„ OOMKilled ์žฅ์•  ๊ณผ์ •์„ ๊ธฐ๋ก ๋ฐ ๊ณต์œ ํ•˜๋ฉฐ ํšŒ๊ณ ํ•˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด ๊ธ€์€ ์ธํ”„๋ผ ๋ ˆ๋ฒจ(cpu, memory)์—์„œ์˜ ์žฅ์•  ๊ฐ์ง€ ๋ฐ ๋Œ€์‘ ํ”„๋กœ์„ธ์Šค์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— NPE(Null Point Exception) ๊ฐ™์€ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ์˜ ๋ช…ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๋ฌธ์ œ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด OOMKilled ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜์‹œ๋‚˜์š”?

์ €๋Š” ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.


1. ์žฅ์•  ๊ฐ์ง€
2. ์˜ˆ์ƒ๋˜๋Š” ์›์ธ ๋ฒ”์œ„๋ฅผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ฐพ๊ณ  ๊ฐ€์„ค์„ ์„ธ์šด๋‹ค. (๊ฐ€์„ค ์ˆ˜๋ฆฝ)
3. ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด APM, log ๋“ฑ ๋‹จ์„œ๋“ค์„ ์ฐพ๊ณ  ๊ฐ€์„ค์„ ํ™•์ธํ•˜๊ณ  ์›์ธ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ„๋‹ค. (๊ฐ€์„ค ๊ฒ€์ฆ ๋ฐ route finding)
4. ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์›์ธ์„ ๋ช…ํ™•ํžˆ ์ฐพ์•˜๋‹ค๋ฉด ์ด๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. (๋ฌธ์ œ ํ•ด๊ฒฐ)
5. ํ•ด๊ฒฐ ์ดํ›„์—๋„ ๋ช…ํ™•ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์‹œ์„ฑ(Observability)๋ฅผ ํ™•๋ณดํ•˜๊ณ  ์ง€์ผœ๋ณธ๋‹ค (๋ชจ๋‹ˆํ„ฐ๋ง)
6. 1~2์ฃผ ๊ฒฝ๊ณผ ํ›„ ์ด์Šˆ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค. (์ด์Šˆ ์ข…๋ฃŒ)

์ €๋Š” ์ด๊ฒŒ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์กฐ๊ธˆ์€ ๋ƒ‰์ฒ ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์žฅ์•  ์ˆœ๊ฐ„์— ์ ˆ๋Œ€ ๋‹นํ™ฉํ•œ ๊ธฐ์ƒ‰์„ ๋ณด์ด์ง€ ์•Š๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์žฅ์•  ๋Œ€์‘ ์‹œ ์ €๋ฅผ ๋ณด์‹œ๋Š” ๋ถ„๋“ค์€ ์ข€ ๊ธฐ๊ณ„๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž..

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

 

์–ด์ฉŒ๋ฉด ์œ„์— ์žฅ์•  ๋Œ€์‘ ํ”„๋กœ์„ธ์Šค ๋‚ด์šฉ์„ ๋ณด์‹œ๋ฉด์„œ ์ด๋Ÿฐ ์˜๋ฌธ์ด ๋“œ์‹œ๋Š” ๋ถ„๋„ ์žˆ์œผ์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•ด์•ผ์ง€ ์ €๋Ÿด ์‹œ๊ฐ„์ด ์žˆ๋‚˜?

๋„ค, ์ข‹์€ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค์— ์น˜๋ช…์ ์ด๊ณ  ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ scaling์„ ํ†ตํ•ด ๋Œ€์‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑด ์ž„์‹œ ๋ฐฉํŽธ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ  ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ ์ ˆํ•œ action item์ด ๋‚˜์˜ค๋Š” ๊ฒŒ ์ข‹์€ ์žฅ์•  ๋Œ€์‘์ด๋ผ๊ณ  ๋‹ค๋“ค ์•„์‹ค๊ฑฐ๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. 

์˜ค๋Š˜ ์ด์•ผ๊ธฐ๋Š” ์ž„์‹œ ๋ฐฉํŽธ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์žฅ์•  ๋Œ€์‘ ์‹œ ์–ด๋–ป๊ฒŒ ์ ์ ˆํ•œ action item์„ ๋ฝ‘๋Š”์ง€. ์–ด๋–ค ์‚ฌ๊ณ  ๊ณผ์ •๋“ค์ด ์ค‘์š”ํ–ˆ์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

 

์žฅ์• ๋Š” ์–ด๋–ป๊ฒŒ ๋ณดํ†ต ์–ด๋–ป๊ฒŒ ๊ฐ์ง€ํ•˜์‹œ๋‚˜์š”?

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ณ„์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฒฝํ—˜ํ–ˆ๋˜ ์žฅ์•  ๊ฐ์ง€ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์‚ฌ๋‚ด ๋ชจ๋‹ˆํ„ฐ๋ง alert์—์„œ ๊ฐ์ง€๋œ๋‹ค.
2. ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ์‚ฌ๋‚ด ๊ตฌ์„ฑ์› ๋ถ„์˜ ์ด์Šˆ ๋ ˆ์ด์ฆˆ๋กœ ๊ฐ์ง€๋œ๋‹ค.
3. ์œ ์ €์˜ ์ด์Šˆ ๋ ˆ์ด์ฆˆ๋กœ ๊ฐ์ง€๋œ๋‹ค.

๊ฐ์ด ์˜ค์…จ๊ฒ ์ง€๋งŒ 2๋ฒˆ๊ณผ 3๋ฒˆ์€ ๊ธฐ์ˆ ํŒ€์—์„œ ์˜๋„ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ฐ์ง€ํ•˜๊ณ  ์žˆ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์ƒํ™ฉ๋“ค์€ Observability๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ์ง€ํ‘œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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


์žฅ์•  ๊ฐ์ง€

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

 

๊ฐ€์„ค ์ˆ˜๋ฆฝ

์žฅ์•  ๊ฐ์ง€ ํ›„ ๊ฐ€์„ค์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ์žฅ์• ๋Š” OOMKilled๋กœ pod๋“ค์ด ์ฃฝ์–ด๋ฒ„๋ ธ๊ณ  runtime์— ๋™์ž‘ํ•˜๋˜ goroutine๋“ค์ด ์œ ์‹ค๋˜๋˜ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ๋ฒ”์œ„์— ์†ํ•˜๋Š” APM์„ ๋จผ์ € ์‚ดํŽด๋ณด๊ธฐ ๋•Œ๋ฌธ์— OOMKilled๋Š” ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  log์™€ DB data๋กœ goroutine์•ˆ์—์„œ ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„์— ์„ธ์šด ๊ฐ€์„ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) goroutine์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์Œ“์ธ๋‹ค.
์ด ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— OOMKilled๊ฐ€ ๋‚˜๊ธฐ ์ถฉ๋ถ„ํ•œ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ™•์ธ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

2) goroutine ์•ˆ์—์„œ ๋ญ”๊ฐ€ ๋กœ๋”ฉ์ด ๊ธด ๋ถ€๋ถ„์ด ์žˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์•„๋ž˜ 2๊ฐ€์ง€๋ฅผ ํ™•์ธํ•ด์•ผํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

1. data๊ฐ€ ์ ์žฌ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— DB connection์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”
2. api call ๋“ฑ timeout์„ ์ ์ ˆํ•˜๊ฒŒ ํ™•์ธ

๊ฐ€์„ค ๊ฒ€์ฆ ๋ฐ route finding

์ด์ œ ์„ธ์›Œ๋‘” ๊ฐ€์„ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1) goroutine์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์Œ“์ธ๋‹ค

๋จผ์ € ์ผ๋ฐ˜์ ์œผ๋กœ DB์—์„œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— DB์™€ ๊ด€๋ จ๋œ ์ง€ํ‘œ๋ฅผ ๋ณด๋ฉด์„œ ๋ถ„์„์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ DB์—์„œ ์ฃผ๋กœ ๋ณด๋Š” ์ง€ํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. CPU
DB์—์„œ CPU๋Š” I/O ์ž‘์—… ์‹œ์— ํ™œ์šฉํ•˜๊ฒŒ ๋˜๊ณ  CPU๊ฐ€ 99%๋ฅผ ์น˜์†Ÿ์œผ๋ฉด ๋ชจ๋“  ์ž‘์—…์—์„œ timeout์ด ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ด ์ฃผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ CPU๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. (90% ์ •๋„๋„ ์œ„ํ—˜ํ•œ ์ˆ˜์น˜๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ  alert๋ฅผ ์„ค์ •ํ•ด๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‹คํ–‰ํžˆ CPU๋Š” 50% ์ •๋„๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์˜€์Šต๋‹ˆ๋‹ค.

2. connection ๋ฐ ์ฟผ๋ฆฌ ์†๋„

fyi) ์ œ๊ฐ€ ๊ทผ๋ฌดํ•˜๊ณ  ์žˆ๋Š” ํšŒ์‚ฌ๋Š” AWS Aurora MySQL์„ ์‚ฌ์šฉํ•˜๊ณ  datadog์„ ํ†ตํ•ด์„œ ์ค‘์š” DB metric์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.

DB ์ฟผ๋ฆฌ ์†๋„๊ฐ€ CPU์™€ ์ƒ๊ด€์—†์ด ๋Š๋ฆฌ๋‹ค๊ณ  ๋ญ”๊ฐ€ lock์ด ์žกํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋Š” ๊ฐ€์„ค๋„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ์†๋„ ๊ด€๋ จ์„ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.
RDS ์‚ฌ์šฉ ์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ™œ์„ฑํ™”ํ•ด๋‘๋ฉด AWS CloudWatch์—์„œ๋Š” RDS ๊ด€๋ จ ๋ฉ”ํŠธ๋ฆญ์ด ๊ฝค ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ๋ก๋˜๋Š”๋ฐ ์ด๋ฅผ ํ™œ์šฉํ•ด ๊ฐ€์„ค์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹œ ์‚ดํŽด๋ณธ ์ง€ํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ  DB ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์˜€์Šต๋‹ˆ๋‹ค.

Deadlocks: ์ดˆ๋‹น ํ‰๊ท  ๊ต์ฐฉ ์ƒํƒœ ์ˆ˜

-> 0.003์œผ๋กœ ๋ฐ๋“œ๋ฝ์€ ์˜ํ–ฅ ์—†์–ด๋ณด์ž„

DMLThroughput

-> ์ผ์‹œ์ ์œผ๋กœ DML ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋Š˜์–ด๋‚ฌ์ง€๋งŒ 1์ฃผ์ผ ์ถ”์ด๋ฅผ ๋ณด๋ฉด ๋น„์Šทํ•œ ์ถ”์ด
-> ๊ทธ๋Ÿฌ๋‚˜ ์ง€๋‚œ์ฃผ์—๋Š” OOMKilled๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ  ์ด์ƒ ์ˆ˜์น˜๋กœ ๋ณด์ด์ง„ ์•Š์Œ -> ์˜ํ–ฅ ์—†์–ด๋ณด์ž„

InsertLatency
-> ์ตœ๋Œ€ 30 ms๋ฅผ ๋„˜์ง€ ์•Š์Œ DB์— ์ €์žฅ ์‹œ ์ง€์—ฐ์ด goroutine ๋กœ๋”ฉ์— ์˜ํ–ฅ์„ ์ฃผ์ง„ ์•Š์Œ
 
 
 

2) goroutine ์•ˆ์—์„œ ๋ญ”๊ฐ€ ๋กœ๋”ฉ์ด ๊ธด ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ด๊ฒŒ ๋ญ”์ง€ ์ฐพ์•„์•ผ ํ•œ๋‹ค

์œ„ ๊ณผ์ •์„ ํ†ตํ•ด์„œ DB ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ–ˆ๊ณ  ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋ฌธ์ œ ํ™•์ธ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฑด ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๊ฑด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ๊ฐ€์„ค์„ ์„ธ์šฐ๊ณ  ๊ฒ€์ฆํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ฐ„ ์‰ฌ์šด ์ผ์€ ์•„๋‹Œ๋ฐ์š”.
์ด๋Ÿด ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, CPU ์ ์œ  ์‹œ๊ฐ„ ๋“ฑ์„ ํ•จ์ˆ˜๋ณ„, ํŒจํ‚ค์ง€๋ณ„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ profiler๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €ํฌ ํšŒ์‚ฌ๋Š” golang์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ํ˜น์‹œ golang์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์€ pprof์™€ ๊ฐ™์€ ์˜คํ”ˆ์†Œ์Šค profiler๋ฅผ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €ํฌ๋Š” datadog์„ ์“ฐ๊ณ  ์žˆ์–ด์„œ ๋น ๋ฅธ ์ ์šฉ์„ ์œ„ํ•ด datadog profiler๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
datadog์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค์ธ dd-trace-go๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ์ถ”๊ฐ€๋งŒ์œผ๋กœ ์‰ฝ๊ฒŒ profiler๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ Observability๋ฅผ ํ™•๋ณดํ•ด๋‘๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์—ฌ์•ผ ๋ช…ํ™•ํ•œ ๊ฐ€์„ค ๊ฒ€์ฆ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ์ง€์ผœ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ

profiler๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ถ”์ด๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ gRPC client์—์„œ goroutine์„ ๊ณผ๋„ํ•˜๊ฒŒ ์žก์•„๋จน๊ณ  ์žˆ๋Š” ๊ฑธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์›๋ž˜ gRPC client๋Š” goroutine์„ ๊ณผ๋„ํ•˜๊ฒŒ ์žก์•„๋จน์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ timeout์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ ์˜๋„ํ–ˆ์—ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ผ๊ณ  ํŒ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ context์— timeout์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๊ณ  goroutine ์ˆ˜๋Š” ์ •์ƒ ์ˆ˜์น˜๋กœ ๋Œ์•„์˜ค๋Š” ๊ฑธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
fyi) golang์—์„œ๋Š” context๋ผ๋Š” ๊ฐœ๋…์ด ์กด์žฌํ•˜๋Š”๋ฐ context์— timeout์ด ์—†์œผ๋ฉด gRPC client์—์„œ timeout ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

datadog profiler goroutine count metric

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ดํ›„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ด์Šˆ ์ข…๋ฃŒ

๋ฌธ์ œ ํ•ด๊ฒฐ ์ดํ›„ ๋ฌธ์ œ๊ฐ€ ์žฌ๋ฐœํ•˜์ง€ ์•Š๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฑด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ ์ดํ›„ ํŠธ๋ž˜ํ”ฝ ํ”ผํฌ ์‹œ๊ฐ„์—๋„ ๊ณ ๋ฃจํ‹ด์ด ์ •์ƒ ์ˆ˜์น˜๋กœ ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด profiler๋ฅผ ๊ณ„์† ์ผœ๋‘๊ณ  ์ข€ ๋” ์ง€์ผœ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ํŠธ๋ฆฌํŒฉ์ด ๋ชฐ๋ฆฌ๋Š” ํ”ผํฌ ์‹œ๊ฐ„์—๋„ gRPC client๊ฐ€ ์ ์œ ํ•˜๋˜ goroutine ์ˆ˜๋Š” ์ •์ƒ ์ˆ˜์น˜๋กœ ํ™•์ธ๋˜์—ˆ๊ณ  ์ด์Šˆ ํ•ด๊ฒฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

gRPC client์˜ timeout๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ํ•™์Šต ํ›„ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์žฅ์•  ํšŒ๊ณ 

์ด์Šˆ ์ข…๋ฃŒ ํ›„ ์ด์Šˆ๊ฐ€ ๋‹ค์‹œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹ ๊ธฐ๋ก ๋ฐ ๊ณต์œ ์˜ ๋ชฉ์ ์œผ๋กœ ์žฅ์•  ํšŒ๊ณ ๋ฅผ ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ณดํ†ต ๋ช…ํ™•ํ•œ ์›์ธ ํŒŒ์•… ๋ฐ ๊ณต์œ ๋ฅผ ์œ„ํ•ด double check ์ฐจ ์‹œ์  ๋ณ„๋กœ ๊ธฐ๋กํ•ด์„œ ์žฅ์•  ํšŒ๊ณ ๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ธฐ์กด์— ์ด์Šˆ ์›์ธ ํŒŒ์•… ์‹œ์—๋„ ํžˆ์Šคํ† ๋ฆฌ ๊ธฐ๋ก๊ณผ ํ•จ๊ป˜ ์†Œํ†ต์„ ์ž˜ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ์ด ๋•Œ ์ž๋ฃŒ๋“ค์„ ๋ณต๋ถ™ํ•˜๋ฉด ๊ฝค ๋„์›€์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

Lesson learned

์ด๋ฒˆ ์ด์Šˆ ํ•ด๊ฒฐ์„ ํ•˜๋ฉด์„œ ๋Š๋‚€ ์ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์ด์Šˆ ๋ฐœ์ƒ ์‹œ ๊ฐ์ •์ ์ธ ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•œ ์ ˆ์ œํ•˜๊ณ  ์ด์Šˆ ํ•ด๊ฒฐ๊ณผ ํ•ต์‹ฌ์— ์ง‘์ค‘ํ•œ๋‹ค.

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

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

2. ํŒ€์›์—๊ฒŒ ์ด์Šˆ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ž‘์—…์„ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

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

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

๋ฐ˜์‘ํ˜•