Implementasi zRAM dan zswap di Sistem Operasi Linux

Sabtu, 20 Maret 2021

zRAM dan zswap, keduanya merupakan fitur kernel Linux yang berfungsi sebagai compressed-pages di dalam RAM yang sangat berguna untuk low-end hardware seperti embedded device, netbook, dll. Perbedaannya adalah zram sama sekali tidak memerlukan swap-device berbasis disk sehingga hanya menggunakan block-device berbasis RAM, sedangkan zswap bekerja bersama dengan swap-device yang ada dengan cara kerja yang cerdik.


zRAM

ZRAM atau dulu dikenal sebagai compcache adalah fitur kernel Linux dan merupakan alat userspace yang digunakan untuk membuat block-device berbasis RAM seperti ramdisk akan tetapi dapat dikompresi pada saat itu juga atau secara realtime. Kemudian block-device tersebut dapat digunakan sebagai swap-device atau ramdisk. Kegunaan paling populer adalah sebagai swap-device untuk memperluas ruang RAM yang tersedia untuk proses. Ini sangat berguna untuk  mengurangi siklus R/W pada SSD bagi perangkat komputer yang menggunakan single-storage atau tanpa swap-device dan yang menggunakan RAM berkapasitas terbatas.

Ruang RAM yang digunakan untuk block-device diperoleh secara dinamis dan dilepaskan hingga ukuran maksimum terkompresi yang telah ditentukan sebelumnya. Cara memperluas jumlah RAM yang tersedia ke sistem adalah dengan menggunakan sebagian RAM sebagai ruang swap terkompresi. Oleh karena itu, ia dapat menampung lebih banyak memory-pages dalam ruang swap yang terkompresi daripada jumlah memori aktual (fisik) yang digunakan.


Mengenai rasio kompresi, biasanya 3:1. Misalnya untuk swap dari zram berukuran 1 GiB rata-rata hanya menggunakan 333 MiB dari ruang RAM yang sebenarnya. Swap-device tersebut juga jauh lebih cepat daripada swap-device berbasis disk seperti partisi swap atau swapfile. Tentunya juga lebih banyak menggunakan CPU yang bergantung pada spesifikasi CPU yang digunakan.

zRAM diperkenalkan ke kernel Linux versi 3.14 - 30 Maret 2014

Mengaktifkan dan menggunakan zRAM

Kernel Module
Pertama, mengaktifkan module kernel zram.
๐Ÿ—Ž /etc/modules-load.d/zram.conf
zram

Block-device configuration
Kedua, konfigurasi jumlah block-device zram yang akan digunakan.
๐Ÿ—Ž /etc/modprobe.d/zram.conf
options zram num_devices=X
Screenshot diatas adalah contoh untuk menggunakan 3 block-device zram yang akan dijelaskan pada langkah selanjutnya.

Udev Rules
Ketiga adalah aturan udev untuk membuat block-device zram. Jalankan perintah dibawah ini sebagai root.
$ sudo su
cat > /etc/udev/rules.d/10-zram.rules << EOF
KERNEL=="zram0", ATTR{comp_algorithm}="lz4", ATTR{disksize}="2048M" RUN="$(command -v mkswap) /dev/zram0"
EOF
Perintah diatas adalah membuat satu block-device berkapasitas maksimal 2 GiB untuk digunakan sebagai swap yang memudahkan mengatasi perbedaan letak perintah mkswap yang berbeda di tiap distribusi Linux.

Bagaimana jika menginginkan lebih, sesuai konfigurasi kedua diatas?
yaitu 3 block-device zram.

Edit ๐Ÿ—Ž /etc/udev/rules.d/10-zram.rules menggunakan text-editor seperti nano atau n/vim.
Cukup salin baris tersebut kebawah tetapi menggunakan nama KERNEL dan /dev/zramX yang berbeda, misalnya secara berurutan baris pertama zram0, kedua zram1, ketiga zram2, dst.

Disarankan menggunakan algoritma lz4 untuk kompresi zram, mengenai benchmark baca artikel berikut.  Untuk mengubah ukuran block-device zram, ubahlah pada ATTR{disksize}.


Berikut contoh membuat 3 block-device yang masing-masing memiliki kapasitas maksimal 1 GiB, 2 block-device untuk swap dan 1 block-device untuk ramdisk terkompresi bertipe ext4.
Harap sesuaikan letak perintah mkfs.ext4 pada RUN dengan perintah

$ command -v mkfs.ext4
FileSystem Table
Terakhir, konfigurasi fstab agar mounting block-device yang telah dibuat sesuai dari udev rules diatas sebagai swap dan ramdisk ketika booting. 

Berikut adalah contoh menggunakan direktori /tmp sebagai ramdisk terkompresi pada block-device zram2.
๐Ÿ—Ž /etc/fstab
# zRAM
/dev/zram0    none    swap    defaults    0 0
/dev/zram1    none    swap    defaults    0 0
/dev/zram2    /tmp    ext4    defaults    0 0
Note: Untuk menjadikan swap di Gentoo/Linux, ubah "defaults" menjadi "sw".
Note: Untuk block-device mountable, saya lebih prefer "noatime" daripada "defaults".
Simpan konfigurasi dan reboot sistem. Selesai.

Berikut saya melakukan percobaan sederhana dengan ramdisk terkompresi dari konfigurasi zram diatas.
$ lsblk -f && free -h

$ dd if=/dev/zero of=/tmp/output.img bs=8k count=96k

$ lsblk -f && free -h

* count=96k adalah 512 MiB (64k) + 256 MiB (32k) = 768 MiB

Perhatikan screenshot berikut.

Sebelum menulis file ke zram
  • List block device (lsblk -f)
    • zram2 FSAVAIL atau ruang tersedia adalah 906 MiB
    • zram2 FSUSE% atau persentase penggunaan adalah 0%
  • Memory statistic (free -h)
    • used atau penggunaan memori adalah 249MiB
      total - free - buffer - cache
    • free atau memori bebas/tidak digunakan adalah 2.9 GiB
    • buffer/cache atau kombinasi penggunaan memory oleh kernel-buffer, page-cache, dan slabs adalah 154 MiB
    • available atau perkiraan ketersediaan memori yang digunaan untuk memproses aplikasi (tanpa swap) adalah 2.9 GiB
Sesudah menulis file ke zram
  • List block device (lsblk -f)
    • zram2 FSAVAIL atau ruang tersedia adalah 138 MiB
    • zram2 FSUSE% atau persentase penggunaan adalah 79%
  • Memory statistic (free -h)
    • used atau penggunaan memori adalah 255MiB
      total - free - buffer - cache
    • free atau memori bebas/tidak digunakan adalah 2.1 GiB
    • buffer/cache atau kombinasi penggunaan memory oleh kernel-buffer, page-cache, dan slabs adalah 979 MiB
    • available atau perkiraan ketersediaan memori yang digunaan untuk memproses aplikasi (tanpa swap) adalah 2.8 GiB

Realitas (pandangan orang awam)
Total ruang memori yang tersedia sebesar 3.3 GiB dan di dalam zram2 yang berkapasitas maksimal 1 GiB (sebenarnya 906 MiB) ditulislah sebuah file (null-char) yang berukuran 768 MiB, file tersebut dikompresi dan disimpan kedalam kernel-buffer yang mengambil sebagian ruang dari RAM (free).

Dari file berukuran 768 MiB tersebut, penggunaan memori secara keseluruhan (used) sebelum dan sesudah penulisan (dikompresi) hanya memiliki selisih 6 MiB.
Kemana perginya 762 MiB tersebut? ..

Tips
Jika kamu pengguna f2fs, lebih baik menggunakan f2fs sebagai ramdisk terkompresi daripada ext4. Perbandingan kecepatan menulis berbeda jauh, karena f2fs dioptimalkan untuk NAND-based flash memory.


zswap

Zswap adalah fitur kernel Linux yang menyediakan cache terkompresi ringan untuk swap-device. Bukan sesuatu yang dapat membuat ruang swap di dalam RAM (seperti zRAM). Ini murni cache/pages (tetapi terkompresi) yang biasanya ditukar ke dalam swap-device seperti partisi swap dan swapfile (maupun swap dari zRAM).

Cara kerjanya ialah mengalihkan cache/pages yang akan ditukar dari RAM ke swap-device dengan cara mengompresnya lalu menyimpannya ke dalam memory-pool di dalam RAM yang dialokasikan secara dinamis, alih-alih hanya menukarnya ke dalam swap-device yang sebenarnya. Kemudian setelah memory-pool penuh, cache/pages yang terakhir digunakan (LRU) didekompresi lalu ditulis ke swap-device yang sebenarnya, seolah-olah tidak pernah dialihkan. Selanjutnya, cache/pages yang dikompresi tadi dapat dibebaskan dari memory-pool di dalam RAM.

Akibatnya, penulisan di dalam swap-device yang sebenarnya ditunda atau bahkan dihindari sama sekali, membuat aktivitas I/O berkurang secara signifikan. Sama halnya seperti zRAM, zswap juga membutuhkan siklus CPU lebih untuk melakukan kompresi dan juga berguna untuk mencegah SSD cepat rusak karena sifat alaminya.
Bayangkan, sebuah perangkat komputer menggunakan RAM 4 GiB dengan zswap menggunakan hingga 20% dari ruang RAM yang sebenarnya, dan zswap mencapai rasio kompresi faktor dua. Sistem akan memiliki 20% dari 4 GiB x2 (kali dua) adalah 1.6 GiB ruang swap di dalam RAM, dan harganya hanya 800 MiB dari ruang RAM yang sebenarnya. 

Pertukaran ini dapat menghasilkan peningkatan kinerja yang signifikan jika pembacaan dari cache/pages yang dikompresi lebih cepat daripada pembacaan dari swap-device yang sebenarnya.

zwap diperkenalkan ke kernel Linux versi 3.11 - 2 September 2013

Mengaktifkan zswap

Petama, cek apakah zswap sudah diaktifkan pada konfigurasi kernel secara default.
$ zgrep "CONFIG_ZSWAP_DEFAULT_ON" /proc/config.gz 
Berikut adalah zswap yang sudah diaktifkan (y) dari konfigurasi kernel. Hal ini adalah default untuk pengguna Arch BTW (slang) yang menggunakan binari kernel official Arch.
Saya sebagai pengguna Gentoo/Linux juga mengaktifkannya secara default pada konfigurasi kernel yang dikompil secara manual pada komputer lokal.
Jika belum diaktifkan secara default, cukup aktifkan secara permanen ketika booting dengan kernel parameter. Misalnya menggunakan GRUB.

Harap sesuaikan parameter berikut.
๐Ÿ—Ž /etc/default/grub
GRUB_CMDLINE_LINUX="zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold"
Penjelasan Parameter
  • zswap.enabled
    1 untuk mengaktifkan zswap, 0 untuk menonatifkannya jika aktif secara default pada konfigurasi kernel.
  • zswap.compressor
    Algoritma kompresi yang digunakan, saya rekomendasikan lz4. Opsi lain termasuk deflate, lz4hc, lzo, lzo-rle, 842 and zstd.
  • zswap.max_pool_percent
    Persentase maksimum untuk perkembangan dinamis memory-pool di RAM. Setelah mencapai batas maksimum, cache/pages akan dibebaskan dari memory-pool. Baca pengantar.
  • zswap.zpool
    Mengontrol manajemen alokasi memory-pool terkompresi.

    Dengan zbud, 2 objek yang dikompresi disimpan ke dalam 1 pages yang membatasi rasio kompresi menjadi 2 atau kurang, sedangkan z3fold memungkinkan hingga 3 objek terkompresi per-pages. Rasio kompresi dengan z3fold biasanya rata-rata 2,7 sedangkan zbud 1,7.

Kemudian, update konfigurasi GRUB.
$ sudo update-grub
atau
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

Terakhir, reboot sistem dan cek seperti berikut.
$ cd /sys/module/zswap/parameters

$ grep "" * 

Bagaimana cukup jelas dan mudah kan?
Sebenarnya masih ada satu selain zRAM dan zswap.

Apa itu? adalah zcache.
Cara kerjanya mirip seperti zswap, tetapi sudah discontinued dan dihapus dari kernel Linux versi 3.11+.
Aaaaaa.... penulis tidak mau menjelaskan panjang lebar lagi ._.

Cukup itu yang dapat saya berikan.
Jika ada kesalah pahaman mengenai semua teori diatas, maupun dalam mengimplementasikannya harap bisa ditegaskan dengan cara berkomentar dibawah ini.

Semoga bermanfaat bagi kalian semua. 
Terima Kasih.

Artikel Terkait Arch Linux ,Debian ,Fedora ,Gentoo ,GNU/Linux ,Kernel ,Raspberry Pi ,Sysadmin Tool ,Ubuntu ,Void