Zswap

zswap
개발자세스 제닝스 외
발표일2013년 9월 2일(13년 전)(2013-09-02) (Linux 3.11)
프로그래밍 언어C
운영 체제리눅스
종류리눅스 커널 기능
라이선스GNU GPL
웹사이트kernel.org

zswap은 가상 메모리 압축의 한 형태로, 스와프된 페이지를 위한 압축된 쓰기 저장(write-back) 캐시를 제공하는 리눅스 커널 기능이다. 메모리 페이지가 스와프 아웃될 때 스와프 장치로 이동하는 대신, zswap은 해당 페이지를 압축한 다음 시스템 RAM에 동적으로 할당된 메모리 풀에 저장한다. 실제 스와프 장치로의 쓰기 저장은 지연되거나 완전히 회피되어, 스와핑이 필요한 리눅스 시스템의 I/O를 크게 줄인다. 대신 압축을 수행하기 위해 추가적인 CPU 사이클이 필요하다.

I/O 감소의 결과로, zswap은 임베디드 장치, 넷북 및 유사한 저가형 하드웨어 장치를 포함한 다양한 플래시 메모리 기반 저장 장치를 사용하는 장치뿐만 아니라, SSD를 저장 장치로 사용하는 다른 장치에도 이점을 제공한다. 플래시 메모리는 쓰기 증폭으로 인해 수명이 제한적이므로, 이를 스와프 공간으로 사용하는 것을 피하면 빠르게 마모되는 것을 방지할 수 있다.

내부 동작

zswap은 스와프 공간으로 사용될 수 있는 다양한 유형의 스토리지를 추상화하는 리눅스 커널 메커니즘인 frontswap이 제공하는 API를 사용하여 리눅스 커널의 나머지 가상 메모리 서브시스템에 통합된다. 결과적으로 zswap은 내부적으로 유사-RAM 장치로 보이는 것을 제공하여 frontswap의 백엔드 드라이버로 작동한다. 즉, frontswap API는 zswap이 메모리 페이지가 스와프 아웃될 때 이를 가로채고, 이미 스와프된 페이지에 대한 페이지 부재를 가로챌 수 있게 한다. 이 두 경로에 대한 접근은 zswap이 스와프된 페이지를 위한 압축된 쓰기 저장 캐시 역할을 할 수 있도록 한다.

내부적으로 zswap은 리눅스 커널의 크립토 API가 제공하는 압축 적재 가능 커널 모듈을 사용한다. 이를 통해 예를 들어, 리눅스 커널이 지원하는 모든 하드웨어 압축 가속기를 사용하여 주 CPU에서 압축 작업을 오프로드할 수 있다. 원하는 압축 모듈 선택은 커널 부트 매개변수 zswap.compressor 값을 통해 부팅 시 동적으로 수행할 수 있다. 지정하지 않으면 Lempel–Ziv–Oberhumer (LZO) 압축이 선택된다. 리눅스 커널 버전 3.13부터는 커널 부트 매개변수 zswap.enabled에 값 1을 지정하여 zswap을 명시적으로 활성화해야 한다. 그러나 CONFIG_ZSWAP_DEFAULT_ON=y로 커널을 구성할 때 기본적으로 활성화되거나, sysfs 인터페이스를 통해 언제든지 활성화할 수 있다.

echo 1 > /sys/module/zswap/parameters/enabled

zswap이 사용하는 메모리 풀의 최대 크기는 max_pool_percent sysfs 매개변수를 통해 구성할 수 있다. 이 매개변수는 풀이 차지할 수 있는 전체 시스템 RAM의 최대 비율을 지정한다. 메모리 풀은 구성된 최대 크기로 미리 할당되지 않고, 필요에 따라 증가하고 축소된다. 스와핑 결과로 구성된 최대 풀 크기에 도달하거나 메모리 부족 조건으로 인해 풀을 확장할 수 없을 때, 스와프된 페이지는 캐시 축출 기반으로 LRU 방식으로 메모리 풀에서 스와프 장치로 축출된다. 이 접근 방식은 zswap을 진정한 스와프 캐시로 만든다. 캐시가 가득 차면 가장 오래된 캐시된 페이지가 스와프 장치로 축출되어 새로운 스와프 페이지가 압축되고 캐시될 공간을 만든다.

zbud은 zswap이 압축된 페이지를 저장하기 위해 내부적으로 사용하는 특수 목적의 메모리 할당자이다. 이는 오라클의 zcache에서 사용되는 zbud 할당자를 재작성하여 구현되었다. zcache는 리눅스 커널을 위한 또 다른 가상 메모리 압축 구현이다. 내부적으로 zbud는 물리적 메모리 페이지당 최대 두 개의 압축된 페이지("버디", 따라서 할당자 이름)를 저장하여, 해제된 공간의 쉬운 통합 및 재사용으로 인한 이점과 낮은 메모리 활용 가능성으로 인한 단점을 모두 가져온다. 그러나 설계 결과로 zbud는 원래 압축되지 않은 페이지가 차지했을 것보다 더 많은 메모리 공간을 할당할 수 없다.

역사

zswap과 zbud는 모두 세스 제닝스(Seth Jennings)가 만들었다. 첫 공개 발표는 2012년 12월이었고, 개발은 2013년 5월까지 계속되어 코드베이스가 실험적 커널 기능 상태였음에도 불구하고 성숙 단계에 도달했다.

zswap (zbud와 함께)은 2013년 9월 2일에 출시된 커널 버전 3.11에서 리눅스 커널 메인라인에 병합되었다.

2014년 6월 8일에 출시된 리눅스 커널 버전 3.15부터 zswap은 여러 스와프 장치를 제대로 지원한다.

2024년 3월 11일에 출시된 리눅스 커널 버전 6.8부터 zswap은 특정 cgroup에 대한 쓰기 저장을 비활성화하는 것을 지원한다.

대안

zswap의 대안 중 하나는 zram으로, 리눅스 커널에 유사하지만 여전히 다른 "RAM에 압축된 페이지 스와프" 메커니즘을 제공한다.

주요 차이점은 zram이 데이터를 저장하기 위해 RAM을 사용하여 압축된 블록 장치를 제공한다는 점이다. 이는 일반적이고 별개의 스와프 장치 역할을 한다.

이에 비해 zswap은 스와프 장치를 위한 RAM 기반 캐시 역할을 한다. 이는 zswap에 덜 사용된 스와프 페이지에 대한 캐시 축출 메커니즘을 제공하는데, zram은 커널 버전 4.14에서 CONFIG_ZRAM_WRITEBACK이 도입되기 전까지는 이 기능이 없었다. 하지만 설계상 zswap을 사용하려면 이미 존재하는 스와프 장치가 적어도 하나 필요하다.

같이 보기

각주

  1. 1 2 3 4 Seth Jennings (2013년 2월 12일). “The zswap compressed swap cache”. LWN.net. 2014년 1월 22일에 확인함.
  2. 1 2 Jenifer Hopper (2012년 12월 11일). “New Linux zswap compression functionality”. IBM. 2014년 1월 31일에 확인함.
  3. 1 2 Michael Larabel (2013년 7월 11일). “Zswap Merged Into The Linux 3.11 Kernel”. Phoronix. 2014년 2월 5일에 확인함.
  4. 1 2 3 4 “Linux kernel documentation: Documentation/vm/zswap.txt”. kernel.org. 2013년 11월 22일. 2014년 1월 22일에 확인함.
  5. ↑ Dan Magenheimer (2010년 4월 22일). “Frontswap [PATCH 0/4] (was Transcendent Memory): Overview”. 《gmane.org》. 2014년 12월 23일에 확인함.
  6. ↑ Jonathan Corbet (2010년 5월 4일). “Cleancache and Frontswap”. LWN.net. 2014년 3월 26일에 확인함.
  7. ↑ “zswap”. kernel.org. 2025년 8월 25일에 확인함.
  8. ↑ “Linux kernel source tree: kernel/git/torvalds/linux.git: zswap: add to mm/”. kernel.org. 2013년 7월 11일. 2014년 2월 5일에 확인함.
  9. ↑ Dan Magenheimer (2012년 3월 29일). “Zcache and RAMster (oh, and frontswap too): Overview and some benchmarking” (PDF). 《oss.oracle.com》. 12쪽. 2015년 8월 19일에 확인함.
  10. ↑ “Linux kernel source tree: kernel/git/torvalds/linux.git: zbud: add to mm/”. kernel.org. 2013년 7월 11일. 2014년 2월 5일에 확인함.
  11. ↑ “[PATCH 0/8] zswap: compressed swap caching”. 《gmane.org》. 2012년 12월 11일. 2014년 1월 5일에 확인함.
  12. ↑ “[PATCHv10 0/4] zswap: compressed swap caching”. 《gmane.org》. 2013년 5월 8일. 2014년 1월 5일에 확인함.
  13. ↑ “Linux kernel 3.11, Section 9. Zswap: A compressed swap cache”. 《kernelnewbies.org》. 2013년 9월 2일. 2014년 1월 22일에 확인함.
  14. ↑ “Linux kernel 3.15, Section 4. Memory management”. 《kernelnewbies.org》. 2014년 6월 8일. 2014년 6월 15일에 확인함.
  15. ↑ “Linux kernel source tree: kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices”. kernel.org. 2014년 4월 7일. 2014년 6월 15일에 확인함.
  16. ↑ “zswap: memcontrol: implement zswap writeback disabling · torvalds/linux@501a06f”. 《GitHub》.
  17. ↑ Dan Magenheimer (2013년 4월 3일). “In-kernel memory compression”. LWN.net. 2014년 3월 8일에 확인함.