| 검색 | ?
대문 / 설치 및 구축 / ZRAM (압축메모리) 를 이용한 SWAP 확보 방법

ZRAM (압축메모리) 를 이용한 SWAP 확보 방법

1.1. 개요

제한적인 물리적 메모리를 응답성 및 가용성을 최대한 해치지 않고 최대의 활용 방법으로 swap을 압축 메모리로 활용하는 방법을 설명합니다. 부족한 메모리는 곧 서비스 중지라는 사태(oom kill)를 야기하므로 적어도 이 방법은 그에 대한 방어책을 구사할 수 있습니다.

ZRAM 이란?
  • 일종의 swap 이지만 Disk I/O 를 일으키지 않고 일정 조건에 의해서 swap 할 메모리를 우선 압축하도록 하는 기능.
  • 메모리상에 존재하는 데이터들은 상당히 압축률이 높은 특성을 갖는다는 전재를 깔고 도입되는 사항이며
  • 압축 알고리즘은 빠르다고 알려진 LZO (zip 에서 사용하는) 등을 많이 사용.
  • 이게 생각보다 메모리를 많이 아낄 수 있고 성능손실이 크지 않다고 알려져 있어서 대부분의 임베디드 시스템에는 (특히 NAS, 안드로이드) 많이 도입되는 기능입니다.
  • 메모리가 작은 모델의 NAS 또는 안드로이드 스마트폰 H/W spec 을 갖는다 하여도 유명 벤더사의 제품들이 더 빠릿한 느낌을 주는 것은 이 기능이 큰 영향을 갖기 때문입니다.

1.2. ZRAM 활성화 방법

  1. Kernel 의 "make menuconfig" 에서 다음의 항목을 활성화(y) 해주고 빌드하여 커널 이미지를 반영
    • "Device Drivers" -> "Staging drivers" -> "Compressed RAM block device support"
    • "Device Drivers" -> "Staging drivers" -> "Dynamic compression of swap pages and clean pagecache pages"
    • "Device Drivers" -> "Staging drivers" -> "Memory allocator for compressed pages"
  2. 부팅 스크립트 초기에 다음과 같은 맥락의 swap 활성화 명령이 실행되도록 합니다.
    • => 주1) mknod 에서 major 번호는 커널에 따라 다를 수 있음. 때문에 "cat /proc/devices" 에서 zram 으로 표기되는 block device 의 major 번호를 확인하는게 필수입니다.
      • 위 예제 명령에서 major 번호를 251로 하였으나 이는 시스템에 따라서 다를 수 있음에 유의하시고 그에 맞도록 major 번호를 사용하세요.
    • => 주2) zram0 의 크기 결정은 통상 전체 물리 메모리의 20%~80% 정도 잡는것을 기준으로 자신의 시스템에 따른 특성을 고려하여 잡으세요.
    • => 주3) swapon 의 -p 옵션으로 지정하는 우선순위는 큰 값이 우선 사용됩니다.
    • => 주4) /dev/zram0 는 ramdisk가 사용하는 /dev/ram0 와 흡사한 block device 의 일종으로 압축유지상태라는 것뿐이며 ramdisk영역과 매우 흡사한 동작특성을 갖습니다.
  3. 재부팅하면 다음 명령으로 ZRAM 이 swap 으로 잡혀있는지 확인 가능합니다.
  4. 그 밖에...
    • Ubuntu 배포판 사용자의 경우 (하기와 같이 설치 및 활성화만하면 적당한 ZRAM이 기본적으로 활성화 됩니다. 추가적인 조치 필요 없음.)
      $ sudo apt install zram-config
      ...
      $ sudo systemctl enable zram-config.service
      ...
      $ sudo systemctl start zram-config.service
      ...
      
      => 라즈베리파이에서 Ubuntu 사용중인 경우 다음과 같이 추가 모듈을 설치해야 합니다.
      $ sudo apt install linux-modules-extra-raspi
      
    • sysctl 의 "vm.swappiness" 값을 조정하여 swap 비율을 결정할 수 있습니다.
      • 기본값은 60
        • 이 경우 메모리 사용률이 80% 를 넘어섰을 때부터 swap되는 조건이 됨.
          swap_tendency = mapped_ratio / 2 + distress + swappiness
                        = mapped_ratio / 2 + (100 / (2 ^ priority)) + swappiness
                        = 80% / 2 + (100 / 2 ^ (12 ~ 0)) + 60
                        = 80% / 2 + (0 ~ 100) + 60
                        = 40 + (0 ~ 100) + 60
                        = 100 ~ 200
          
      • 80 으로 설정하는 경우
        • 이 경우 메모리 사용률이 40% 를 넘어섰을 때부터 swap되는 조건이 됨.
          swap_tendency = mapped_ratio / 2 + distress + swappiness
                        = mapped_ratio / 2 + (100 / (2 ^ priority)) + swappiness
                        = 40% / 2 + (100 / 2 ^ (12 ~ 0)) + 80
                        = 40% / 2 + (0 ~ 100) + 80
                        = 20 + (0 ~ 100) + 80
                        = 100 ~ 200
          
      • 90 으로 설정하는 경우
        • 이 경우 메모리 사용률이 20% 를 넘어섰을 때부터 swap되는 조건이 됨.
          swap_tendency = mapped_ratio / 2 + distress + swappiness
                        = mapped_ratio / 2 + (100 / (2 ^ priority)) + swappiness
                        = 20% / 2 + (100 / 2 ^ (12 ~ 0)) + 90
                        = 20% / 2 + (0 ~ 100) + 90
                        = 10 + (0 ~ 100) + 90
                        = 100 ~ 200
          
      • 일부 검색정보에서 10~20 정도가 적당하다는 의견 있음. (이것은 상황에 따라서 판단해야 하므로 참고만. 사실상 50 이하는 무의미하다고 보임. 50~100 사이에서 결정하는게 맞다고 보임.)
        • 참고로 필자는 swap을 사용하지 않을 때 평시 메모리 사용률이 80%를 넘는 장비들은 55를 사용하고 그 외에는 60 기본 값을 그대로 사용 중.
        • Kernel 에서 Critical 한 할당 (GFP_ATOMIC 등) 을 대량으로 수행하는 환경인 경우 50 이하로 설정하는 것은 바람직하지 못함. 하지만 GFP_ATOMIC 등의 커널 할당이 많지 않는 경우는 최대한 swap을 보류하는 차원에서 의미 있을 수 있음.
        • 50 이하로 설정한다는 것은 priority 가 12에서 0으로 줄어드는 단계에서 swap 조건이 발생하게 됨.
        • distress 는 "distress = 100 / (2 ^ priority)"와 같이 계산되며 swap_tendency 가 100이하로 떨어질때까지 priority 가 12에서 0으로 줄어들면서 distress가 0부터 100까지 단계적으로 재시도하게 됨.
      • 적은 값으로 설정할 수록 swap의 기회가 줄어들고 큰 값으로 설정할 수록 swap의 기회가 늘어남.
      • [http]참고링크 - 리눅스 스왑 메모리 사용 제어[]
    • 다음과 같이 script 를 만들어 swap 을 활성/비활성하도록 구현할 수 있습니다.

1.3. 참고자료



Copyright ⓒ MINZKN.COM
All Rights Reserved.