Linux - OOM Killer란?

변재한·2023년 6월 1일
0
post-thumbnail

주제 선택 이유


환경

Virtual Box로 좀 컴퓨팅 자원을 조금 할당한 VM에서 구축한 경량 오픈스택(devstack - Xena) 환경

상황

  • 오픈스택을 설치하고 VM을 생성하고자 했음

  • Cirros, Fedora, Ubuntu VM 이미지가 있었는데 Cirros 이미지말고는 나머지 이미지로는
    VM 시작(Boot) 시 일정 출력 이후로 계속 Disconnected → Shutdown문제 발생

  • putty로 오픈스택 환경을 이용하고 있었는데 나중에 보니까 Virtual Box VM Terminal에서

아래와 같은 메시지를 인스턴스가 disconnected → Shutdown이 될 때마다 출력하고 있었음

# qemu-system-x86라는 프로세스를 계속 죽이고 있었음..
[303044.909080] Out of memory: Killed process 997051(qemu-system-x86) total-vm:1586---KB,
 anon-rss:3494---KB, file-rss:0kB, shmem-srr: 0kB, UID:119 pgtables:1060kB, oom_score_adj:0

OOM Killer란?


**Out Of Memory Killer**의 약자로 Linux 시스템에서 메모리가 부족해지고
메모리 할당을 위한 요청이 실패했을 때 활성화되는 커널 서브시스템

⇒ 리눅스 시스템 상에서 메모리가 부족하면 특정 프로세스를 강제로 종료시키는 녀석

OOM이 발생하는 경우 /var/log/messages Path에 프로세스를 강제 종료 시킨 메세지가 기록

왜 발생할까?


Devops와 SE를 위한 리눅스 커널 이야기 2장을 보면,

  1. 프로세스는 커널에게 자신이 필요로 하는 메모리의 영역을 할당해 줄 것을 요청함
  2. 커널은 프로세스의 요청에 따라 가상의 메모리 주소를 전달해줌
    • 아직 실제 물리 메모리에 해당 영역이 할당된 상태는 아님
    • 프로세스가 할당받은 영역에 실제 쓰기 작업 시 Page Fault 발생 → 실제 물리 메모리에 가상 메모리 공간 매핑

그래서 리눅스에서는 실제 메모리보다 더 많이 가상 메모리를 프로세스들에게 할당할 수 있음

그러다가 프로세스가 실제 메모리에 접근, 쓰기 작업을 하게 되었을 때 실제 메모리가 부족해진다 ⇒ 원인!

종료 우선순위


모든 프로세스가 동일하게 종료 처리 되는 것은 아님

oom_score라는 메트릭을 사용하여 결정

oom_score에 영향을 미치는 요인

  • 프로세스의 메모리 사용량
  • 실행 시간
  • 프로세스의 nice
  • 프로세스가 root로 실행되는지
  • 등…

범위: -1000 ≤ oom_score_adj ≤ 1000

우선순위에서 멀어짐==========우선순위에 가까워짐

그 중 oom_adj 값이 oom_score에 직접적인 영향을 줌

범위: -17 ≤ oom_adj ≤ 15

우선순위에서 멀어짐==========우선순위에 가까워짐

그래서 내가 해결한 방법


일단 OOM-Killer를 비활성화할 수는 없음

그러나, OOM-Killer의 OOM-Scoring에서 벗어나는 것은 가능

  1. 프로세스의 pid를 조회

  2. oom_adj, oom_score_adj 값 조정

    • 나는 oom_adj로 조정함
echo -17 > /proc/<pid>/oom_adj

==> 권한 문제로 아래 명령어로 시도

sudo bash -c "echo '-17' | tee /proc/<pid>/oom_adj

⇒ 근데 결국 이 VM 때문에 다른 프로세스, 프로그램들이 죽으면서 리눅스 시스템 자체가 비정상적으로 동작함..

⇒ 결국 컴퓨팅 리소스를 넉넉하게 넣어준 Virtual Box VM으로 이주함

profile
Infra and Devops 엔지니어가 되고 싶어용

0개의 댓글