B2B Solution/Linux

Linux OOM Killer: 프로세스 강제 종료 원인 분석 및 해결 가이드

SangPedia 2026. 3. 9. 01:24
반응형
Linux OOM Killer: 프로세스 강제 종료 원인 분석 및 해결 가이드

Linux OOM Killer: 프로세스 강제 종료 원인 분석 및 해결 가이드

Linux 시스템을 운영하다 보면 예기치 않게 프로세스가 강제 종료되는 현상을 겪을 수 있습니다. 이 경우, OOM (Out Of Memory) Killer가 작동하여 시스템의 안정성을 유지하기 위해 메모리를 많이 사용하는 프로세스를 강제로 종료했을 가능성이 높습니다. 이번 글에서는 OOM Killer의 작동 원리를 이해하고, 발생 원인을 분석하여 해결하는 방법을 단계별로 안내합니다.

에러 현상

OOM Killer가 작동하면 시스템 로그 (주로 /var/log/messages 또는 /var/log/syslog)에 다음과 유사한 메시지가 기록됩니다.

kernel: Out of memory: Kill process 1234 (application) score 567 or sacrifice child
kernel: Killed process 1234 (application) total-vm:123456kB, anon-rss:23456kB, file-rss:34567kB

이 메시지는 커널이 메모리 부족 상황을 감지하고, 프로세스 ID 1234번의 application 프로세스를 종료했음을 의미합니다. Ubuntu 22.04 환경에서 앱들이 갑자기 닫히고 재개 시 시스템이 멈추는 현상도 OOM Killer 때문일 수 있습니다.

원인 분석

OOM Killer는 시스템의 메모리 사용량이 임계점을 초과했을 때 발생하는 현상입니다. 주요 원인은 다음과 같습니다.

1. 메모리 누수 (Memory Leak)

애플리케이션에서 메모리를 할당받고 해제하지 않는 경우, 메모리 누수가 발생하여 시스템의 가용 메모리가 점진적으로 감소합니다. 장기간 실행되는 프로세스에서 흔히 발생하며, 시간이 지날수록 더 많은 메모리를 소비하게 됩니다. 메모리 누수는 애플리케이션의 버그 또는 잘못된 메모리 관리로 인해 발생할 수 있습니다.

2. 과도한 메모리 사용

특정 프로세스가 예상보다 많은 메모리를 사용하는 경우, 시스템의 가용 메모리가 부족해질 수 있습니다. 이는 대량의 데이터를 처리하거나, 복잡한 계산을 수행하는 애플리케이션에서 발생할 수 있습니다. 힙 메모리 부족 또한 이 원인에 해당할 수 있습니다.

3. 부족한 Swap 공간

Swap 공간은 물리적 메모리가 부족할 때 디스크 공간을 메모리처럼 활용하는 공간입니다. Swap 공간이 부족하면 시스템은 물리적 메모리 부족을 더욱 빠르게 감지하고 OOM Killer를 호출할 수 있습니다. Swap 공간이 아예 설정되지 않았거나, 그 크기가 너무 작은 경우 문제가 발생할 수 있습니다.

Mermaid diagram: graph TD

해결 방법

1. 메모리 누수 해결

  • 원인: 애플리케이션의 메모리 누수
  • 해결: 메모리 누수를 진단하고 수정합니다.
    • 진단: valgrind와 같은 메모리 분석 도구를 사용하여 메모리 누수를 탐지합니다. 애플리케이션의 소스 코드를 검토하여 메모리 할당 및 해제 로직을 확인합니다.
    • 수정: 누수되는 메모리를 해제하도록 코드를 수정합니다. 사용하지 않는 객체 또는 데이터를 명시적으로 해제합니다.
  • 확인: 수정 후에도 메모리 사용량이 지속적으로 증가하는지 모니터링합니다.
# valgrind를 사용한 메모리 누수 검사 예시
valgrind --leak-check=full ./your_application

2. 메모리 사용량 최적화

  • 원인: 프로세스의 과도한 메모리 사용
  • 해결: 애플리케이션의 메모리 사용량을 줄입니다.
    • 최적화: 불필요한 데이터 로딩을 줄이고, 메모리 효율적인 자료 구조를 사용합니다. 이미지, 비디오 등의 리소스 크기를 줄입니다.
    • 제한: ulimit 명령어를 사용하여 프로세스의 최대 메모리 사용량을 제한합니다. Docker 컨테이너를 사용하는 경우, 컨테이너의 메모리 제한을 설정합니다.
  • 확인: 애플리케이션의 성능을 저하시키지 않으면서 메모리 사용량이 감소했는지 확인합니다.
# ulimit을 사용한 메모리 제한 예시 (1GB)
ulimit -v 1048576 # KB 단위
./your_application

3. Swap 공간 확보

  • 원인: 부족한 Swap 공간
  • 해결: Swap 공간을 추가하거나 Swapiness 값을 조정합니다.
    • 추가: Swap 파티션을 추가하거나 Swap 파일을 생성하여 Swap 공간을 늘립니다. 클라우드 환경에서는 인스턴스 유형을 변경하여 더 많은 메모리를 확보할 수 있습니다.
    • 조정: vm.swappiness 값을 조정하여 Swap 공간 사용 빈도를 조절합니다. 값이 낮을수록 물리적 메모리를 우선적으로 사용합니다.
  • 확인: Swap 공간이 충분히 확보되었는지 확인하고, 시스템 성능에 미치는 영향을 모니터링합니다.
# Swap 공간 추가 예시
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Swapiness 값 확인 및 변경 예시
sysctl vm.swappiness # 현재 값 확인
sudo sysctl vm.swappiness=30 # 값 변경 (재부팅 후 적용하려면 /etc/sysctl.conf 파일 수정)

Mermaid diagram: sequenceDiagram

예방 조치

  1. 모니터링: 시스템의 메모리 사용량을 주기적으로 모니터링합니다. free, top, vmstat 등의 명령어를 사용하거나, Prometheus, Grafana와 같은 모니터링 도구를 활용합니다. 임계치를 설정하여 메모리 사용량이 높을 때 알림을 받도록 구성합니다.
# 메모리 사용량 모니터링 스크립트 예시 (Bash)
while true; do
  free -m
  sleep 60
done
  1. 자동 재시작: OOM Killer에 의해 프로세스가 종료되었을 때, 자동으로 프로세스를 재시작하도록 설정합니다. systemd를 사용하는 경우, Restart=on-failure 옵션을 설정합니다.
  2. 리소스 제한: 각 프로세스의 메모리 사용량을 제한합니다. Docker 컨테이너를 사용하는 경우, 컨테이너별로 메모리 제한을 설정합니다. cgroups를 사용하여 프로세스 그룹의 리소스 사용량을 제한할 수도 있습니다.
  3. 코드 검토: 애플리케이션의 코드를 주기적으로 검토하여 메모리 누수 가능성을 줄입니다. 정적 분석 도구를 사용하여 잠재적인 메모리 문제를 탐지합니다.

FAQ

  1. OOM Killer가 발생하는 주된 원인은 무엇인가요?
    OOM Killer는 시스템의 물리적 메모리(RAM)가 부족할 때 발생합니다. 이는 메모리 누수, 과도한 프로세스 실행, 설정된 메모리 제한 초과 등으로 인해 발생할 수 있습니다. 메모리 사용량을 지속적으로 모니터링하고, swap 공간을 적절히 설정하는 것이 중요합니다.
  2. OOM Killer가 특정 프로세스를 선택하는 기준은 무엇인가요?
    OOM Killer는 시스템의 oom_score를 기준으로 프로세스를 선택합니다. oom_score는 프로세스의 메모리 사용량, 실행 시간, root 권한 여부 등을 고려하여 계산됩니다. 관리자는 /proc/[pid]/oom_adj 또는 /proc/[pid]/oom_score_adj를 조정하여 특정 프로세스가 종료되지 않도록 설정할 수 있습니다.
  3. OOM Killer를 완전히 비활성화할 수 있나요?
    OOM Killer를 비활성화하는 것은 권장되지 않습니다. 시스템 안정성을 해칠 수 있기 때문입니다. 하지만 특정 상황에서 비활성화해야 한다면, vm.oom-kill=0 설정을 통해 가능합니다. 이 경우, 시스템은 메모리 부족 상태에서 멈추거나 예기치 않은 오류가 발생할 수 있으므로 신중하게 결정해야 합니다. 메모리 관리를 철저히 하는 것이 중요합니다.
  4. OOM Killer 로그는 어디에서 확인할 수 있나요?
    OOM Killer 로그는 일반적으로 /var/log/messages 또는 /var/log/syslog 파일에서 확인할 수 있습니다. dmesg 명령어를 사용하여 커널 로그를 확인하는 방법도 있습니다. 로그를 분석하여 어떤 프로세스가 종료되었는지, 그리고 OOM Killer가 작동한 시점을 파악할 수 있습니다.

반응형