| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 터미널
- catalina
- macos
- high sierra
- 애플
- IOS
- mojave
- Fedora
- 에어팟
- 시에라
- asahi linux
- 맥
- asahi
- 업데이트
- 3D 프린터
- 아이폰
- 컨트롤러
- 3D프린터
- beta
- 터치바
- tevo
- 버그
- sierra
- 맥북프로
- Mac
- Linux
- iOS 13
- Tarantula
- 모하비
- AirPods
- Today
- Total
elsa in mac
[Linux 초보 탈출] Linux Memory 관리 - zswap 에 대해 알아 봅시다. 본문

이 포스트는 Fedora Linux를 기준으로 작성되었습니다.
이번 포스트에서는 Linux에서 RAM Cache를 제공하는 Kernel 기능인 zswap에 대해 함께 알아보도록 하겠습니다.
Prologue
일반적으로 컴퓨터에서 애플리케이션을 실행하면 실행코드와 데이터 정보가 메모리로 상주하여 동작을 하게 됩니다. 바뀌 말하면 애플리케이션이 실행되기 위해서는 메모리를 사용해야 한다는 말입니다.
GUI 환경에서 Multitasking 이 기본인 오늘날에는 사용자의 workflow에 따라 매우 많은 프로그램들이 동시에 실행되어 사용되게 됩니다. 당연히 사용자가 실행한 이 모든 app 들은 제각각 자신들이 필요로 하는 만큼의 메모리를 사용하게 되므로, 컴퓨터의 가용한 메모리 용량은 점차 잠식되게 될 것입니다. 컴퓨터의 메모리 용량은 제한적이기 때문에 경우에 따라서는 메모리 용량보다 훨씬 많은 메모리 사용을 요구할 수도 있겠지요.
이렇게 애플리케이션의 메모리 사용량이 점점 증가하여 메모리의 한도를 초과하게 되면 컴퓨터는 애플리케이션을 더 이상 실행할 수 없는 상황이 되어 극단적인 판단을 하게 되는데, 시스템을 관장하는 중추적인 역할을 담당하는 Kernel 은 이러한 OOM(Out Of Memory)을 극복하기 위해 OOM Killer라는 메커니즘을 동작시켜, 메모리를 많이 사용하고 있는 프로세스를 강제로 종료하여 시스템 메모리 자원을 확보하게 됩니다. 시스템이 뻣어버리는 것보단 애플리케이션 하나를 종료시키는 것이 더 나은 선택이라고 보는 셈입니다.
메모리 부족에 대응하는 관리 기법
Disk Swap (디스크 스왑)
OOM killer 메커니즘이 극단적인 메모리 자원 확보 방법이라면, 예방적인 대응 전략도 있습니다. 즉, OOM이 발생하기 전에 평소에 사용빈도가 낮은 데이터 페이지나 수정되지 않은 파일 캐시(cache)를 디스크의 스왑 영역으로 이동시켜 RAM의 여유 공간을 확보하는 방법입니다. 우리는 이것을 Memory swap(스왑)이라고 하며, 가장 고전적인 방법입니다.
Cache라는 용어는 프랑스어의 cacher에서 유래한 것인데, "숨겨진 곳"이라는 뜻입니다. 컴퓨터 분야에서는 고속으로 데이터를 사용하기 위한 임시 저장소를 의미합니다. 컴퓨터에서는 데이터를 매우 다양한 저장장치에 저장합니다. CPU에 가까울수록 빠르게 데이터를 처리할 수 있지만, 그만큼 비싼 기술입니다. 반대로 CPU로부터 멀면 멀수록 속도는 느리지만 기술 비용은 저렴합니다. 오늘날 일반적인 컴퓨터는 L1, L2, L3 Cache라는 고속 메모리를 갖고 있습니다. 물론, 이들 cache memory는 대부분 CPU 칩 내부에 포함되어 있습니다.
CPU는 특정 메모리 주소에 접근하려 할 때, 만일 해당 데이터가 현재의 RAM에 없고 Swap 영역에 있다면 Page Fault가 발생하게 됩니다. 이 경우 Kernel 은 페이지 테이블을 참조하여 해당 페이지가 디스크의 swap 영역 어디에 있는지를 확인하게 되고, 해당 페이지를 다시 Memory로 불러와서 사용하게 됩니다. 만일 해당 페이지를 불러올 메모리 영역이 여전히 부족하다면, 다른 사용 빈도가 낮은 페이지를 swap 영역으로 보낸 후, 필요한 페이지를 불러오게 됩니다. 이렇게 메모리의 페이지를 디스크의 swap으로 보내는 것을 swap-out 이라고 하고, 반대로 필요해서 swap 영역에 보관되어 있던 데이터 페이지를 다시 메모리로 불러오는 것을 swap-in 이라고 합니다. 디스크 저장공간에 대한 이러한 I/O 는 메모리에 비해 매우 느리기 때문에 swap-in/out 이 발생할 경우 약간 버벅거리는 시스템 성능저하의 원인이 됩니다.
zram (지램)
Disk swap 은 일부 성능 저하를 감수하더라도 시스템의 안정성과 애플리케이션의 실행을 담보하는 방법입니다. 한 가지 고려를 해야 한다면 가급적 swap이 발생할 확률을 낮추어 전반적인 시스템 성능 저하의 발생 빈도를 줄이는 것이 좋겠죠. 그래서 나온 아이디어가 zram 입니다.
zram은 zero ram의 약자로 disk swap을 완전히 사용하지 않거나(zero) 최소화한다는 개념입니다. 원래 처음 개념이 나왔을 때는 compcache(compressed cache: 압축 케시)로 명명되었지만, kernel에 통합되면서 zram으로 변경되었습니다.
원래 이름 그대로 compress 즉, swap을 하는 대신, swap의 대상이 되는 메모리 페이지를 RAM 안에서 압축을 해 놓는다는 발상입니다. 메모리에서의 I/O(input/output, 입출력) 처리속도는 일반적인 디스크 저장장치와 비교할 수 없을 만큼 빠르기 때문에 압축 및 압축해제를 반복하더라도 디스크로 swap을 하는 것보다 훨씬 효율적이고 빠르게 처리할 수 있다는 것이 기본 아이디어입니다. 즉, zram은 swap을 대치하는 것이 아닌 swap을 보안하는 기술로 휴대폰 같은 모바일 기기나 임베디드 시스템 같이 NAND Flash Memory를 저장장치로 사용하는 기기가 등장하면서 나온 것입니다. NAND Flash Memory는 쓰기 작업에 취약하고 수명이 짧다는 단점이 있는데, 이런 환경에서 swap을 적용할 경우 기기의 수명단축 혹은 성능저하를 유발할 수 있었기 때문이었습니다.
zswap(지스왑)
명칭만 보면 zram + swap과 별반 다를 게 없는 기술처럼 보이지만, zram + disk swap을 사용하는 것과 zswap은 좀 다른 차이점이 있습니다. kernel 입장에서 볼 때 zram은 그 자체가 독립적인 장치입니다. 즉, RAM의 일부영역을 할당하여 Block Device를 생성하고, 이 Device를 swapon 명령을 이용하여 swap 영역으로 설정하는 방식입니다. 고전적인 swap을 Disk 장치를 사용함으로써 성능저하의 단점이 있다고 하니, "그럼 swap 장치를 RAM에 만들면 되겠네~"라는 개념입니다.
그러니까.. 시스템에 zram과 swap을 둘 다 활성화한 경우, 둘 다 swap 장치이이고 다만 swap의 우선순위만 일반적으로 zram이 disk swap 보다 우선되는 방식인 셈입니다. zram을 활성화한 경우, 메모리 부족상태가 발생 시, 우선 zram을 이용하여 메모리 상에서 데이터 페이지를 압축 보관합니다. 하지만, zram 마저도 가득 차게 되면, 그때 비로소 disk swap을 사용하게 됩니다. 즉, zram은 단순히 1차 swap의 역할인 셈입니다.
zswap은 compressed RAM Disk 장치가 아닌 compressed swap cache로 인식됩니다. zswap에서는 별도의 독립된 swap 장치를 만들지 않습니다. 디스크 swap 이 필요해지면 데이터 페이지를 swap으로 보내는 대신 마치 memory cache처럼 RAM에 할당된 자체 풀에 압축 저장합니다. 만일 swap cache 영역이 가득 찬 이후에도 여전히 swap 이 필요한 경우, 기 압축된 페이지를 디스크 swap으로 보내고 새롭게 swap 될 데이터 페이지를 압축하여 swap cache에 새롭게 등록하게 됩니다. swap 대상은 가장 사용빈도가 낮을 확률로 선택되기 때문에 가장 먼저 swap 된 데이터 페이지가 언제나 재 사용될 확률이 가장 낮은 것입니다. 따라서 zswap의 이러한 운영방식은 여전히 유효합니다.


zram + swap에서는 1차 swap, 2차 swap 장치의 개념이기 때문에, 우선 1차 swap 인 zram을 먼저 사용하고 zram이 가득 차면 zram은 그대로 놔두고 2차 swap인 디스크 swap을 보조적으로 사용하는 방식입니다. 즉, 사용빈도가 비교적 더 높은 가장 최근의 데이터 페이지가 오히려 더 느린 디스크 swap 장치에 저장될 수 있다는 단점이 있는 것입니다.
zswap을 설정 방법
자, 그러면 zswap을 설장하는 방법에 대해 알아봅니다.
우선, zswap을 사용하기 위해서는 kernel이 이를 지원해야 하는데, 최소조건은 kernel 3.11 이상이어야 합니다. 최근의 kernel은 6.xx 이므로 거의 대부분의 Linux에서는 이를 사용할 수 있습니다. 다만, 커널을 빌드할 때 CONFIG_ZSWAP, CONFIG_ZPOOL 옵션으로 빌드가 되어 있어야 합니다. 물론, 이 역시도 Kernel 기본 옵션으로 빌드되기 때문에 문제가 없을 것으로 판단됩니다.
마지막으로 확인해야 할 것은 kernel booting 옵션입니다. kernel의 부팅 옵션에 zswap과 관련된 kernel parameter가 명시되어 있어야 하는데, 이를 확인하는 방법은 아래와 같습니다.

/etc/default/grub (fedora Linux 기준) 파일을 보면, 위의 스샷과 같이 GRUB_CMDLINE_LINUX에 zswap.enabled=1 이라고 되어 있는 것을 확인할 수 있습니다. 이것이 zswap을 사용하겠다는 파라미터가 됩니다.
그 밖에 zswap과 관련된 몇 가지 parameter들을 설정할 수 있는데, zswap.compressor는 압축기법을 어떤 것을 사용할 것인가를 명시하는 것으로 zstd, lz4, lzo 에서 선택할 수 있습니다. lz4가 압축/해제가 가장 고속이자만 대신 압축률이 낮고 반대로 zstd는 속도와 압축의 균형감이 가장 좋습니다.
zswap.max_pool_percent 는 전체 물리적인 메모리 용량 중 zswap 캐시로 몇 %를 사용할 것인가를 명시하는 것입니다. 예를 들어, 물리적인 RAM이 8GB이고, max_pool_percent를 20으로 설정했다면 1.6GB(8 x 0.2)를 zswap 캐시로 사용하겠다는 의미가 됩니다. 이 것은 RAM에서 1.6GB를 reserved(예약) 하겠다는 의미가 아니며, 최대치라는 것도 상기할 필요가 있습니다. 즉, kernel이 판단했을 때, swap 이 필요하다고 했을 때, 대상 데이터 페이지를 압축하고 이를 zswap 캐시에 채우게 됩니다. 만일 swap이 더 많이 발생하여 1.6GB를 모두 채우게 되면, 앞서 설명한 대로 가장 먼저 채워진 페이지부터 disk swap으로 이동하게 됩니다. 이 경우 kernel은 압축을 해제하여 disk swap으로 보내게 됩니다. 만일 disk swap 까지 이동할 필요가 없을 경우에는 RAM 내부에서 압축/압축해제가 고속으로 이뤄지게 될 것입니다.
물론 zswap 캐시가 체위지만 그만큼 RAM에서 애플리케이션이 사용할 메모리의 양은 줄어들게 될 것입니다. 따라서, max_pool_percent 값을 너무 크게 하면, swap 이 발생할 경우 애플리케이션이 사용할 메모리가 그만큼 작아지는 단점이 발생할 수 있습니다. 반대로 이 값을 너무 작게 잡으면 zswap을 사용하면서 기대하게 되는 저속 disk swap으로의 swap-in/out이 빈번히 발생하여 성능저하가 나타날 수 있게 됩니다.
그럼 어느 정도의 percent로 정하는 것이 좋을까 ??
이것 또한 절대적인 수치는 없습니다. 이것은 사용자 컴퓨터의 메모리 용량의 크기에 따라 다를 수 있으며 사용하는 app의 종류나 동시에 얼마나 많은 app을 사용할지에 따라 달라질 수 있습니다. 다만 앞서 언급한 장/단점의 상황을 고려할 때 10% ~ 20% 정도가 권고됩니다. 8GB 라면 800MB ~ 1.6GB 정도가 되겠네요.. 만일 RAM이 16GB이지만, 평소에 웹서핑이나 터미널 몇 개 띄우는 수준이라면 zswap을 사용할 필요조차 없을 수도 있습니다.
zswap.zpool 은 메모리 할당에 대한 할당관리자를 지정하는 것입니다. zmalloc은 일반적으로 호율적이고 인정적인 성능을 제공하는 기본값입니다.
zswap.accept_threshold_percent 는 zwap이 새로운 페이지를 캐시에 저장할지의 여부를 경정하는 임계값으로 zswap의 캐시가 accept_threshold_percent 보다 낮을 경우에는 swap 데이터 페이지를 압축하여 캐시에 체우지만, 이 값보다 더 크게 되면 압축하여 zswap 캐시에 추가하지 않고 그대로 disk swap으로 보내게 됩니다.
이해가 어려울 수 있으니 예를 들어 봅니다.
accept_threshold_percent를 50으로 설정했다고 가정을 해 봅니다. zswap 캐시가 max_pool_percent로 지정한 크기의 50% 미민일 경우에는 무조건 압축하여 zswap 캐시에 저장합니다. 하지만, threshold_percent를 초과하게 되면(=max_pool_percent의 50%를 초과) 이때부터는 압축효율을 테스트한 후에 압축효율이 높을 경우에는 zswap 캐시에 계속 추가하지만, 압축효율이 높지 않다고 판단하면 zswap에 넣지 않고 그대로 disk swap으로 보내게 됩니다. (이 경우도 아직 zswap 캐시는 max_pool_percent에는 도달하지 않았을 수 있음). 그리고 마침내 zswap 캐시가 max_pool_percent에 도달하거나 초과할 경우 가장 오래된 압축 페이지를 압축을 해제하여 disk swap으로 보내게 됩니다.
배포판에 따라서는 zswap이 기본적으로 활성화되어 있을 수 있습니다. zswap이 설정되어 동작 중인지를 확인하는 방법은 터미널에서 cat /sys/module/zswap/parameters/enabled 를 읽었을 때 Y 가 출력되면 동작중인 것이고, N 이 출력되면 비 활성화 되어 있는 것입니다.

만일 zswap이 활성화 되어 있지않아서, 활성화를 해야 한다면, 위에서 본 봐와 같이 /etc/default/grub 파일을 수정한 후, grub.cfg를 업데이트 하기 위해 아래와 같이 명령내린 후 rebooting 하면 됩니다.

zswap을 사용해야 하나 ?
zswap을 사용할지 말지의 여부는 앞서 설명에서처럼 사용자 컴퓨터의 RAM 용량 대비 사용환경에 따라 달라질 수 있습니다. 컴퓨터 RAM이 64GB 이지만, 평소에 메모리를 많이 소모할만한 큰 app을 실행할 일이 없다면 zswap은 물론 disk swap 조차도 활성화할 필요가 없을 것입니다. Linux라면 기본적으로 부팅했을 때 KDE나 GNOME 같은 Desktop Edition을 사용한다고 가정하더라도 아무리 많이 잡아먹어봤자 4~5GB 수준일 것이기 때문입니다.
하지만, 8GB 혹은 그 미만에서 KDE나 GNOME 같은 DE를 사용한다면 zswap을 충분히 고려해야 합니다. 필자의 경우에도 8GB mac mini를 사용하고 있기 때문에 KDE나 GNOME 같은 DE는 당연히 사용하지 않고 있고, Wayland Compositor를 직접 만들어 사용하고 있습니다. 그래서 웹브라우저에 3~5개 정도의 tab을 띄우고 터미널 2개와 GUI widget 3~4 개 정도를 띄우고 사용하는데 대략 2.5GB 정도의 여유가 있을 수준입니다. 물론 zswap을 필수로 사용해야 합니다. ^^
반대로 RAM이 16GB 라도 동영상 편집 app이나 image 관리 app, 혹은 고용량 게임, 혹은 LLM 같은 AI를 로컬로 돌리는 경우에는 RAM이 부족해질 수도 있습니다. 만일 게임 같이 규모가 큰 app을 실행했을 때 OOM이 발생해서 app이 강제 종료되거나 시스템이 불안해지는 경험을 했다면 이를 고려해야 합니다.
'Linux > Linux 팁' 카테고리의 다른 글
| Linux에서 yazi를 사용할 때 zip 파일을 압축해제 하지 못하는 문제의 원인과 대처법 (0) | 2025.12.07 |
|---|---|
| [Linux 초보 탈출] 리눅스 파일 시스템에 대해 알아 봅시다. (0) | 2025.07.24 |
| [Linux 초보 탈출] 쉘(shell)에서 명령어의 입출력을 제어하는 pipe 그리고 redirection (0) | 2025.07.22 |
| [Linux 초보 탈출] DNF (package manager)에 대해 알아 봅시다. (0) | 2025.07.20 |
| [Linux 초보 탈출] systemd의 timer 유닛을 이용하여 주기적인 작업을 자동화 하자 (0) | 2025.07.19 |