OOM ๊ด๋ฆฌ
๊ฐ์
Linux์์ Out Of Memory(OOM) ๊ด๋ฆฌ๋ ์์คํ
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ค์์ด ๋ชจ๋ ์์ง๋์์ ๋ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ์ฌ ์์คํ
์ ๋ณต๊ตฌํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ปค๋์ oom-killer๋ฅผ ํตํด ๊ฐ์ฅ ์ ํฉํ ํ๋ก์ธ์ค๋ฅผ ์ ํํ์ฌ ์ข
๋ฃํ๋ฉฐ, ์ด๋ ๊ฒ ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ๋ ์์คํ
์ด ๊ณ์ ๋์ํ ์ ์๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
OOM์ ํ๋์จ์ด ํ๊ณ, ๋ฉ๋ชจ๋ฆฌ ๋์, ๋น์ ์ ํ๋ก์ธ์ค ๋ฑ์ ์์ธ์ผ๋ก ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ปจํ
์ด๋์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ cgroup ๋จ์์ OOM ๊ด๋ฆฌ๊ฐ ์ค์ํฉ๋๋ค. ๋ณธ ๋ฌธ์์์๋ Linux OOM ๊ด๋ฆฌ์ ๋์ ์๋ฆฌ, oom_score ์ ์ ์ฒด๊ณ, cgroup ํตํฉ, ๊ด๋ จ sysctl ํ๋, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๊ณต๊ฐ ๋์ ๋๊ตฌ๋ฅผ ๋ถ์ํฉ๋๋ค.
๊ทธ๋ฆผ 1. Linux OOM ๊ด๋ฆฌ์ ์ ์ฒด ๊ตฌ์กฐ์ ๊ด๋ จ ๊ตฌ์ฑ ์์
ํต์ฌ ๊ฐ๋
OOM Killer ๋์ ์๋ฆฌ
OOM Killer๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ์ปค๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ปค๋์ __alloc_pages_may_oom() ํจ์๋ฅผ ํตํด ์ง์ ํ์(direct reclaim)์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ์(kswapd)๊ฐ ๋ชจ๋ ์คํจํ์ ๋ OOM ์ํ๋ก ํ์ ํฉ๋๋ค.
OOM Killer์ ํต์ฌ ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ ๊ฐ์ง (watermark ๋ฏธ๋ฌ)
out_of_memory()ํธ์ถ์ ํตํ OOM ์ํ ํ์ - ํ๊ฒ ํ๋ก์ธ์ค ์ ํ (
oom_badness()๊ธฐ๋ฐ) SIGKILL์ ์ก์ ํตํ ํ๋ก์ธ์ค ์ข ๋ฃ- ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฐ ํ ๋น ์ฌ์๋
๊ทธ๋ฆผ 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 ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค:
- Watermark ํ์ธ: ํ ๋น ์์ ์ free ํ์ด์ง๊ฐ min watermark ๋ฏธ๋ฌ์ธ์ง ํ์ธ
- ์ง์ ํ์(Direct Reclaim): ํ ๋น ํธ์ถ์๊ฐ ์ง์ LRU์์ ํ์ด์ง๋ฅผ ํ์
- kswapd ๋์: ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ watermark๋ฅผ ํ๋ณตํ ๋๊น์ง ํ์
- COMPACT ์ฌ์๋: ๊ณ ์ฐจ ํ ๋น ์คํจ ์ ๋ฉ๋ชจ๋ฆฌ ์์ถ ์๋
- 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() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ํ๋ก์ธ์ค๋ฅผ ์ ํํฉ๋๋ค:
- ์์คํ ์ ์ฒด ํ๋ก์ธ์ค ๋ชฉ๋ก ์ํ
- ๊ฐ ํ๋ก์ธ์ค์
oom_score๊ณ์ฐ (๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ธฐ๋ฐ) oom_score_adj๋ฅผ ํตํด ๋ณด์ ๋ ์ต์ข ์ ์ ์ฐ์ถ- ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ฐ์ง ํ๋ก์ธ์ค ์ ํ
oom_score_adj๊ฐ -1000์ธ ํ๋ก์ธ์ค๋ ํ๋ณด์์ ์ ์ธ- ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์ผ ์ ์์ผ ๊ฒฝ์ฐ PID๊ฐ ๋์ ํ๋ก์ธ์ค ์ฐ์
๊ทธ๋ฆผ 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 ์ด์ ์ ์ ์ ๋์ํ๋ ์ ๋ต์ด ๋ง์ด ์ฐ์
๋๋ค.