ํ์ฌ์์ ๋ค๋ฅธ ํ๋ค๊ณผ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๋ ์๋ฒ๊ฐ ์๋๋ฐ ์๊พธ ์ด์ ์์ด ๋ฌด์์๋ก ํ๋ก์ธ์ค๊ฐ ์ฃฝ๋ ํ์์ด ๋ฐ์ํ๋ค.
๊ฐ ํ๋ก์ ํธ์ ๋ก๊ทธ๋ฅผ ๋ด๋ ํน๋ณํ๊ฒ ๋จ์์๋๊ฒ ์์๊ณ .. ์์ธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ฌ ๋ฆฌ๋ ์ค ์ปค๋์ด OOM Killer ์์ ์ ์คํํ ๊ฒ!
OOM Killer๋ ?
OOM : Out of Memory
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด linux kernel์ด OOM Killer๋ฅผ ์คํํ๋ค. (์ ์๋ฅผ ๋งค๊ฒจ ๋์ ์ ์๋ฅผ ๋ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํจ)
ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํค๋ ์์
oom_badnesss() ๋ฉ์๋์์ ํ๋ก์ธ์ค๋ณ ์ ์๋ฅผ ๊ณ์ฐํ์ฌ ์ ํ
OOM Killer๋ ์ ์๋ฅผ ๋งค๊ฒจ ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๋ฐ์ ํ๋ก์ธ์ค๋ถํฐ kill ์ํค๋๋ฐ ์ด๋ฅผ 'OOM Scoring' ์ด๋ผ๊ณ ํ๋ค.
ํ๋ก์ธ์ค์ ์ ์๋ /proc/<pid>/oom_score ํ์ผ์์ ์ง์ ํ์ธํ ์ ์๋ค.
์ ์๋ฅผ ๋งค๊ธฐ๋ ๋ก์ง์ ์ปค๋ ์ฝ๋์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์๋ ์ฃผ์์ผ๋ก OOM Killer์ ๋ชฉํ๋ฅผ ์ ์ ์๋ค.
/*
* oom_badness - calculate a numeric value for how bad this task has been
* @p: task struct of which task we should calculate
* @p: current uptime in seconds
*
* The formula used is relatively simple and documented inline in the
* function. The main rationale is that we want to select a good task
* to kill when we run out of memory.
*
* Good in this context means that:
* 1) we lose the minimum amount of work done
* 2) we recover a large amount of memory
* 3) we don't kill anything innocent of eating tons of memory
* 4) we want to kill the minimum amount of processes (one)
* 5) we try to kill the process the user expects us to kill, this
* algorithm has been meticulously tuned to meet the principle
* of least surprise ... (be careful when you change it)
*/
1) ์๋ฃ๋ ์์
์ ์๋ฅผ ์ต๋๋ก ์ ์งํ ์ ์๊ฒ ํ๋ค.
2) ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต๊ตฌํ๋ค.
3) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์๋นํ์ง ์๋(Leak์ด ๋ฐ์ํ์ง ์์) ํ๋ก์ธ์ค๋ ์ฃฝ์ด์ง ์๋๋ค.
4) ์ต์ํ์ ํ๋ก์ธ์ค๋ง ํฌ์์ํจ๋ค.
5) ์ฌ์ฉ์๊ฐ ํน๋ณํ ์ง์ ํ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ธ๋ค.
Kill ๋์์์ ์ ์ธ์ํค๋ ๋ฐฉ๋ฒ
OOM Killer๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง scoring ๋์์์ ๋ฒ์ด๋๊ฒํ๋ ๊ฒ(์ฐ์ ์์์์ ๋ฐ๋ ค๋๊ฒํ๋ ๊ฒ)์ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ์ข ๋ฃ๋๋ฉด ์๋๋ ํ๋ก์ธ์ค๋ ์ ์ธ์์ผ์ผ ํ๋๋ฐ ๋น๊ต์ ๊ฐ๋จํ๋ฐ ๋จผ์ ํน์ ํ๋ก์ธ์ค์ PID๋ฅผ ํ์ธํด์ผ ํ๋ค.
๋ฐฉ๋ฒ 1
/proc/<pid>/oom_adj ํ์ผ์ -17์ ์ ๋ ฅํ๋ค. oom_adj๋ -17~ 15 ๋ฒ์์ ๊ฐ์ ๊ฐ์ง๋ฉฐ ๋ฎ์ ๊ฐ์ผ์๋ก ์ฐ์ ์์์์ ๋ฐ๋ ค๋๋ค.
$ echo -17 > /proc/<pid>/oom_adj
๋ฐฉ๋ฒ 2
/proc/<pid>/oom_score_adj ํ์ผ์ -1000์ ์ ๋ ฅํ๋ค. oom_score_adj๋ -1000~1000 ๋ฒ์์ ๊ฐ์ ๊ฐ์ง๋ฉฐ ๋ฎ์ ๊ฐ์ผ์๋ก ์ฐ์ ์์์์ ๋ฐ๋ ค๋๋ค.
$ echo -1000 > /proc/<pid>/oom_score_adj
๋ก๊ทธ ์์น
/var/log/messages
๋๊ธ