zswap은 가상 메모리 압축의 한 형식으로 스왑된 페이지에 대한 압축된 쓰기-백 캐시를 제공하는 리눅스 커널 기능입니다. 메모리 페이지가 스왑 아웃될 때 그것들을 스왑 장치로 이동하는 대신, zswap은 그것들의 압축을 수행하고 그런-다음 시스템 RAM에 동적으로 할당된 메모리 풀에 저장합니다. 나중에 실제 스왑 장치로의 쓰기-백은 연기되거나 심지어 완전히 회피되어, 스왑이 필요한 리눅스 시스템에 대한 I/O가 상당히 감소합니다; 그러나 압축을 수행하기 위해 추가 CPU 사이클이 필요하다는 단점이 있습니다.
I/O가 감소함에 따라, zswap은 임베디드 장치, 넷북 및 유사한 로우엔드 하드웨어 장치를 포함하여, 마찬가지로 플래시-기반 스토리지를 사용하는 다양한 장치와 스토리지에 대해 솔리드-스테이트 드라이브 (SSD)를 사용하는 다른 장치에도 이점을 제공합니다. 플래시 메모리는 특성상 수명이 제한되어 있으므로, 스왑 공간을 제공하는 데 사용하지 않으면 빠르게 마모되는 것을 방지할 수 있습니다.
Internals
zswap은 frontswap에 의해 제공되는 API를 사용하여 리눅스 커널의 가상 메모리 하위 시스템의 나머지에 통합되며, 이는 스왑 공간으로 사용될 수 있는 다양한 유형의 스토리지를 추상화하는 리눅스 커널의 메커니즘입니다. 결과로써, zswap은 내부적으로 유사-RAM 장치로 표시되는 것을 제공함으로써 frontswap에 대해 백엔드 드라이버로 작동합니다. 다시 말해, frontswap API는 zswap이 스왑되는 동안 메모리 페이지를 가로채고. 이미 스왑된 페이지에 대해 페이지 폴트를 가로채는 기능을 할 수 있도록 합니다; 그들 두 경로로의 접근을 통해 zswap은 스왑된 페이지에 대한 압축된 쓰기-백 캐시 역할을 할 수 있습니다.
내부적으로, zswap은 리눅스 커널의 crypto API에 의해 제공되는 압축 모듈을 사용하며, 이를 통해 예를 들어 리눅스 커널에 의해 지원되는 하드웨어 압축 가속기의 어떤 것을 사용하여 주 CPU에서 압축 작업을 오프로드할 수 있습니다. 원하는 압축 모듈 선택은 커널 부트 매개변수 zswap.compressor의 값을 통해 부팅 시 동적으로 수행될 수 있습니다; 지정하지 않으면, 그것은 Lempel–Ziv–Oberhumer (LZO) 압축을 선택합니다. 리눅스 커널 버전 3.13부터, zswap도 커널 부트 매개변수 zswap.enabled에 값 1을 지정함으로써 명시적으로 활성화되어야 합니다.
zswap에 의해 사용되는 메모리 풀의 최대 크기는 sysfs 매개변수 max_pool_percent를 통해 구성될 수 있으며, 이는 풀에 의해 차지될 수 있는 전체 시스템 RAM의 최대 백분율을 지정합니다. 메모리 풀은 구성된 최대 크기에 미리 할당되지 않고, 대신 필요에 따라 늘어나거나 줄어듭니다. 수행된 스와핑의 결과로 구성된 최대 풀 크기에 도달하거나, 메모리-부족 조건으로 인해 풀을 늘릴 수 없을 때, 스와핑된 페이지는 가장 최근에 사용된 (LRU) 기준으로 메모리 풀에서 스와핑 장치로 강제로 제거됩니다. 이 접근 방식을 사용하면 zswap이 진정한 스와핑 캐시가 되며, 캐시가 가득 차면 가장 오래된 캐시된 페이지가 스와핑 장치로 강제로 제거되어, 새로운 스와핑된 페이지를 압축하고 캐시할 수 있는 공간이 생깁니다.
zbud는 zswap에 의해 내부적으로 압축된 페이지를 저장하기 위해 사용되는 특수-목적 메모리 할당기로, 리눅스 커널을 위한 또 다른 가상 메모리 압축 구현인 Oracle의 zcache에 의해 사용되는 zbud 할당기를 다시 작성하여 구현되었습니다. 내부적으로, zbud는 물리적 메모리 페이지당 많아야 2개의 압축된 페이지 ("buddies", 따라서 할당기 이름)를 저장함으로써 작동하며, 이는 해제된 공간을 쉽게 병합하고 재사용할 수 있다는 이점과 메모리 사용률이 낮아질 수 있다는 단점을 모두 제공합니다. 어쨌든, 설계상의 이유로, zbud는 원래 압축되지 않은 페이지가 차지할 수 있는 것보다 더 많은 메모리 공간을 할당할 수 없습니다.
History
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에 대한 쓰기-백 비활성화를 지원합니다.
Alternatives
zswap의 대안 중 하나는 zram이며, 이는 리눅스 커널에 유사하지만 여전히 다른 "압축된 페이지를 RAM으로 스왑" 메커니즘을 제공합니다.
가장 큰 차이점은 zram은 RAM을 사용하여 데이터를 저장하는 압축 블록 장치를 제공하며, 이는 정규적이고 별도의 스왑 장치 역할을 한다는 것입니다.
비교해 보면, zswap은 스왑 장치에 대한 RAM-기반 캐시 역할을 합니다. 이는 zswap에 덜 사용되는 스왑 페이지에 대한 제거 메커니즘을 제공하며, zram은 커널 버전 4.14에서 CONFIG_ZRAM_WRITEBACK이 도입되기 전까지 이 메커니즘이 없었습니다. 하지만, 설계의 결과로 zswap을 사용하려면 최소한 하나의 기존 스왑 장치가 필요합니다.
See also
References
- Seth Jennings (February 12, 2013). "The zswap compressed swap cache". LWN.net. Retrieved January 22, 2014.
- Jenifer Hopper (December 11, 2012). "New Linux zswap compression functionality". IBM. Retrieved January 31, 2014.
- Michael Larabel (July 11, 2013). "Zswap Merged Into The Linux 3.11 Kernel". Phoronix. Retrieved February 5, 2014.
- "Linux kernel documentation: Documentation/vm/zswap.txt". kernel.org. November 22, 2013. Retrieved January 22, 2014.
- Dan Magenheimer (April 22, 2010). "Frontswap [PATCH 0/4] (was Transcendent Memory): Overview". gmane.org. Retrieved December 23, 2014.
- Jonathan Corbet (May 4, 2010). "Cleancache and Frontswap". LWN.net. Retrieved March 26, 2014.
- "Linux kernel source tree: kernel/git/torvalds/linux.git: zswap: add to mm/". kernel.org. July 11, 2013. Retrieved February 5, 2014.
- Dan Magenheimer (March 29, 2012). "Zcache and RAMster (oh, and frontswap too): Overview and some benchmarking" (PDF). oss.oracle.com. p. 12. Retrieved August 19, 2015.
- "Linux kernel source tree: kernel/git/torvalds/linux.git: zbud: add to mm/". kernel.org. July 11, 2013. Retrieved February 5, 2014.
- "[PATCH 0/8] zswap: compressed swap caching". gmane.org. December 11, 2012. Retrieved January 5, 2014.
- "[PATCHv10 0/4] zswap: compressed swap caching". gmane.org. May 8, 2013. Retrieved January 5, 2014.
- "Linux kernel 3.11, Section 9. Zswap: A compressed swap cache". kernelnewbies.org. September 2, 2013. Retrieved January 22, 2014.
- "Linux kernel 3.15, Section 4. Memory management". kernelnewbies.org. June 8, 2014. Retrieved June 15, 2014.
- "Linux kernel source tree: kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices". kernel.org. April 7, 2014. Retrieved June 15, 2014.
- "zswap: memcontrol: implement zswap writeback disabling · torvalds/linux@501a06f". GitHub.
- Dan Magenheimer (April 3, 2013). "In-kernel memory compression". LWN.net. Retrieved March 8, 2014.