• swappiness 설정 잘못된 상식

    swappiness 설정 잘못된 상식

    스왑 파일을 사용하기 위해서 인터넷을 검색해보면

    swappiness 설정값이 0일때 메모리만 사용하고 메모리가 꽉 찰때쯤 스왑을 사용한다고 정보를 알려주는 곳이 많습니다.
    또 반대로 swappiness 설정값이 100일때 메모리를 사용하지않고 스왑파일을 먼저 사용한다는 정보가 상당하더군요.

    그래서 제 경우에는 메모리를 최대한 사용하지않고 스왑파일만 사용하도록 설정하려고 100 값을 주었습니다.

    결과는 이렇습니다.

    인터넷을 너무 맹신하다가는 이러한 결과를 만들게됩니다.

    그렇게 검색을 하는 도중 조금 의아한 정보를 제공하는 곳이 있더군요.

    남들 10명이면 10명 모두 0은 RAM을 사용하고 100은 스왑파일을 먼저 사용한다는 글과 다르게

    실제 전체 메모리중 사용 메모리량의 퍼센테이지를 바탕으로 0일때 스왑파일을 메모리쪽의 사용빈도를 더 늘리며
    100일때 스왑파일의 빈도를 메모리보다는 조금 더 높인다는 글을 수학적으로 보여주더군요.

    cat /proc/sys/vm/swappiness
    60

    기본값이 60으로 설정되어져있지만 제 서버는 100% 스왑만 사용하고 싶어 100으로 수정하였습니다.

    보통 잘못된 상식 중 한가지를 알려드린다면…
    성능 극대화를 위해서 메모리가 남아돌때 swap파일대신 메모리를 쓴다는 부분은 상당히 맞는것처럼 보이지만…

    메모리 100% 누수로 인해 mysql 셧다운이 되어 홈페이지가 돌아가지 않는다면 성능 극대화가 과연 필요할까요?

    제가 운영하는 AWS EC2 서버는 메모리가 2GB인 small t3타입의 vCPU입니다.

    평소 운영하는 워드프레스가 여러사람들의 동시 다발적인 데이터베이스 호출로 인해 갑자기 메모리가 부족해진상태로

    렉이 걸리게된다면 서비스가 멈춰버리게됩니다.

    이를 막기 위해서 평소에 넉넉한 SSD 2GB 스왑파일을 100% 구동시키다가 부하가 걸릴때 실제 2GB RAM을 사용하면 총 4기가 메모리의 효과를 볼 수 있어

    오히려 이 방법이 성능을 더 극대화 시킬것으로 예상하였지만 100을 설정한다고 하여 스왑파일을 우선적으로 사용하진 않았습니다.

    vi /etc/sysctl.conf
    
    vm.swappiness = 100
    
    #스왑파일 사용빈도 (100에 가까울 수록 스왑파일을 최대한 사용하려고 함)
    
    vm.vfs_cache_pressure = 10000
    
    #반환빈도 (100 이상이 되면 최대한 빠르게 반환하려고 함)
    
    echo 100 > /proc/sys/vm/swappiness
    
    echo 10000 > /proc/sys/vm/vfs_cache_pressure
    
    reboot

    재부팅하고나면 swap 비중이 100으로 잡혀져있습니다.

    그리고 만족수준은 아니지만 스왑파일도 메모리의 어느도달 지점에 도착하니 자동으로 조금씩 늘어나더군요.

     

    이정도라도 부하는 어느정도 견딜것으로 보입니다.

     

    메모리 1기가 micro 타입과 메모리 2기가 small 타입 이렇게 비교해가면서 개인적으로 몇대를 운영하고 있는데

    현재는 스왑파일 빈도 설정값 100 으로 해놓고 만족하고 있습니다.

     

    인터넷 너무 맹신하지 않고 직접 실험해보고 결과를 찾는 방법으로 진행하는 중입니다.

     

    아 그리고! vfs_cache_pressure 값이 높을 수록 반환하려고 하는 정보가 있어 10000정도로 잡아놓았습니다.

     

    캐시는 빨리 빨리 반환시키고 메모리는 항상 여유있게 대규모 사람들을 준비해야하는것이 성능 극대화라고 생각합니다.

     

     

  • 아마존 aws ec2 swap 파일 추가

    아마존 aws ec2 swap 파일 추가

    아마존 AWS EC2인스턴스 사용중 메모리 부족 현상이 생겨 SSD를 이용하여 스왑파일을 만들었습니다.

    아마존에서 만드는 방법까지 친절하게 소개하고 있어 이부분을 바탕으로 만들어서 사용중입니다.

    현재는 메모리 부족이 사라진 상태이며 블록은 128MB대신 1MB로 수정하였습니다.

    스왑파일은 파일과 헤깔리지 않기 위해서 언더바 _ 를 파일명 앞에 지정하였습니다.

    아래 fallocate 또는 dd 명령어로 스왑파일을 만들 수 있습니다.

    sudo fallocate -l 10GB /_swapfile
    sudo dd if=/dev/zero of=/_swapfile bs=1M count=2048
    #권한 설정
    sudo chown root:root /_swapfile
    sudo chmod 600 /_swapfile
    
    #스왑 포맷 설정
    sudo mkswap /_swapfile
    
    #스왑 파일 등록
    sudo swapon /_swapfile
    sudo swapon -a

    위의 내용까지는 그대로 복사해서 붙여넣기 하면 자동으로 만들어지고 권한까지 배정받습니다.

    아래 내용은 vi 명령어로 마지막 줄에 스왑파일을 넣어주어 재부팅마다 자동으로 실행할 수 있습니다.

    sudo vi /etc/fstab
    /_swapfile swap swap defaults 0 0
    #(마지막에 추가)
    #또는 아래처럼 추가
    /_swapfile none swap sw 0 0

    최종적으로 메모리 상태를 확인해보고 재부팅하면 스왑파일이 생긴 것을 확인 할 수 있습니다.

    자동실행 하기 위한 스왑파일 명령어 넣는방법

    #rc.local 등록하여 부팅때 자동실행
    vi /etc/rc.local 
    swapon /_swapfile
    
    #crontab -e 등록하여 부팅때 자동실행
    crontab -e
    @reboot /sbin/swapon /_swapfile
    
    #fstab 등록하여 자동실행
    vi /etc/fstab
    /_swapfile swap swap auto 0 0
    
    #재부팅해야지만 적용됩니다.
    reboot 
    sudo swapon -s
    free -m

    스왑을 만들었다면 이제 스왑파일에 더 집중할수 있도록 만들어주어야합니다.

    스왑 비중 늘리는 방법 바로가기 (재부팅 하면서 에러 안나도록 해야합니다)

    참조: 아마존 스왑파일 설명 바로가기