
๋ Linux ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์๊ธฐ์น ์๊ฒ ์ข ๋ฃ๋์์ผ๋ฉฐ, ๊ทธ ์์ธ์ ํ์ ํด์ผ ํฉ๋๋ค. ์์ธ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๊ทธ์ธ๊ทธ โ ๋ฐฑ์๋ ์๋ฒ์ ๋ฒ๊ทธ๋ก ์ธํ ์คํจ. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋๋ญ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋จ์ํ ๋์คํฌ ๊ณต๊ฐ์ด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋๋ค. ๋์คํฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ํ์ถ๊ตฌ๋ ๋จ ํ๋๋ฟ์ ๋๋ค. ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค์ ์์ํ๋ ๊ฒ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํฌ๋ฌ
์ธ์ ์๋ฒ ๋๋ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋๋ค. Linux ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ(Out-Of-Memory Killer, OOM Killer)๋ ๋ ๊ฐ์ง ํด๊ฒฐ์ฑ ์ ์ ์ํฉ๋๋ค. ์์คํ ์ ์ฒด๋ฅผ ๋ค์ด์ํค๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค(์ ํ๋ฆฌ์ผ์ด์ )๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ ๋๋ค. ๋น์ฐํ ์ด์์ฒด์ ๋ค์ด์ ๋ง๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ ๋๋ค. ๊ฐ๋จํ ๋งํด, OOM Killer๋ ์ปค๋ ๋ค์ด์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด์์ฒด์ ๊ฐ ๊ณ์ ์คํ๋๋๋ก ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ์ํ๋ ๊ฒ์ ๋๋ค. ๋จผ์ OOM์ด ์ด๋ป๊ฒ ์๋ํ๊ณ ์ด๋ป๊ฒ ์ ์ดํ๋์ง ์ดํด๋ณธ ๋ค์, OOM Killer๊ฐ ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ ์ง ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฃผ์ ์ ๋ฌด ์ค ํ๋ Linux โ ํ๋ก์ธ์ค๊ฐ ์์ฒญํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ธ์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ์ง๋ง ์ ๋ถ ์ฌ์ฉํ์ง๋ ์์ต๋๋ค. ์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ๋ ๋ชจ๋ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง๋ง, ์ค์ ๋ก ์ฌ์ฉํ์ง ์๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉด ์์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋น ๋ฅด๊ฒ ๋ถ์กฑํด์ ธ ์์คํ ์ด ์ถฉ๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํด ๋์ง๋ง ์ค์ ๋ก ํ ๋นํ์ง๋ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์๋ง ํ ๋น๋ฉ๋๋ค. ๋๋๋ก ์ด์์ฒด์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ๋ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํด ๋๊ณ , ํ๋ก์ธ์ค๊ฐ ํ์๋ก ํ ๋ ๊ฐ๋ฅํ๋ฉด ํ ๋นํฉ๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํด ๋์์ง๋ง ์ ์ ํ์ํ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ด ์์คํ ์ด ์ถฉ๋ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. OOM(๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ) ์ค๋ฅ๋ ์ด๋ฌํ ์ํฉ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ์ปค๋ ํจ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃํฉ๋๋ค. PostgreSQL ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ๋ก ์ข ๋ฃ๋๋ฉด ๋ก๊ทธ์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
Out of Memory: Killed process 12345 (postgres).์์คํ
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๊ณ ํด์ ํ ์ ์๋ ๊ฒฝ์ฐ ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. out_of_memory. ์ด ๋จ๊ณ์์ ๊ทธ๋
๊ฐ ํด์ผ ํ ์ผ์ ํ๋ ์ด์, ์ฆ ํ๋ ์ด์์ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ๋ ๊ฒ๋ฟ์
๋๋ค. OOM-killer๊ฐ ํ๋ก์ธ์ค๋ฅผ ์ฆ์ ์ข
๋ฃํด์ผ ํฉ๋๊น, ์๋๋ฉด ๊ธฐ๋ค๋ฆด ์ ์์ต๋๊น? ๋ถ๋ช
ํ out_of_memory๊ฐ ํธ์ถ๋๋ฉด I/O ์์
์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ๋์คํฌ์ ํ์ด์งํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ OOM ํฌ๋ฌ๋ ๋จผ์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํด์ผ ํ๋์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ์๋ ํ์ธ ์ฌํญ์ด ๋ชจ๋ ๊ธ์ ์ ์ด๋ฉด OOM์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํฉ๋๋ค.
ํ๋ก์ธ์ค ์ ํ
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. out_of_memory(). ๊ธฐ๋ฅ์ด ์์ด์ select_bad_process(), ํจ์๋ก๋ถํฐ ํ๊ฐ๋ฅผ ๋ฐ์ต๋๋ค. badness(). "์ต์
์" ํ๋ก์ธ์ค๊ฐ ๋ชฉํ๊ฐ ๋ฉ๋๋ค. ๊ธฐ๋ฅ badness() ํน์ ๊ท์น์ ๋ฐ๋ผ ํ๋ก์ธ์ค๋ฅผ ์ ํํฉ๋๋ค.
- ์ปค๋ ์์ฒด์๋ ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํด์ผ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ํ์๊ฐ ์์ต๋๋ค.
- ์ต์ํ์ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํด์ผ ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ง์ ์๋ฃํ๋ ค๋ ํ๋ก์ธ์ค์ ์๋ฃ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ํ์ธ์ ์๋ฃํ ํ OOM์ ์ ์(oom_score). OOM ํ ๋น oom_score ๊ฐ ํ๋ก์ธ์ค๋ฅผ ์คํํ ๋ค์ ์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณฑํฉ๋๋ค. ๊ฐ์ด ๋ ํฐ ํ๋ก์ธ์ค๋ OOM Killer์ ํฌ์์์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ๋ฃจํธ ์ฌ์ฉ์์ ์ฐ๊ฒฐ๋ ํ๋ก์ธ์ค๋ ์ ์๊ฐ ๋ฎ๊ณ ๊ฐ์ ๋ก ์ข
๋ฃ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres ํ๋ก์ธ์ค ID๋ 3813์ด๋ฏ๋ก ๋ค๋ฅธ ์
ธ์์๋ ์ด ์ปค๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ฅผ ์ป์ ์ ์์ต๋๋ค. oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2OOM-Killer๊ฐ ํ๋ก์ธ์ค๋ฅผ ์ ํ ์ข
๋ฃํ์ง ์๋๋ก ํ๋ ค๋ฉด ๋ค๋ฅธ ์ปค๋ ์ต์
์ด ์์ต๋๋ค: oom_score_adj. ์ค์ํ๊ฒ ์๊ฐํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ ๊ฐ๋ฅ์ฑ์ ์ค์ด๋ ค๋ฉด ํฐ ์์ ๊ฐ์ ์ถ๊ฐํ์ธ์.
sudo echo -100 > /proc/3813/oom_score_adj๊ฐ์ ์ค์ ํ๋ ค๋ฉด oom_score_adj, ์๋น์ค ๋ธ๋ก์์ OOMScoreAdjust๋ฅผ ์ค์ ํฉ๋๋ค.
[Service]
OOMScoreAdjust=-1000๋๋ ์ฌ์ฉ oomprotect ํ์์ rcctl.
rcctl set <i>servicename</i> oomprotect -1000ํ๋ก์ธ์ค ๊ฐ์ ์ข ๋ฃ
ํ๋ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ์ ํ๋์ด ์์ผ๋ฉด OOM-Killer๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. oom_kill_task(). ์ด ํจ์๋ ํ๋ก์ธ์ค์ ์ข
๋ฃ ์ ํธ๋ฅผ ๋ณด๋
๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๊ฒฝ์ฐ oom_kill() ์ด ํจ์๋ฅผ ํธ์ถํ์ฌ SIGKILL ์ ํธ๋ฅผ ํ๋ก์ธ์ค์ ๋ณด๋
๋๋ค. ์ปค๋ ๋ก๊ทธ์ ๋ฉ์์ง๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
Out of Memory: Killed process [pid] [name].OOM-Killer ์ ์ด ๋ฐฉ๋ฒ
ะ Linux OOM-Killer๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ ์ ์์ต๋๋ค(๋จ, ๋นํ์ฑํ๋ ๊ถ์ฅํ์ง ์์ต๋๋ค). ํ์ฑํ ๋๋ ๋นํ์ฑํํ๋ ค๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. vm.oom-kill. ๋ฐํ์์ OOM-Killer๋ฅผ ํ์ฑํํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์คํํ์ธ์. sysctl.
sudo -s sysctl -w vm.oom-kill = 1OOM-Killer๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด ๋์ผํ ๋ช ๋ น์ ๊ฐ 0์ ์ง์ ํ์ญ์์ค.
sudo -s sysctl -w vm.oom-kill = 0์ด ๋ช
๋ น์ ๊ฒฐ๊ณผ๋ ์์ํ ์ ์ฅ๋์ง ์๊ณ ์ฒ์ ์ฌ๋ถํ
ํ ๋๊น์ง๋ง ์ ์ฅ๋ฉ๋๋ค. ์ง์์ฑ์ด ๋ ํ์ํ๋ฉด ํ์ผ์ ๋ค์ ์ค์ ์ถ๊ฐํ์ธ์. /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confํ์ฑํ ๋ฐ ๋นํ์ฑํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ณ์๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค. panic_on_oom. ๊ฐ์ ์ธ์ ๋ ์ง ํ์ธํ ์ ์์ต๋๋ค. /proc.
$ cat /proc/sys/vm/panic_on_oom
0๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด๋ ์ปค๋ ํจ๋์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
$ echo 0 > /proc/sys/vm/panic_on_oom๊ฐ์ 1๋ก ์ค์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ปค๋ ํจ๋์ด ๋ฐ์ํฉ๋๋ค.
echo 1 > /proc/sys/vm/panic_on_oom์์ ์ธ๊ธํ๋ฏ์ด OOM-Killer๋ ์ผ๊ณ ๋ ์ ์์ต๋๋ค. Linux ํ๋ก์ธ์ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํ ์ ์์ง๋ง ์ค์ ๋ก ํ ๋นํ์ง๋ ์์ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๋์์ ์ปค๋ ๋งค๊ฐ๋ณ์์ ์ํด ์ ์ด๋ฉ๋๋ค. Linux์ด ํ์์ ํด๋น ๋ณ์ ๋๋ฌธ์
๋๋ค. vm.overcommit_memory.
๋ค์ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
0: ์ปค๋ ์์ฒด์์ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ๋๋ถ๋ถ์ ๋ฒ์ ์์ ๊ธฐ๋ณธ๊ฐ์
๋๋ค. Linux.
1: ์ปค๋์ ํญ์ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํฉ๋๋ค. ์ธ์ ๊ฐ๋ ํ๋ก์ธ์ค์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์ผ๋ฏ๋ก ์ด๋ ์ํํฉ๋๋ค.
2: ์ปค๋์ ๋งค๊ฐ๋ณ์์ ์ง์ ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฝํ์ง ์์ต๋๋ค. overcommit_ratio.
์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ณผ ์์ฝ์ด ํ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋น์จ์ ์ง์ ํฉ๋๋ค. ๊ณต๊ฐ์ด ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ง ์์ผ๋ฉฐ ์์ฝ์ด ๊ฑฐ๋ถ๋ฉ๋๋ค. ์ด๋ PostgreSQL์ ๊ถ์ฅ๋๋ ๊ฐ์ฅ ์์ ํ ์ต์
์
๋๋ค. OOM-Killer๋ ๋ค๋ฅธ ์์, ์ฆ ๋ณ์์ ์ํด ์ ์ด๋๋ ์ค์ํ ๊ธฐ๋ฅ์ ์ํฅ์ ๋ฐ์ต๋๋ค. cat /proc/sys/vm/swappiness. ์ด ๊ฐ์ ์ปค๋์ ํ์ด์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค. ๊ฐ์ด ๋์์๋ก OOM์ด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ ๊ฐ๋ฅ์ฑ์ ๋ฎ์์ง์ง๋ง I/O ์์
์ผ๋ก ์ธํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก OOM-Killer ๊ฐ์
๊ฐ๋ฅ์ฑ์ด ๋์์ง์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ๋ ๋์์ง๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 60์ด์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ ๊ฒฝ์ฐ์๋ 1๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข๋ค.
๊ฒฐ๊ณผ
OOM-Killer์ "ํฌ๋ฌ"๊ฐ ๋น์ ์ ๋๋ผ๊ฒ ํ์ง ์๋๋ก ํ์ธ์. ์ด ๊ฒฝ์ฐ ์ด์ธ์๋ ์์คํ
์ ๊ตฌ์ธ์ฃผ๊ฐ ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ต์
์ ํ๋ก์ธ์ค๋ฅผ "์ข
๋ฃ"ํ๊ณ ์์คํ
์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค. PostgreSQL์ ์ข
๋ฃํ๊ธฐ ์ํด OOM-Killer๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ์ญ์์ค. vm.overcommit_memory ๊ฐ 2. ์ด๋ OOM-Killer๊ฐ ๊ฐ์
ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง๋ ์์ง๋ง PostgreSQL ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข
๋ฃํ ๊ฐ๋ฅ์ฑ์ ์ค์ฌ์ค๋๋ค.
์ถ์ฒ : habr.com
