μ°λ¦¬ μλ²μ OOMKilled μ₯μ κ° λ°μνμ΄μ - νκ³ νΈ
μ΄ κΈμ μ΅κ·Όμ μμλ μλ² 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
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 μ²λ¦¬λ₯Ό νμ§ μμ΅λλ€.
λ¬Έμ ν΄κ²° μ΄ν λͺ¨λν°λ§ λ° μ΄μ μ’ λ£
λ¬Έμ ν΄κ²° μ΄ν λ¬Έμ κ° μ¬λ°νμ§ μλμ§ λͺ¨λν°λ§νλ 건 λ§€μ° μ€μν©λλ€.
κ·Έλ¦¬κ³ λ¬Έμ ν΄κ²° μ΄ν νΈλν½ νΌν¬ μκ°μλ κ³ λ£¨ν΄μ΄ μ μ μμΉλ‘ μ μ§λλμ§ νμΈνκΈ° μν΄ profilerλ₯Ό κ³μ μΌλκ³ μ’ λ μ§μΌλ³΄κΈ°λ‘ νμ΅λλ€.
λ€ννλ νΈλ¦¬ν©μ΄ λͺ°λ¦¬λ νΌν¬ μκ°μλ gRPC clientκ° μ μ νλ goroutine μλ μ μ μμΉλ‘ νμΈλμκ³ μ΄μ ν΄κ²°λ‘ μ²λ¦¬νκ² λμμ΅λλ€.
gRPC clientμ timeoutκ³Ό κ΄λ ¨λ λΆλΆμ λ°λ‘ νμ΅ ν κΈμ μμ±ν΄λ³΄λ €κ³ ν©λλ€.
μ₯μ νκ³
μ΄μ μ’
λ£ ν μ΄μκ° λ€μλ λ°μνμ§ μλλ‘ μ§μ κΈ°λ‘ λ° κ³΅μ μ λͺ©μ μΌλ‘ μ₯μ νκ³ λ₯Ό νλ κ²λ μ€μν©λλ€.
λ³΄ν΅ λͺ
νν μμΈ νμ
λ° κ³΅μ λ₯Ό μν΄ double check μ°¨ μμ λ³λ‘ κΈ°λ‘ν΄μ μ₯μ νκ³ λ₯Ό νκ² λλλ° κΈ°μ‘΄μ μ΄μ μμΈ νμ
μμλ νμ€ν 리 κΈ°λ‘κ³Ό ν¨κ» μν΅μ μ μ§ννλ€λ©΄ μ΄ λ μλ£λ€μ 볡λΆνλ©΄ κ½€ λμμ΄ λλ κ² κ°μ΅λλ€.
Lesson learned
μ΄λ² μ΄μ ν΄κ²°μ νλ©΄μ λλ μ λ€μ λ€μκ³Ό κ°μ΅λλ€.
1. μ΄μ λ°μ μ κ°μ μ μΈ λΆλΆμ μ΅λν μ μ νκ³ μ΄μ ν΄κ²°κ³Ό ν΅μ¬μ μ§μ€νλ€.
μ¬λμ κ°μ μ΄ μλ λλ¬Όμ΄λ μ΄μ λ°μ μ λΉν©ν μ μλ 건 μμ°μ€λ½μ΅λλ€. νμ§λ§ μ΄λ° κ°μ μλͺ¨κ° νμ€μ μΌλ‘ μ΄μ ν΄κ²°μ λμμ΄ λμ§ μλλ€κ³ μκ°ν©λλ€. κ·Έλ¦¬κ³ μ¬λ¬λͺ
μ΄μ μ΄μλ₯Ό νμ
ν λλ κ°μμ κ°μ€μ΄λ 곡μ λ κ°μ€μ κ°μ§κ³ μμΈμ νμ
νκΈ° λλ¬Έμ 무μμ νμμ 곡μ νκΈ°λ³΄λ¨ λ³ΈμΈμ μκ°μ ν¬ν¨ν νμ + κ°μ€μ κ²μ¦ μ¬λΆ + action itemμ λ¬Άμ΄μ 곡μ νλ κ² ν¨μ¬ μ’μ΅λλ€.
νΉν νμλ§ κ³΅μ λμμ λ λ€λ₯Έ μ¬λμ μ΄λ―Έ νμΈν μ¬νμ΄λΌλ©΄ νμ€μ μΌλ‘ ν° λμμ΄ λμ§ μμ΅λλ€.
λΉμ νμμ κ°μ΄ λμνκ³ μμλλ° μΌλΆ νμλΆμ μκ°λ³΄λ€ λΉν©νμ
μ κ·Έλ°μ§ μ΄λ° κ³Όμ μ΄ μ΄λ €μΈ μλ μκ² λ€λ μκ°μ΄ λ€μκ³ λκ΅°κ°λ λΆλ΄μ λλΌμλ κ±Έ κ°μ μ μΌλ‘ λκΌλ κ² κ°μ΅λλ€. κ·Έλ¦¬κ³ μ κ° νμΈμ κ°μ μ μ±
μμ§ μ μμΌλ λ©λ¦¬μ μμμ νλ κ² κ°μ΅λλ€.
2. νμμκ² μ΄μ ν΄κ²°μ μν μμ μ λλ μ£Όλ κ²μ΄ μ’λ€.
μ΄μ ν΄κ²°μ μ¬μ€ μ΅λν λΉ λ₯΄κ² νλ κ²μ΄ μ’μ΅λλ€. κ·Έλμ μμΈκ³Ό ν΄κ²° λ°©λ²μ λͺ νν μΈμ§ν μ¬λμ΄ μμ κΉμ§ ν΄λ²λ¦¬λ©΄ κ°μ₯ λΉ λ₯Έ ν΄κ²°μ΄ λ©λλ€. κ·Έλμ νμ μλ² μμ§λμ΄ μκ° 2λͺ μΌ λλ κ°μ λΉ λ₯΄κ² ν΄κ²°νλ κ² λ무λ λΉμ°νμ§λ§, μ§κΈμ 5λͺ μ λ λμκ³ νμ λΆλ€μκ² μμ μ λλμ΄μ£Όλ κ² κ°μΈμ μκΈ°ν¨λ₯κ°μ λΉλ‘―ν νμ μ¬κΈ°λ₯Ό μ¬λ¦¬λ λ° λμμ΄ λ κ² κ°λ€λ κ±Έ λκΌμ΅λλ€. κ·Έλμ μ΄λ²μλ μμ μ λλ μ μ§ννλ κ² κ½€ μ’μλ€κ³ μκ°ν©λλ€.
κΈ΄ κΈ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€ :)