-
[Linux] Ubuntu - OOM(Out Of Memory) 메모리 부족과 대응개발/리눅스 2024. 9. 22. 23:00
OOM은 시스템 메모리 부족 상태를 의미하며, 서버에서 가용 가능한 메모리가 없는 상태를 뜻한다. 해당 장애가 발생했을 때 무선운 점은 모든 프로세스 (OS, APP)가 멈출뿐 아니라, 대응하기도 어렵다.
기본적으로 Linux 계열의 OS에서는 이러한 OOM 장애를 방지하기 위해 하나의 매커니즘이 동작하게 된다.
- OOM Killer
OOM Killer 는 Linux 커널이 메모리 부족상황에서 시스템을 안정적으로 유지하기 위해 Memory 를 회수하는 프로세스이다.
시스템 메모리가 부족하여 새로 메모리를 할당할 수 없는 상황에서 실행되게 된다.OOM Killer 의 프로세스
- 메모리를 많이 사용하거나, 중요도가 낮은 프로세스를 선택, 강제종료
- 프로세스가 종료되어 메모리가 해제되면, 다른 프로세스가 사용할 수 있게 함.
- System 의 중요한 프로세스는 보호된다(sshd 등)
즉 메모리 사용량, 프로세스 우선순위, oom_scope(값이 높을수록 OOM Killer 의 종료대상, 프로세스마다 보유) 해당 대상을 통해 OOM Killer 의 종료대상이 된다.
1. 메모리 사용량 확인
# 전체, 사용, 캐시, 스왑 메모리 확인 $ free -h # CPU/ MEM 동시 실시간 확인 $ top // free -h 커맨드는 단순 사용량, 가용량 들을 한눈에 파악하기 쉽고 // top 커맨드의 경우 사용량이 높은 프로세스나 더 자세한 내역을 확인하기 좋다.
2. Cache/buff 메모리 사용량이 높은 경우
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 캐시를 모두 해제하는 명령어 이다.
- PageCahce: 파일 데이터 캐시
- inodes: 파일 시스템에서 파일에 대한 메타데이터 저장 구조체, 파일의 속성, 위치 정보를 담고있다.
- 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
'개발 > 리눅스' 카테고리의 다른 글
[리눅스] 기본 용어 정리 (0) 2021.12.27