BackEnd

우리 μ„œλ²„μ— OOMKilled μž₯μ• κ°€ λ°œμƒν–ˆμ–΄μš” - 회고편

mokhs 2024. 11. 10. 21:08
이 글은 μ΅œκ·Όμ— μžˆμ—ˆλ˜ μ„œλ²„ 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λͺ… 정도 λ˜μ—ˆκ³  νŒ€μ› λΆ„λ“€μ—κ²Œ μž‘μ—…μ„ λ‚˜λˆ„μ–΄μ£ΌλŠ” 게 개인의 자기효λŠ₯감을 λΉ„λ‘―ν•œ νŒ€μ˜ 사기λ₯Ό μ˜¬λ¦¬λŠ” 데 도움이 될 것 κ°™λ‹€λŠ” κ±Έ λŠκΌˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ΄λ²ˆμ—λŠ” μž‘μ—…μ„ λ‚˜λˆ μ„œ μ§„ν–‰ν–ˆλ˜ 게 κ½€ μ’‹μ•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :)