본문 바로가기
Old Posts/Linux

[Linux] OOM Killer 소개 및 사용법

by A6K 2022. 5. 23.

OOM은 Out Of Memory의 약자로 직역하면 메모리 부족이다. 애플리케이션이 서버에서 동작하면서 대량의 메모리를 이용하게 될 경우 시스템 메모리가 부족해질 수 있다. 그러면 운영체제의 설정에 따라 대량의 메모리를 사용하는 애플리케이션이 강제로 종료될 수 있다.

OOM Killer

시스템 메모리가 부족해지면 리눅스 커널은 시스템의 정상적인 동작을 보장하기 위해 메모리를 흥청망청쓰는 애플리케이션을 강제 종료하게 된다. 리눅스 커널이 메모리를 확보하기 위해 실행하는게 OOM Killer다

OOM Killer는 점수를 매겨 가장 높은 점수를 받은 프로세스부터 강제 종료한다. 이를 OOM Scoring이라고 한다. 특정 프로세스의 OOM Killer 점수는 /proc/${pid}/oom_score 파일을 통해 조회할 수 있다.

[root@myhost /]# cat /proc/8/oom_score
666

프로세스의 점수는 다음과 같은 기준으로 매겨진다

  1. 완료된 작업의 수를 최대로 유지해야한다
  2. 많은 양의 메모리를 복구한다
  3. 메모리를 많이 소비하지 않은 프로세스는 죽이지 않는다
  4. 최소한의 프로세스만 죽인다
  5. 사용자가 지정한 프로세스를 죽이려 시도한다

일반적인 경우 메모리 릭 같이 이상동작이 발생한 프로세스가 OOM Killer에 의해 검출되어 강제 종료된다.

OOM Killer 대상에서 제외시키는 방법

리눅스 커널의 기능인 OOM Killer를 비활성화하는 것은 불가능하다. 대신 호스트에서 동작하고 있는 중요한 데몬이나 서비스가 OOM Killer에 의해서 강제 종료되자 않도록 설정하는 것은 가능하다.

우선 /proc/${pid}/oom_adj 파일에 -17을 입력한다.

$ sudo echo -17 > /proc/${pid}/oom_adj

oom_adj 파일은  -17에서 15 범위의 값을 가지며 숫자가 높을 수록 OOM Killer의 대상으로 선정될 가능성이 높아진다.

혹은 /proc/${pid}/oom_score_adj 파일에 -1000을 입력한다.

$ sudo echo -1000 > /proc/${pid}/oom_score_adj

oom_score_adj는 -1000에서 1000까지의 값을 가짐 마찬가지로 숫자가 높을수록 OOM Killer의 대상으로 선정될 가능성이 높아진다.

OOM Killer 로그

OOM Killer의 로그는 /var/log/message 에 남는다.

kernel : Out of memory: Kill process 15624 (java) score 485 or sacrifice child
kernel : Killed process 15624 (java) total-vm:2532680kB, anon-rss:1314518kB, file-rss:0kB

OOM Killer가 어떤 프로세스를 죽였고, 강제종료당한 프로세스는 뭐고, 점수는 몇 점이었는지 기록에 남는다. 그리고 강제종료당한 프로세스의 메모리 관련 정보도 남는다.

 

 

댓글