Arti swappiness di Linux

Nilai swappiness di Linux tidak ada hubungannya dengan berapa banyak RAM yang digunakan sebelum swapping dimulai. Itu kesalahan yang banyak dilaporkan dan diyakini secara luas. Kami menjelaskan apa itu sebenarnya.

Mitos Tentang Swapiness

Swapping adalah teknik di mana data dalam Random Access Memory (RAM) ditulis ke lokasi khusus pada hard disk Anda baik partisi swap atau file swap untuk membebaskan RAM.

Linux memiliki pengaturan yang disebut nilai swappiness. Ada banyak kebingungan tentang apa yang mengontrol pengaturan ini. Deskripsi swappiness yang salah dan paling umum adalah bahwa ia menetapkan ambang untuk penggunaan RAM, dan ketika jumlah RAM yang digunakan mencapai ambang itu, swapping dimulai.

Ini adalah kesalahpahaman yang telah diulang begitu sering hingga sekarang. Hampir semua orang memberi tahu Anda cara swappiness bekerja, mengapa Anda harus mempercayai kami saat kami mengatakan tidak?

Sederhana. Kami akan membuktikannya.

RAM Dibagi Menjadi Zona

Linux tidak menganggap RAM Anda sebagai satu kumpulan besar memori homogen. Tapi menganggap itu dibagi menjadi sejumlah daerah yang berbeda yang disebut zona. Zona mana yang ada di komputer Anda tergantung pada apakah  32-bit atau 64-bit. Berikut adalah deskripsi yang disederhanakan dari zona yang mungkin ada pada komputer arsitektur x86.

  • Direct Memory Access (DMA) : Ini adalah 16 MB memori yang rendah. Zona ini mendapatkan nama ini karena dulu sekali ada komputer yang hanya bisa melakukan akses memori langsung ke area memori fisik ini.
  • Direct Memory Access 32 : Terlepas dari namanya, Direct Memory Access 32 (DMA32) adalah zona yang hanya ditemukan di Linux 64-bit. Ini adalah memori 4 GB yang rendah. Linux yang berjalan pada komputer 32-bit hanya dapat melakukan DMA untuk jumlah RAM ini kecuali jika mereka menggunakan kernel physical address extension (PAE). Pada komputer 32-bit disebut HighMem.
  • Normal : Pada komputer 64-bit, memori normal adalah semua RAM di atas 4GB (kurang-lebih). Pada mesin 32-bit, ini adalah RAM antara 16 MB dan 896 MB.
  • HighMem : Ini hanya ada di komputer Linux 32-bit. Semua RAM di atas 896 MB, termasuk RAM di atas 4 GB pada mesin yang cukup besar.

Nilai PAGESIZE

RAM dialokasikan dalam halaman yang berukuran tetap. Ukuran itu ditentukan oleh kernel saat boot dengan mendeteksi arsitektur komputer. Biasanya ukuran halaman pada komputer Linux adalah 4 Kbytes.

Anda dapat melihat ukuran halaman Anda menggunakan perintah getconf:

getconf PAGESIZE

Zona Terlampir ke Node

Zona terlampir pada node. Node dikaitkan dengan Central Processing Unit (CPU). Kernel akan mencoba mengalokasikan memori untuk proses yang berjalan pada CPU dari node yang terkait dengan CPU itu.

Konsep node yang diikat ke CPU memungkinkan tipe memori campuran untuk dipasang di komputer multi-CPU spesialis, menggunakan arsitektur Non-Uniform Memory Access.

Komputer Linux rata-rata akan memiliki satu simpul yang disebut simpul nol. Semua zona akan menjadi milik simpul itu. Untuk melihat node dan zona di komputer Anda, lihat di dalam /proc/buddyinfofile. Kami akan gunakan less untuk melakukannya:

less /proc/buddyinfo

Ini adalah output dari komputer 64-bit yang diteliti oleh artikel ini:

Node 0, zone DMA   1  1  1  0  2  1  1  0  1  1  3

Node 0, zone DMA32 2 67 58 19  8  3  3  1  1  1 17

Ada satu simpul, simpul nol. Komputer ini hanya memiliki 2GB RAM, jadi tidak ada zona “Normal”. Hanya ada dua zona, DMA dan DMA32.

Setiap kolom mewakili jumlah halaman yang tersedia dengan ukuran tertentu. Misalnya untuk zona DMA32, membaca dari kiri:

•             2 : Ada 2 dari 2^(0*PAGESIZE) potongan memori.

•             67 : Ada 67 dari 2^(1*PAGE_SIZE) potongan memori.

•             58 : Ada 58 dari 2^(2*PAGESIZE) potongan memori yang tersedia.

•             Dan seterusnya, hingga …

•             17 : Ada 17 dari 2^(512* AGESIZE) potongan.

Satu-satunya alasan kami melihat informasi ini adalah untuk melihat hubungan antara node dan zona.

Halaman File dan Halaman Anonim

Pemetaan memori menggunakan set entri tabel halaman untuk merekam halaman memori mana yang digunakan, dan untuk apa.

Pemetaan memori:

  • File backed : Pemetaan didukung file berisi data yang telah dibaca dari file. Ini bisa berupa file apa saja. Yang penting untuk dicatat adalah bahwa jika sistem membebaskan memori ini dan perlu mendapatkan data itu lagi, itu dapat dibaca dari file sekali lagi. Tetapi jika data telah diubah dalam memori, perubahan itu harus ditulis ke file pada hard drive sebelum memori dapat dibebaskan. Jika itu tidak terjadi, perubahan akan hilang.
  • Anonymous: Memori anonim adalah pemetaan memori tanpa file atau perangkat yang mendukungnya. Halaman-halaman ini mungkin berisi memori yang diminta saat sedang berjalan oleh program untuk menyimpan data, atau untuk hal-hal seperti tumpukan. Karena tidak ada file di balik data jenis ini, tempat khusus harus disisihkan untuk penyimpanan data anonim. Tempat itu adalah partisi swap atau file swap. Data anonim ditulis untuk ditukar sebelum halaman anonim dibebaskan.
  • Device backed: Perangkat ditangani melalui blokir file perangkat yang dapat diperlakukan seolah-olah itu file. Data dapat dibaca dari mereka dan ditulis kepada mereka. Pemetaan memori yang didukung perangkat memiliki data dari perangkat yang tersimpan di dalamnya.
  • Shared : Beberapa entri tabel halaman dapat memetakan ke halaman RAM yang sama. Mengakses lokasi memori melalui salah satu pemetaan akan menunjukkan data yang sama. Berbagai proses dapat berkomunikasi satu sama lain dengan cara yang sangat efisien dengan mengubah data di lokasi memori yang ditonton bersama ini. Pemetaan yang dapat ditulis bersama adalah cara umum untuk mencapai komunikasi antar proses yang berkinerja tinggi.
  • Copy on write : Copy on write adalah teknik alokasi. Jika salinan sumber daya yang sudah ada dalam memori diminta, permintaan tersebut mengembalikan pemetaan ke sumber daya asli. Jika salah satu proses “berbagi” sumber daya mencoba menulis kepadanya, sumber daya harus benar-benar direplikasi dalam memori untuk memungkinkan perubahan dilakukan pada salinan baru. Jadi alokasi memori hanya terjadi pada perintah tulis pertama.

Untuk swappiness, kita hanya perlu memikirkan dua yang pertama dalam daftar: file backed dan halaman anonim.

Swappiness di Linux

Berikut deskripsi swappiness dari dokumentasi Linux di GitHub :

“This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60.”

Kedengarannya seperti swappiness mengubah intensitas naik atau turun. Menariknya, ini menyatakan bahwa pengaturan swappiness ke nol tidak mematikan swap. Ini memerintahkan kernel untuk tidak bertukar sampai kondisi tertentu terpenuhi. Tetapi swapping masih bisa terjadi.

Mari menggali lebih dalam. Berikut definisi dan nilai default  vm_swappiness dalam file kode sumber kernel vmscan.c :

/*

* From 0 .. 100. Higher means more swappy.

*/

int vm_swappiness = 60;

Nilai swappiness dapat berkisar dari 0 hingga 100. Sekali lagi, komentar tentu terdengar seperti nilai swappiness memiliki pengaruh pada berapa banyak swapping terjadi, dengan angka yang lebih tinggi mengarah ke swapping yang lebih.

Selanjutnya dalam file kode sumber, kita dapat melihat bahwa variabel baru yang dipanggil  swappiness diberi nilai yang dikembalikan oleh fungsi mem_cgroup_swappiness(). Beberapa pelacakan lebih lanjut melalui kode sumber akan menunjukkan bahwa nilai yang dikembalikan oleh fungsi vm_swappiness. Jadi sekarang, variabel  swappiness diatur ke nilai apa pun vm_swappiness yang ditetapkan.

int swappiness = mem_cgroup_swappiness(memcg);

Dan  sedikit lebih jauh ke bawah dalam file kode sumber yang sama, kita melihat ini:

/*

* With swappiness at 100, anonymous and file have the same priority.

* This scanning priority is essentially the inverse of IO cost.

*/

anon_prio = swappiness;

file_prio = 200 – anon_prio;

Itu menarik. Dua nilai berbeda berasal dari swappiness. Variabel anon_prio dan file_prio memegang nilai-nilai tersebut. Ketika satu meningkat, yang lain berkurang, dan sebaliknya .

Nilai swappiness di Linux sebenarnya menetapkan rasio antara dua nilai.

Rasio Terbaik

Halaman file menyimpan data yang dapat dengan mudah diambil jika memori itu dibebaskan. Linux bisa membaca file itu lagi. Seperti yang telah kita lihat, jika data file telah diubah dalam RAM, perubahan itu harus ditulis ke file sebelum halaman file dapat dibebaskan. Tetapi bagaimanapun, halaman file dalam RAM dapat diisi ulang dengan membaca data dari file. Jadi mengapa repot-repot menambahkan halaman ini ke partisi swap atau file swap? Jika Anda membutuhkan data itu lagi, Anda sebaiknya membacanya kembali dari file asli bukan hanya salinan yang berlebihan di ruang swap. Jadi halaman file tidak disimpan dalam swap. Mereka “disimpan” kembali di file asli.

Dengan halaman anonim, tidak ada file mendasar yang terkait dengan nilai-nilai dalam memori. Nilai-nilai di halaman-halaman tersebut telah sampai secara dinamis. Anda tidak bisa begitu saja membacanya kembali dari file. Satu-satunya cara nilai memori halaman anonim dapat dipulihkan adalah untuk menyimpan data di suatu tempat sebelum membebaskan memori. Dan itulah yang berlaku di swap. Halaman anonim yang perlu Anda rujuk kembali.

Tetapi perhatikan bahwa untuk halaman file dan halaman anonym yang membebaskan memori mungkin memerlukan penulisan hard drive. Jika data halaman file atau data halaman anonim telah berubah sejak terakhir kali ditulis ke file atau untuk swap, diperlukan penulisan sistem file. Untuk mengambil data akan membutuhkan sistem file baca. Kedua jenis pengambilan kembali halaman itu mahal. Mencoba mengurangi input dan output hard drive dengan meminimalkan pertukaran halaman anonim hanya akan menambah jumlah input dan output hard drive yang diperlukan untuk menangani halaman file yang sedang ditulis dan membaca dari file.

Seperti yang dapat Anda lihat dari cuplikan kode terakhir, ada dua variabel. Satu bertuliskan file_prio “prioritas file”, dan satu   anon_prio “prioritas anonim”.

  • anon_prio variabel diatur ke nilai Linux swappiness.
  • file_prio nilai diatur ke nilai minus 200 anon_prio.

Variabel-variabel ini memiliki nilai yang bekerja bersama-sama. Jika keduanya diatur ke 100, keduanya sama. Untuk nilai lainnya, anon_prio akan berkurang dari 100 ke 0, dan file_prio akan meningkat dari 100 ke 200. Kedua nilai dimasukkan ke dalam algoritma yang rumit yang menentukan apakah kernel Linux berjalan dengan preferensi untuk mendapatkan kembali (membebaskan) file halaman atau halaman anonim.

Anda dapat menganggap file_prio kesediaan sistem untuk membebaskan halaman file dan anon_prio sebagai kesediaan sistem untuk membebaskan halaman anonim. Apa yang tidak dilakukan nilai-nilai ini adalah mengatur segala jenis pemicu atau ambang ketika swap akan digunakan. Itu diputuskan di tempat lain.

Tetapi ketika memori perlu dibebaskan, kedua variabel ini dan rasio di antara mereka dipertimbangkan oleh algoritma reklamasi dan swap untuk menentukan jenis halaman mana yang secara khusus dipertimbangkan untuk dibebaskan. Dan itu menentukan apakah aktivitas hard drive yang terkait akan memproses file untuk halaman file atau ruang swap untuk halaman anonim.

Kapan Swap Sebenarnya Dipotong?

Kami telah menetapkan bahwa nilai swappiness di Linux menetapkan preferensi untuk jenis halaman memori yang akan dipindai untuk potensi reklamasi. Tidak apa-apa, tetapi sesuatu harus memutuskan kapan swap akan dipotong.

Setiap zona memori memiliki tanda tinggi dan tanda rendah. Ini adalah nilai yang diturunkan sistem. Mereka adalah persentase dari RAM di setiap zona. Nilai-nilai inilah yang digunakan sebagai ambang pemicu swap.

Untuk memeriksa apa tanda tinggi dan rendah, lihat di dalam /proc/zoneinfofile dengan perintah ini:

less /proc/zoneinfo

Setiap zona akan memiliki satu set nilai memori yang diukur dalam halaman. Berikut adalah nilai untuk zona DMA32 pada mesin uji. Tanda rendah adalah 13966 halaman, dan tanda tinggi adalah 16759 halaman:

  • Dalam kondisi berjalan normal, ketika memori bebas di zona turun di bawah tanda rendah zona, algoritma swap mulai memindai halaman memori mencari memori yang dapat diambil kembali, dengan mempertimbangkan nilai relatif  anon_prio dan file_prio.
  • Jika nilai swappiness Linux diatur ke nol, swap terjadi ketika nilai gabungan halaman file dan halaman bebas kurang dari tanda tinggi.

Jadi Anda dapat melihat bahwa Anda tidak dapat menggunakan nilai swappiness Linux untuk mempengaruhi perilaku swap sehubungan dengan penggunaan RAM. Itu tidak bekerja seperti itu.

Apa yang Diatur Dengan Swapiness?

Ini tergantung pada perangkat keras, beban kerja, jenis hard drive, dan apakah komputer Anda adalah desktop atau server. Jelas ini tidak akan menjadi satu ukuran yang cocok untuk semua jenis pengaturan.

Dan Anda harus ingat bahwa swap tidak hanya digunakan sebagai mekanisme untuk membebaskan RAM ketika Anda kehabisan ruang memori. Swap adalah bagian penting dari sistem yang berfungsi dengan baik, dan tanpa itu, manajemen memori yang waras menjadi sangat sulit untuk dicapai oleh Linux.

Mengubah nilai swappiness di Linux memiliki efek instan jadi Anda tidak perlu reboot. Jadi Anda dapat melakukan sedikit penyesuaian dan memantau efeknya. Idealnya Anda melakukan ini selama beberapa hari, dengan berbagai jenis aktivitas di komputer Anda untuk mencoba menemukan yang paling dekat dengan pengaturan ideal yang Anda bisa.

Inilah beberapa hal yang perlu dipertimbangkan:

  • Mencoba untuk “menonaktifkan swap” dengan menetapkan nilai swappiness Linux ke nol hanya menggeser aktivitas hard drive yang terkait dengan swap ke aktivitas hard drive yang terkait dengan file.
  • Jika Anda memiliki penuaan mekanis hard drive, Anda dapat mencoba mengurangi nilai swappiness Linux untuk menjauh dari reklamasi halaman anonim dan mengurangi churn partisi swap. Tentu saja saat Anda menolak satu pengaturan, pengaturan lainnya meningkat. Mengurangi swap churn kemungkinan akan meningkatkan churn sistem file. Tetapi komputer Anda mungkin lebih senang memilih satu metode daripada yang lain. Satu-satunya cara untuk mengetahui dengan pasti adalah mencoba dan melihat.
  • Untuk server tujuan tunggal, seperti server basis data, Anda dapat memperoleh panduan dari pemasok perangkat lunak basis data. Seringkali aplikasi ini memiliki cache file yang dirancang khusus dan rutinitas manajemen memori yang lebih baik Anda andalkan. Penyedia perangkat lunak dapat menyarankan nilai swappiness Linux sesuai dengan spesifikasi mesin dan beban kerja.
  • Untuk pengguna desktop rata-rata dengan perangkat keras yang cukup baru? Biarkan apa adanya.

Cara Mengatur Nilai Swappiness di Linux

Sebelum Anda mengubah nilai swappiness di Linux, Anda perlu tahu apa nilai saat ini. Jika Anda ingin menguranginya sedikit, pertanyaannya sedikit kurang dari apa? Anda dapat mengetahui dengan perintah ini:

cat /proc/sys/vm/swappiness

Untuk mengkonfigurasi nilai swappiness, gunakan perintah sysctl:

sudo sysctl vm.swappiness=45

Nilai baru langsung digunakan, tidak perlu reboot.

Bahkan jika Anda melakukan reboot, nilai swappiness akan kembali ke nilai default 60. Ketika Anda telah selesai bereksperimen dan telah memutuskan nilai baru yang ingin Anda gunakan, Anda dapat membuatnya tetap walaupun reboot dengan menambahkannya ke /etc/sysctl.conffile. Anda dapat menggunakan editor mana saja yang Anda inginkan. Gunakan perintah berikut untuk mengedit file dengan nanoeditor:

sudo nano /etc/sysctl.conf

Saat nano terbuka, gulir ke bagian bawah file dan tambahkan baris ini. Kami menggunakan 35 sebagai nilai swappiness permanen. Anda harus mengganti nilai yang ingin Anda gunakan.

vm.swappiness=35

Untuk menyimpan perubahan dan keluar dari nano, tekan “Ctrl + O“, tekan “Enter“, dan tekan “Ctrl + Z“.

Manajemen Memori adalah Kompleks

Manajemen memori rumit. Dan itu sebabnya, untuk rata-rata pengguna biasanya lebih baik menyerahkannya ke kernel.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *