ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 캐시를 모두 해제하는 명령어 이다.

    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

     

     

    '개발 > 리눅스' 카테고리의 다른 글

    [리눅스] 기본 용어 정리  (0) 2021.12.27

    댓글

Designed by Tistory.