๐Ÿง Linux

OOM ๊ด€๋ฆฌ

๊ฐœ์š”

Linux์—์„œ Out Of Memory(OOM) ๊ด€๋ฆฌ๋Š” ์‹œ์Šคํ…œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์™€ ์Šค์™‘์ด ๋ชจ๋‘ ์†Œ์ง„๋˜์—ˆ์„ ๋•Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๋ณต๊ตฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ปค๋„์€ oom-killer๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ข…๋ฃŒํ•˜๋ฉฐ, ์ด๋ ‡๊ฒŒ ํ™•๋ณด๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์ด ๊ณ„์† ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

OOM ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜

๊ทธ๋ฆผ 1. Linux OOM ๊ด€๋ฆฌ์˜ ์ „์ฒด ๊ตฌ์กฐ์™€ ๊ด€๋ จ ๊ตฌ์„ฑ ์š”์†Œ

ํ•ต์‹ฌ ๊ฐœ๋…

OOM Killer ๋™์ž‘ ์›๋ฆฌ

OOM Killer๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๋Š” ์ปค๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ปค๋„์€ __alloc_pages_may_oom() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํšŒ์ˆ˜(direct reclaim)์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํšŒ์ˆ˜(kswapd)๊ฐ€ ๋ชจ๋‘ ์‹คํŒจํ–ˆ์„ ๋•Œ OOM ์ƒํƒœ๋กœ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค.

OOM Killer์˜ ํ•ต์‹ฌ ๋™์ž‘ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ ๊ฐ์ง€ (watermark ๋ฏธ๋‹ฌ)
  2. out_of_memory() ํ˜ธ์ถœ์„ ํ†ตํ•œ OOM ์ƒํƒœ ํŒ์ •
  3. ํƒ€๊ฒŸ ํ”„๋กœ์„ธ์Šค ์„ ํƒ (oom_badness() ๊ธฐ๋ฐ˜)
  4. SIGKILL ์ „์†ก์„ ํ†ตํ•œ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
  5. ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ๋ฐ ํ• ๋‹น ์žฌ์‹œ๋„
OOM Killer ๋™์ž‘ ํ๋ฆ„

๊ทธ๋ฆผ 2. OOM Killer์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๊นŒ์ง€์˜ ๋™์ž‘ ํ๋ฆ„

oom_score ์ ์ˆ˜ ์ฒด๊ณ„

OOM Killer๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค์— ์ ์ˆ˜๋ฅผ ๋งค๊ฒจ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ ์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋˜๋ฉฐ, ๋‹ค์Œ ์š”์†Œ๋“ค์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค:

  • RSS (Resident Set Size): ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜๋Š” ํŽ˜์ด์ง€ ์ˆ˜
  • anon_rss: ์ต๋ช… ๋ฉ”๋ชจ๋ฆฌ(ํž™, ์Šคํƒ) ์‚ฌ์šฉ๋Ÿ‰
  • file_rss: ํŒŒ์ผ ๋งคํ•‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
  • swap_rss: ์Šค์™‘์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘
  • oom_score_adj: ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๋ณด์ •๊ฐ’ (-1000 ~ 1000)

๊ธฐ๋ณธ ๊ณต์‹์—์„œ ์ ์ˆ˜๋Š” ๋‹ค์Œ ๋น„์œจ๋กœ ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค:

points = process_pages * 1000 / total_pages

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์„์ˆ˜๋ก ์ ์ˆ˜๊ฐ€ ๋†’์•„์ง€๋ฉฐ, oom_score_adj๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

oom_score_adj ์„ค์ •

/proc/<pid>/oom_score_adj ํŒŒ์ผ์„ ํ†ตํ•ด ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค์˜ OOM ์ ์ˆ˜๋ฅผ ๋ณด์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๊ฐ’ ์˜๋ฏธ ์‚ฌ์šฉ ์‚ฌ๋ก€
-1000 OOM Killer ์™„์ „ ๋น„ํ™œ์„ฑํ™” ํ•ต์‹ฌ ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค (sshd, systemd)
-900 ๋งค์šฐ ๋‚ฎ์€ OOM ํ™•๋ฅ  ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์„œ๋น„์Šค
0 ๊ธฐ๋ณธ๊ฐ’ ์ผ๋ฐ˜ ํ”„๋กœ์„ธ์Šค
500 ๋†’์€ OOM ํ™•๋ฅ  ๋น„ํ•„์ˆ˜ ์ž„์‹œ ํ”„๋กœ์„ธ์Šค
1000 ๊ฐ€์žฅ ๋†’์€ OOM ํ™•๋ฅ  ํ…Œ์ŠคํŠธ/๋””๋ฒ„๊น…์šฉ ํ”„๋กœ์„ธ์Šค

์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” Kubernetes์˜ oom_score_adj๋ฅผ ํ†ตํ•ด Pod ์ˆ˜์ค€์—์„œ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cgroup OOM ํ†ตํ•ฉ

cgroup v2์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ดˆ๊ณผ ์‹œ cgroup ๋‹จ์œ„์˜ OOM์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์ œ์–ด ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • memory.max: cgroup์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•˜๋“œ ์ œํ•œ. ์ดˆ๊ณผ ์‹œ OOM ๋ฐœ์ƒ
  • memory.high: ํ•˜๋“œ ์‹คํŒจ ์ „์— reclaim ์••๋ฐ•์„ ๋จผ์ € ์œ ๋„ํ•˜๋Š” ์†Œํ”„ํŠธ ์ƒํ•œ
  • memory.low / memory.min: ์ค‘์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋ฅผ reclaim์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๋ณดํ˜ธ์„ 
  • memory.oom.group: 1๋กœ ์„ค์ •ํ•˜๋ฉด cgroup ๋‚ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•จ๊ป˜ ์ข…๋ฃŒ
  • memory.swap.max: ์Šค์™‘ ์‚ฌ์šฉ๋Ÿ‰ ์ œํ•œ. ์Šค์™‘ ์—†์ด OOM ์œ ๋„ ๊ฐ€๋Šฅ
  • memory.events: high, max, oom, oom_kill ์นด์šดํ„ฐ๋กœ ์••๋ฐ•๊ณผ ์ข…๋ฃŒ๋ฅผ ๊ด€์ธก

cgroup OOM์€ ์‹œ์Šคํ…œ ์ „์ฒด OOM๊ณผ ๋‹ฌ๋ฆฌ ํ•ด๋‹น cgroup ๋‚ด์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, ๋‹ค๋ฅธ cgroup์ด๋‚˜ ์‹œ์Šคํ…œ ์ „์ฒด์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜์—์„œ๋Š” memory.high๋กœ ๋จผ์ € ์†๋„๋ฅผ ๋Šฆ์ถ”๊ณ , ๊ทธ๋ž˜๋„ ํšŒ๋ณต๋˜์ง€ ์•Š์œผ๋ฉด memory.max ๋˜๋Š” memory.swap.max ๊ฒฝ๊ณ„์—์„œ OOM์ด ๋ฐœ์ƒํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

OOM Reaper์™€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋Œ€์‘

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

์ปค๋„ OOM ์ด์ „ ๋‹จ๊ณ„์—์„œ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฐ๋ชฌ์ด ๋จผ์ € ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. systemd-oomd๋Š” cgroup v2์™€ PSI(Pressure Stall Information)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•์ด ์ง€์†๋˜๋Š” cgroup์„ ๊ณจ๋ผ leaf cgroup ๋˜๋Š” memory.oom.group=1์ธ ๊ทธ๋ฃน ์ „์ฒด์— SIGKILL์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. earlyoom์€ MemAvailable๊ณผ swap ์—ฌ์œ ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ์‹œํ•ด ์‹œ์Šคํ…œ์ด livelock์— ๋น ์ง€๊ธฐ ์ „์— ํ›„๋ณด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต/๋ถ„์„

OOM ๊ด€๋ฆฌ ์ •์ฑ… ๋น„๊ต

์ •์ฑ… ๋™์ž‘ ๋ฐฉ์‹ ์žฅ์  ๋‹จ์  ์ ํ•ฉํ•œ ํ™˜๊ฒฝ
๊ธฐ๋ณธ OOM Killer oom_score ๊ธฐ๋ฐ˜ ์ž๋™ ์„ ํƒ ์‹œ์Šคํ…œ ๋ณดํ˜ธ, ์ž๋™ ๋™์ž‘ ์ค‘์š” ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๊ฐ€๋Šฅ ์ผ๋ฐ˜ ์„œ๋ฒ„
cgroup OOM cgroup ๋‚ด๋ถ€์—์„œ๋งŒ ์ข…๋ฃŒ ์›Œํฌ๋กœ๋“œ ๊ฒฉ๋ฆฌ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ•„์š” ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ
earlyoom PSI ๊ธฐ๋ฐ˜ ์‚ฌ์ „ ์ข…๋ฃŒ ์ปค๋„ OOM๋ณด๋‹ค ๋น ๋ฅธ ๋Œ€์‘ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฐ๋ชฌ ํ•„์š” ๋ฐ์Šคํฌํ†ฑ/์„œ๋ฒ„
panic_on_oom OOM ๋ฐœ์ƒ ์‹œ ์ปค๋„ ํŒจ๋‹‰ ์‹คํŒจ ์ฆ‰์‹œ ๊ฐ์ง€ ์‹œ์Šคํ…œ ์™„์ „ ์ค‘๋‹จ ๊ณ ๊ฐ€์šฉ์„ฑ ํด๋Ÿฌ์Šคํ„ฐ
memory.oom.group cgroup ๊ทธ๋ฃน ์ข…๋ฃŒ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ƒํƒœ ์ผ๊ด€์„ฑ ์ „์ฒด ๊ทธ๋ฃน ์†์‹ค ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋น„๊ต

๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œํ•œ ๋‹จ์œ„ OOM ๋™์ž‘ ์„ค์ • ๋ฐฉ๋ฒ•
์‹œ์Šคํ…œ ์ „์ฒด ์ „์ฒด ์‹œ์Šคํ…œ ์‹œ์Šคํ…œ ์ „์ฒด OOM Killer swappiness, overcommit
cgroup v2 ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน cgroup ๋‚ด OOM memory.max, memory.swap.max
ulimit ํ”„๋กœ์„ธ์Šค๋ณ„ ์ปค๋„ OOM๊ณผ ๋ณ„๋„ /etc/security/limits.conf
mlock ํŽ˜์ด์ง€๋ณ„ ๊ณ ์ • OOM ํ›„๋ณด์—์„œ ์ œ์™ธ mlock()/mlockall()

์šด์˜ ์ œ์–ด ์ง€์  ๋น„๊ต

์ œ์–ด ์ง€์  ๋ชฉ์  ๋Œ€ํ‘œ ์„ค์ • ์ ์šฉ ์‹œ์ 
overcommit ์ปค๋ฐ‹ ํ•œ๋„ ์กฐ์ • vm.overcommit_memory, vm.overcommit_ratio ํ• ๋‹น ์Šน์ธ ์ „
watermark reserve allocator ์—ฌ์œ  ํ™•๋ณด vm.min_free_kbytes reclaim ์‹œ์ž‘ ์ „
memcg throttle OOM ์ด์ „ ๊ฐ์† memory.high cgroup reclaim ๋‹จ๊ณ„
memcg hard limit ์›Œํฌ๋กœ๋“œ ๊ฒฉ๋ฆฌ memory.max, memory.swap.max cgroup ํ•œ๋„ ์ดˆ๊ณผ ์‹œ
userspace OOM daemon ์ปค๋„ OOM ์ด์ „ ์„ ์ œ ๋Œ€์‘ systemd-oomd, earlyoom PSI/๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ ์•…ํ™” ์‹œ
panic policy ์žฅ์•  ์ „ํŒŒ ๋ฐฉ์‹ ์„ ํƒ vm.panic_on_oom ์ปค๋„ OOM ํ™•์ • ํ›„

๋™์ž‘ ์›๋ฆฌ

OOM ๊ฐ์ง€ ๊ณผ์ •

์ปค๋„์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹œ์ ์— ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ OOM ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค:

  1. Watermark ํ™•์ธ: ํ• ๋‹น ์‹œ์ ์— free ํŽ˜์ด์ง€๊ฐ€ min watermark ๋ฏธ๋‹ฌ์ธ์ง€ ํ™•์ธ
  2. ์ง์ ‘ ํšŒ์ˆ˜(Direct Reclaim): ํ• ๋‹น ํ˜ธ์ถœ์ž๊ฐ€ ์ง์ ‘ LRU์—์„œ ํŽ˜์ด์ง€๋ฅผ ํšŒ์ˆ˜
  3. kswapd ๋™์ž‘: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ watermark๋ฅผ ํšŒ๋ณตํ•  ๋•Œ๊นŒ์ง€ ํšŒ์ˆ˜
  4. COMPACT ์žฌ์‹œ๋„: ๊ณ ์ฐจ ํ• ๋‹น ์‹คํŒจ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์••์ถ• ์‹œ๋„
  5. OOM ํŒ์ •: ๋ชจ๋“  ํšŒ์ˆ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์‹คํŒจํ•˜๋ฉด out_of_memory() ํ˜ธ์ถœ

/proc/sys/vm/min_free_kbytes๋Š” ๊ฐ ์กด(zone)์— ๋Œ€ํ•œ min watermark๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, ์ด ๊ฐ’์ด OOM ๋ฐœ์ƒ ์ž„๊ณ„๊ฐ’์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

vm.overcommit_memory=2 ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ ์ „์— ์ปค๋ฐ‹ ํ•œ๋„ ์ดˆ๊ณผ๊ฐ€ ๋จผ์ € ์‹คํŒจ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ heuristic overcommit ๋ชจ๋“œ์—์„œ๋Š” ํ• ๋‹น ์ž์ฒด๋Š” ํ†ต๊ณผํ–ˆ๋”๋ผ๋„ ์‹ค์ œ page fault ์‹œ์ ์— reclaim์ด ์‹คํŒจํ•˜๋ฉด์„œ OOM์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€๊ฒŸ ํ”„๋กœ์„ธ์Šค ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜

OOM Killer๋Š” oom_badness() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค:

  1. ์‹œ์Šคํ…œ ์ „์ฒด ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก ์ˆœํšŒ
  2. ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ oom_score ๊ณ„์‚ฐ (๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜)
  3. oom_score_adj๋ฅผ ํ†ตํ•ด ๋ณด์ •๋œ ์ตœ์ข… ์ ์ˆ˜ ์‚ฐ์ถœ
  4. ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค ์„ ํƒ
  5. oom_score_adj๊ฐ€ -1000์ธ ํ”„๋กœ์„ธ์Šค๋Š” ํ›„๋ณด์—์„œ ์ œ์™ธ
  6. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผ ์ ์ˆ˜์ผ ๊ฒฝ์šฐ PID๊ฐ€ ๋†’์€ ํ”„๋กœ์„ธ์Šค ์šฐ์„ 
OOM ํƒ€๊ฒŸ ์„ ํƒ ํ๋ฆ„

๊ทธ๋ฆผ 3. OOM Killer์˜ ํƒ€๊ฒŸ ํ”„๋กœ์„ธ์Šค ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„

์‹œ์Šคํ…œ ์ „์ฒด OOM๊ณผ memcg OOM์€ ํ›„๋ณด ์ง‘ํ•ฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ „์ฒด OOM์€ ์‹œ์Šคํ…œ ์ „์—ญ task list๋ฅผ ๋ณด์ง€๋งŒ, memcg OOM์€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ cgroup ์•ˆ์˜ ํƒœ์Šคํฌ๋งŒ ํ›„๋ณด๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์ „์—ญ oom_score_adj๋ณด๋‹ค cgroup ๊ฒฝ๊ณ„์™€ memory.oom.group ์„ค์ •์ด ์‹ค์ œ ์ข…๋ฃŒ ๊ฒฐ๊ณผ์— ๋” ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ OOM ๊ด€๊ณ„

Linux ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ์กด(zone) ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐ ์กด์€ watermark(min, low, high)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • WMARK_MIN: ์ด ์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด ์ง์ ‘ ํšŒ์ˆ˜ ์‹œ์ž‘
  • WMARK_LOW: kswapd๊ฐ€ ์ด ์ˆ˜์ค€๊นŒ์ง€ ํšŒ๋ณตํ•˜๋ฉด ๋™์ž‘ ์ค‘๋‹จ
  • WMARK_HIGH: ์™„์ „ํ•œ ์—ฌ์œ  ์ƒํƒœ

ํ• ๋‹น ์‹คํŒจ ์‹œ OOM๊นŒ์ง€์˜ ๊ณผ์ •์€ ํ• ๋‹น ์š”์ฒญ์˜ GFP ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, __GFP_NOFAIL์„ ์ง€์ •ํ•œ ํ• ๋‹น์€ ๋ฌดํ•œํžˆ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

OOM ์ดํ›„์—๋Š” ํฌ์ƒ ํ”„๋กœ์„ธ์Šค์— TIF_MEMDIE๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ๊ฒฝ๋กœ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ†ต๊ณผํ•˜๋„๋ก ๋•๊ณ , oom_reaper๊ฐ€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ •๋ฆฌํ•ด allocator ์žฌ์‹œ๋„ ์„ฑ๊ณต ํ™•๋ฅ ์„ ๋†’์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์šด์˜์ž๋Š” ๋‹จ์ˆœํžˆ "๋ˆ„๊ฐ€ ์ฃฝ์—ˆ๋Š”๊ฐ€"๋ฟ ์•„๋‹ˆ๋ผ dmesg, memory.events, oomctl์„ ํ•จ๊ป˜ ํ™•์ธํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ์ด ์ „์—ญ OOM์ธ์ง€ ํŠน์ • cgroup OOM์ธ์ง€ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ 

  • ์‹œ์Šคํ…œ ์ „์ฒด ๋‹ค์šด์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ปค๋„์„ ๊ณ„์† ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ€์žฅ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • oom_score_adj๋ฅผ ํ†ตํ•ด ์ค‘์š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • cgroup ํ†ตํ•ฉ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋„๊ตฌ(earlyoom, systemd-oomd)๋กœ ๋ณด์™„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • OOM Killer ๋™์ž‘ ์‹œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์„œ๋น„์Šค๋Š” ์ข…๋ฃŒ ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ญ์ƒ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ(slab, ์Šคํƒ)๋Š” OOM์— ์ง์ ‘์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • oom_score ๊ณ„์‚ฐ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์“ฐ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ธฐ์ˆ 

  • Linux ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ์ดˆ: ๋ฆฌ๋ˆ…์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ณธ ๊ฐœ๋…
  • cgroup ๋ฉ”๋ชจ๋ฆฌ: ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด
  • ์Šค์™‘/zRAM: ์Šค์™‘๊ณผ zRAM์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ™•์žฅ
  • Linux ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ•
  • oomctl, systemd-cgls, systemd-cgtop: systemd ๊ธฐ๋ฐ˜ cgroup/OOM ๊ด€์ธก ๋„๊ตฌ
  • /proc/<pid>/oom_score, /proc/<pid>/oom_score_adj, /sys/fs/cgroup/*/memory.events: OOM ํ›„๋ณด์™€ cgroup ์ด๋ฒคํŠธ ํ™•์ธ ์ง€์ 
  • Linux Kernel Documentation: Out-Of-Memory (Documentation/mm/oom.rst)
  • Linux Kernel Documentation: PSI (Documentation/accounting/psi.rst)
  • Linux Kernel Documentation: /proc/sys/vm/ (Documentation/admin-guide/sysctl/vm.rst)
  • Linux Kernel Documentation: Control Group v2 (Documentation/admin-guide/cgroup-v2.rst)
  • earlyoom ํ”„๋กœ์ ํŠธ: https://github.com/rfjakob/earlyoom
  • systemd-oomd: https://www.mankier.com/8/systemd-oomd

ํ•ต์‹ฌ ์ •๋ฆฌ

Linux OOM ๊ด€๋ฆฌ๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ์†Œ์ง„๋˜์—ˆ์„ ๋•Œ ์ปค๋„์ด ์ž๋™์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๋ณต๊ตฌํ•˜๋Š” ์ตœํ›„์˜ ๋ฐฉ์–ด ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. OOM Killer๋Š” oom_score์™€ oom_score_adj๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ›„๋ณด๋ฅผ ๊ณ ๋ฅด๊ณ , ์ข…๋ฃŒ ๋’ค์—๋Š” oom_reaper๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํšŒ๋ณต ์ง€์—ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค. cgroup v2 ํ™˜๊ฒฝ์—์„œ๋Š” memory.high๋กœ ๋จผ์ € ์••๋ฐ•์„ ์™„ํ™”ํ•˜๊ณ  memory.max ๋ฐ memory.oom.group์œผ๋กœ ๊ฒฉ๋ฆฌ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๊ตฌ์„ฑ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜์—์„œ๋Š” dmesg, memory.events, oomctl์„ ํ•จ๊ป˜ ๋ด์„œ ์‹œ์Šคํ…œ ์ „์ฒด OOM๊ณผ cgroup OOM์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฉฐ, systemd-oomd๋‚˜ earlyoom์œผ๋กœ ์ปค๋„ OOM ์ด์ „์— ์„ ์ œ ๋Œ€์‘ํ•˜๋Š” ์ „๋žต์ด ๋งŽ์ด ์“ฐ์ž…๋‹ˆ๋‹ค.