리눅스 zram 설정 하기 (zram-tools)
안녕하세요?
리눅스로 홈서버를 운영하면서 겪고 있던 문제가 있었습니다.
이전에 아래 자동화를 잘못 작성하여 램 무한증식? 현상을 만났었는데요.
https://cafe.naver.com/koreassistant/11228
그러나 그간 한 4개월 된것 같은데, 일정 시간이 지나면 esphome 과 http소켓이 끊겨서 복구가 되지 않거나 HA 의 웹 UI가 열리지 않는 등의 문제가 발생했습니다.
이 문제는 해결이 어려워서 ... 아무리 로그를 검토해봐도 해결이 어려운 문제였습니다.
1. 램 부족 현상
일단은 이 증상이 램 부족 증상에서 오는 것이라고 판단했습니다.
4개월 정도 전에 다른 서비스를 하나 개발하여 홈서버에 구동하기 시작했기 때문입니다.
그래서 ssd 에 기본 4GB 스왑을 하고 HDD에 파티션을 하나 추가하여 32기가 스왑을 추가했습니다.
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors Disk model: EADS-00R6B0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xd359cc0e Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 3839920303 3839918256 1.8T 83 Linux /dev/sdb2 3839922176 3907029167 67106992 32G 83 Linux |
그러나 몇시간이 지나면 HA가 죽는것은 동일 하였습니다.
2. 분석
분석해보니 SSD까지는 괜찮았지만 HDD에 스왑이 되기 시작하면 HDD에 메모리 데이터가 스왑아웃되고 메모리로 다시 스왑인이 되는데에 시간이 많이 걸리는 것 같았습니다.
그러면 SSD에 스왑하는 용량을 더 늘리면 되지 않는지? 이렇게 생각을 해볼 수도 있겠습니다.
그런데 SSD에 스왑해도 성능 저하는 매한가지라서 램을 현재 8GB 사용하고 있는데 16GB로 올리는 이상 해결이 어려웠습니다.
swappiness 값을 10으로 낮춰서 최대한 램에 있고 디스크로 스왑을 하지 않도록 설정했음에도 원체 메모리가 부족하다 보니 스왑이 되는 것은 막을 수가 없었습니다.
3. zram 도입
그래서 일단은 램 압축을 도입해보기로 했습니다. (이전에는 compacache로 불리던 것입니다.)
아예 디스크 스왑을 주지 않았을 때 아래 7.42GB 중에서 6기가 정도로 사용율이 나오는 상태였습니다.
zram 은 쉽게 아래 명령으로 설치가 가능합니다.
root@debian:~# apt install zram-tools Reading package lists... Done Building dependency tree Reading state information... Done zram-tools is already the newest version (0.3.2.1-1). 0 upgraded, 0 newly installed, 0 to remove and 50 not upgraded. |
설정을 위해서 아래 파일을 수정합니다. 램의 80프로를 zram 으로 할당하도록 설정하는 것입니다.
root@debian:~# vi /etc/default/zramswap PERCENTAGE=80 |
전체 DDR 사이즈에 얼만큼 해야하는지는 정확한 데이터가 없습니다. 특히 미디어 스트리밍 서버의 경우 램 압축을 해도 거의 압축이 되지 않기 때문에 zram을 많이 쓰면 쓸 수록 성능에 손해가 생기는 특성을 가지고 있고, db 서버의 경우 조금 높게 설정하는것이 좋다고 나와 있습니다.
그리고 서비스를 재시작 합니다.
root@debian:~# systemctl restart zramswap.service |
한편, zram을 통해 스왑하기 때문에 swappiness 값은 100으로 설정하였습니다.
root@debian:~# vi /etc/sysctl.conf vm.swappiness = 100 root@debian:~# sysctl --system |
4. zram 상태 확인
아래와 같이 조회가 가능합니다.
코어별로 생기며 메모리의 총합 에서 80프로의 / 4 만큼이 코어에 할당됩니다.
코어수 만큼 zram 이 생성됩니다.
root@debian:~# zramctl NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram3 lzo-rle 1.5G 1.1G 315.5M 331.6M 4 [SWAP] /dev/zram2 lzo-rle 1.5G 1G 306.7M 322.2M 4 [SWAP] /dev/zram1 lzo-rle 1.5G 1.1G 315.6M 331.8M 4 [SWAP] /dev/zram0 lzo-rle 1.5G 1G 310M 325.4M 4 [SWAP] |
시간이 얼마 지난 후, 현재 free 정보는 아래와 같습니다.
root@debian:~# free -h total used free shared buff/cache available Mem: 7.4Gi 4.1Gi 319Mi 60Mi 3.0Gi 2.9Gi Swap: 5.9Gi 4.2Gi 1.7Gi |
이전과 다르게 디스크 스왑을 하지 않고도 램이 많이 여유가 있습니다.
5. 결과
디스크에 스왑하지 않고도 램 압축만을 통해, 어느정도 부족한 메모리 여유를 확보할 수 있습니다.
대략 일주일이 지났는데 이전처럼 HA가 응답이 없는 증상 없고, esphome 과 연결이 끊기는 문제도 없어졌네요.
물론 물리 메모리 사이즈를 늘리는게 좋겠지만 J5005 는 8기가 지원이 맥스라서 늘이기가 조금 어려워 보입니다.
다이 사이즈가 각 1GB인 8기가 메모리를 사용하면 16기가까지 확장이 가능하다고 하는데 모험을 하기가 조금 그렇네요.
램 압축을 하지 않을때보다 시스템 응답성은 조금 떨어지겠지만, 디스크에 스왑하는것 보다는 나은 상황입니다.
이전에는 램이 부족해서 디스크에 스왑이 되기 시작하면 bash 쉘에 명령을 넣거나 자동완성자체가 프리징이 걸리는 증상도 있었습니다.
간단히 마치겠습니다.
감사합니다.