Implementasi zRAM dan zswap di Sistem Operasi Linux
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.confBlock-device configuration
Kedua, konfigurasi jumlah block-device zram yang akan digunakan.
🗎 /etc/modprobe.d/zram.confoptions 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.
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.
FileSystem Table
Terakhir, konfigurasi fstab agar mounting block-device yang telah dibuat sesuai dari udev rules diatas sebagai swap dan ramdisk ketika booting.
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 0Note: 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? ..
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/grubGRUB_CMDLINE_LINUX="zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold"Penjelasan Parameter
- zswap.enabled1 untuk mengaktifkan zswap, 0 untuk menonatifkannya jika aktif secara default pada konfigurasi kernel.
- zswap.compressorAlgoritma 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.zpoolMengontrol 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.
Referensi Terkait
- https://en.wikipedia.org/wiki/Zram
- https://en.wikipedia.org/wiki/Zswap
- https://wiki.archlinux.org/index.php/improving_performance#Zram_or_zswap
- https://wiki.archlinux.org/index.php/zswap
- https://wiki.gentoo.org/wiki/Zram
- https://wiki.gentoo.org/wiki/Zswap
- https://stackoverflow.com/questions/18437205/difference-between-zram-and-zswap
- https://linuxreviews.org/Zswap
- https://www.thegeekdiary.com/beginners-guide-to-udev-in-linux/
- https://linuxize.com/post/free-command-in-linux
- https://unix.stackexchange.com/questions/373631/what-is-an-alternative-for-zcache
- https://www.maketecheasier.com/zram-zcache-zswap/
- https://www.programmersought.com/article/61576512841/
- ...
Posting Komentar untuk "Implementasi zRAM dan zswap di Sistem Operasi Linux"
Posting Komentar
Silahkan tinggalkan komentar jika ada masukan, pertanyaan, kritik ataupun dukungan. Namun pastikan untuk berkomentar secara sopan.