OOM Killer 란
Out Of Memory Killer 의 약자로 메모리가 부족할 경우 특정 프로세스를 강제로 종료시킵니다.
OOM 이 발생하는 경우 /var/log/messages 경로에 다음과 같은 메세지가 기록됩니다.
아래는 OOM 에 의해 gmaster 프로세스가 강제 종료된 메세지 입니다.
Jan 10 17:37:01 p-master kernel: Out of memory: Kill process 9267 (gmaster) score 485 or sacrifice child
Jan 10 17:37:01 p-master kernel: Killed process 9267, UID 500, (gmaster) total-vm:86877900kB, anon-rss:75280kB, file-rss:68979468kB
OOM Killer 가 발생하는 원인
커널은 VM 을 이용한 메모리 할당을 진행하므로, 실제 Physical 메모리보다 큰 프로그램을 구동할 수 있습니다.
당장 사용하지 않는 메모리는 나중에 할당하여 사용하기 때문에, 실제 메모리를 넘는 프로그램들도 구동될 수 있습니다. ( OverCommit 이라고 부릅니다. )
이 때, 이 OverCommit 된 메모리에 쓰여지게 되는 경우 메모리가 모자라며 Out Of Memory 가 발생합니다.
프로세스를 종료시키는 순위
1. oom_badness() 메소드에서 각 프로세스별 점수를 계산하여 종료시킬 프로세스를 선택합니다.
2. 사용자가 특별히 지정하여 순위를 변동시킬 수 있습니다.
oom_badness() 메소드의 순위 선정 방법
1. 특정 프로세스를 죽임으로써, 최소한 양의 프로세스만 잃을 수 있어야 합니다.
2. 많은 메모리를 회수할 수 있어야 합니다.
3. 프로세스중 Leak 가 발생되지 않는 프로세스는 선택하지 않습니다.
4. 사용자가 특별히 지정한 프로세스를 선택합니다.
이 외에 nice 와 score 기반으로 순위를 선정하는 계산은 복잡하므로, 여기에서는 생략하겠습니다.
OOM Killer 순위 설정 방법
1. 특정 프로세스의 PID 를 조회합니다.
2. /proc/PID/oom_adj 의 파일에 -17 을 입력합니다. oom_adj 는 -17 ~ 15 의 값을 가지며, 낮은 값 일수록 우선순위에서 밀려납니다.
3. /proc/PID/oom_score_adj 의 파일에 -1000 을 입력합니다. oom_score_adj 는 -1000 ~ 1000 의 값을 가지며, 낮은 값 일수록 우선순위에서 밀려납니다.
# pidof gmaster 18907 # echo -17 > /proc/18907/oom_adj # echo -1000 > /proc/18907/oom_score_adj
OOM Killer 비활성화
안타깝게도 메모리 누수로 인한 System Hang 현상을 방지하기 위해, OOM Killer 자체를 끌수 있는 방법은 없습니다.
대신에 위의 설정처럼 oom_adj 파일에 -17 의 값을 넣게 되면 OOM Killer 는 설정된 프로세스를 선택하지 않게됩니다.
'Linux > 개념' 카테고리의 다른 글
[LINUX] 세마포어 관련 RemoveIPC 프로퍼티를 설정하기 (0) | 2018.05.25 |
---|---|
[LINUX] SSH 접속불가 REMOTE HOST IDENTIFICATION HAS CHANGED 해결하기 (0) | 2018.04.30 |
[LINUX] Qt FATAL: QXcbConnection: Could not connect to display 현상 해결하기 (0) | 2017.09.26 |
[LINUX] LWP 란? LWP 경량 프로세스 알아보기 (0) | 2017.09.20 |
[LINUX] kill -l 목록 알아보기 (0) | 2017.09.19 |