OOM 킬러
개념모든 Linux 배포판
OOM(out-of-memory) 킬러는 시스템 메모리가 고갈되어 더 이상 확보할 수 없을 때 프로세스를 종료하는 Linux 커널의 구성 요소입니다. OOM 점수를 기준으로 프로세스를 선택하며, 대개 메모리를 가장 많이 사용하는 프로세스가 선택됩니다. 커널 로그에는 모든 OOM 킬 기록이 남습니다.
1희생양 프로세스가 선택되는 방식
각 프로세스에는 메모리 사용량에 따라 증가하는 /proc/<pid>/oom_score 점수가 있습니다. -1000에서 1000 사이의 값을 갖는 /proc/<pid>/oom_score_adj를 통해 이 점수를 조정할 수 있으며, -1000은 해당 프로세스가 절대 선택되지 않음을 의미합니다.
2OOM 킬 확인
커널 로그에 'Out of memory: Killed process'가 기록됩니다. journalctl -k | grep -i oom 또는 dmesg | grep -i oom 명령을 통해 프로세스 이름과 메모리 사용량이 포함된 이러한 메시지를 확인할 수 있습니다.
3예방
메모리나 스왑을 추가하고, 메모리를 많이 사용하는 서비스를 제한하거나, MemoryMax= 같은 systemd 옵션을 사용하여 서비스별로 제한을 설정합니다. 일부 배포판에서는 메모리 압박에 따라 더 일찍 작동하는 systemd-oomd를 실행하기도 합니다.
OOM 킬 조사 방법
- 커널 로그 검색:
journalctl -k | grep -i -A5 'out of memory' - 종료된 프로세스와 해당 메모리 크기 기록.
- 현재 메모리 및 스왑 확인:
free -h - 가장 큰 프로세스 찾기:
ps aux --sort=-rss | head - 스왑을 추가하거나 서비스를 제한한 후 재발 여부 모니터링.
주의 사항
- 많은 프로세스에 oom_score_adj를 -1000으로 설정하면 커널에 안전한 선택지가 없어질 수 있습니다.
- 메모리 오버커밋 보호 기능을 정확히 이해하지 못한 채 끄면 다른 곳에서 오류가 발생할 수 있습니다.
관련 문서
- Linux의 스왑 공간스왑의 개념, free 및 swapon 명령어로 확인하는 방법, 스왑 파일을 추가하는 방법, 그리고 vm.swappiness가 변경하는 내용에 대해 설명합니다.
- 로드 아베리지세 가지 로드 아베리지 숫자의 의미, CPU 코어와의 관계, 그리고 높은 부하가 문제가 되는 시기입니다.
- journalctl과 systemd 저널journalctl로 로그를 읽고, 저널이 차지하는 용량을 확인하며 --vacuum 옵션으로 안전하게 줄이는 방법입니다.
출처
- proc(5) 매뉴얼 페이지: oom_score 및 oom_score_adj man7.org
- Out Of Memory Management (kernel.org) kernel.org
참고: RainServer는 Linux 서버를 위한 모니터링 및 안전한 정리를 제공하며, 변경될 내용을 먼저 보여주고 사용자에게 확인을 요청합니다.
최종 검토: