본문 바로가기
Linux

[Linux] Ubuntu - OOM(Out Of Memory) 메모리 부족과 대응

by lucas_owner 2024. 9. 18.

목차

  1. 대응방안 및 개요
  2. 메모리 확인
  3. Cache/buff 메모리 정리
  4. CronTab 으로 자동화

Linux - OOM 과 대응방안 개요

- Linux 서버를 운영하다 보면 수많은 장애와 오류를 마주할 수 있다. 그 중 제일 무섭다고 생각되는 장애중 하나는

OOM(Out Of Memory) 일 것이다. 

 

해당 장애는 `시스템 메모리 부족` 상태를 의미하며, 서버에서 가용가능한 메모리가 없는 상태를 뜻한다. 해당 장애가 발생했을때 

무서운점은 모든 프로세스(OS, APP)가 멈출뿐 아니라, 대응하기도 쉽지 않다는점이다.  

 

필자의 경우, 홈서버에서 실행중인 Process(Memory 많이 사용)가 많은 상황에서 발생하였으며, 수동으로 Server를 재시작하였다.

추후 확인해보니 Cache Memory의 사용비율이 너무 높았다.

 

기본적으로 Linux 계열의 OS 에서는 이러한 OOM 장애를 방지하기 위해 하나의 매커니즘이 동작하게 된다.

 

- OOM Killer

OOM Killer 는 Linux 커널이 메모리 부족상황에서 시스템을 안정적으로 유지하기 위해 Memory 를 회수하는 프로세스이다.

시스템 메모리가 부족하여 새로 메모리를 할당할 수 없는 상황에서 실행되게 된다. 

 

OOM Killer 의 프로세스

  • 메모리를 많이 사용하거나, 중요도가 낮은 프로세스를 선택, 강제종료
  • 프로세스가 종료되어 메모리가 해제되면, 다른 프로세스가 사용할 수 있게 함.
  • System 의 중요한 프로세스는 보호된다(sshd 등)

메모리 사용량, 프로세스 우선순위, oom_scope(값이 높을수록 OOM Killer 의 종료대상, 프로세스마다 보유) 해당 대상을 통해 OOM Killer 의 종료대상이 된다.

(또한 프로세스별로 OOM Killer 의 순위를 수동으로 설정할 수 있다. 해당 글에서는 다루지 않겠다.)


1. 메모리 사용량 확인

# 전체, 사용, 캐시, 스왑 메모리 확인
$ free -h 


# CPU/ MEM 동시 실시간 확인
$ top

free -h

 

top

 

free -h 커맨드는 단순 사용량, 가용량 들을 한눈에 파악하기 쉽고

top 커맨드의 경우 사용량이 높은 프로세스나 더 자세한 내역을 확인하기 좋다. 

(필자의 프로세스에서는 java 프로세스의 사용량이 높은데 elasticsearch 사용률이다)

 


 

2. Cache/buff 메모리 사용량이 높은 경우

- 필자의 서버처럼 Cache/buff 메모리가 비정상적으로 너무 높은 경우가 있을 수 있다. 

(너무 많은 파일(I/O) 작업, 로그 기록, 백업, 대용량 데이터 처리 등등)

 

이 경우에는 프로세스를 종료시켜주는 OOM Killer 의 작업말고, 수동으로 해제 시켜주고 싶었다.

Cache/buff 메모리 사용량이 높고 자주 사용되고 있다면, 자주 사용하는 프로그램, 파일등에 메모리 접근 속도를 높일 수 있다는 장점이 존재하지만, 다른 프로세스들이 메모리 사용률을 확보하지 못하거나 OOM 장애가 발생할 수 있는 여지가 존재한다. 

Cache/buff 메모리를 해제시켜주면 top 커맨드 사진처럼 가용가능한 메모리 자원이 생기기 때문에, 

일정 주기로 Cache/buff 를 비워주는것이 좋다고 판단했다.

 

 

2-1. Cache/buff 메모리 clear

- Cache/buff 메모리를 정리하기 위해서는 2가지의 커맨드가 필요하게 된다.

 

# 메모리에서 disk 로 저장 & 동기화
$ sync


# Cache/buff 메모리 정리
$ sysctl -w vm.drop_caches=3

 

- Linux 의 작업대상이 되는 데이터들은, System Memory 에서 작업이 이루어지기 때문에, 작업대상은 Memory 에 존재하게 된다. 

따라서 별도의 저장이 없거나, 중간에 시스템이 다운되는 현상이 발생하게 되면, 저장되지 않은 작업대상들은 사라진다.

이런 상황을 막기위해 Memory 의 작업대상 및 내역을 Disk 에 동기화(저장) 작업을 우선적으로 실행 해야 한다.(Flushing)

 

- 2번째 명령어는 파일 시스템의 PageCache, dentries, inodes 캐시를 모두 해제하는 명령어 이다.

  1. PageCahce: 파일 데이터 캐시
  2. inodes: 파일 시스템에서 파일에 대한 메타데이터 저장 구조체, 파일의 속성, 위치 정보를 담고있다.
  3. dentries: 디렉토리 Entry Cache, 파일명과 inodes 를 매핑하는 역할.
vm.drop_caches=3 작업의 경우 위의 3가지 항목을 해제 하게 되며, 숫자 옵션의 경우 아래와 같다.

drop_caches=1: PageCache 해제
drop_caches=2: dentries, inodes 해제
drop_caches=3: PageCache, dentries, inodes 모두 해제 

 

2-2. 위의 작업 한번에 진행하기 

2번의 명령어를 사용하지 않고, 한번에 진행하면 더욱 편리할 수 있다. 

$ sync && echo3 > /proc/sys/vm/drop_caches

 

 

3. Crontab 으로 주기적 Cache/buff 해제

- 너무 잦은 Cache/buff Clear 는 오히려 시스템의 성능에 영향을 미칠 수 있는 항목이기 때문에 일정, 특정 주기로 해당 작업을

자동화 하고 싶을 수 있다. 

 

Linux 의 Crontab 기능을 사용하여 자동화 시킬 수 있다.(스케줄링)

# CronTab 설정
$ crontab -e


# 매주 일요일 1시에 실행 - 분 시 일 월 요일
$ 0 1 * * 0 sync && echo3 > /proc/sys/vm/drop_caches


# sudo 권한으로 실행 시키고 싶은 경우
$ sudo crontab -e

$ 0 1 * * 0 /bin/sync && /sbin/sysctl -w vm.drop_caches=3

옵션의 경우 주석의 예시를 보고 설정 해주면 된다. 

crontab 작성후 필히 저장해야한다.

 

crontab 의 경우 기본적으로 nano 편집기를 사용하여 작성이 된다.

 

vi, vim 의 사용법이 더욱 익숙한 사람들은 아래처럼 하면된다.

# 한번만 vim 으로 실행
$ EDITOR=vim crontab -e


# 기본 편집기를 vim 으로 설정
$ export VISUAL=vim
$ export EDITOR=vim

 

이후 크론탭이 정상적으로 등록 되었는지 확인 하게 되면 끝난다.

# CronTab list 
$ crontab -l

# Sudo
$ sudo crontab -l

 


해당 Crontab 이 실행됬는지 확인 하려면 log 로 확인도 가능하다. 

$ grep CRON /var/log/syslog


# 혹은 
grep drop_caches /var/log/syslog
반응형

댓글