Bagaimana vm.min_free_kbytes berfungsi
Alokasi memori mungkin diperlukan oleh sistem untuk memastikan berfungsinya sistem itu sendiri. Jika kernel mengizinkan semua memori untuk dialokasikan, mungkin akan kesulitan saat membutuhkan memori untuk operasi reguler agar OS tetap berjalan dengan lancar. Itulah sebabnya kernel menyediakan vm . yang dapat disetel.min_free_kbytes. Tunable akan memaksa manajer memori kernel untuk menyimpan setidaknya X jumlah memori bebas. Berikut adalah definisi resmi dari dokumentasi kernel linux: “Ini digunakan untuk memaksa VM Linux untuk menjaga jumlah minimum kilobyte gratis. VM menggunakan nomor ini untuk menghitung nilai watermark[WMARK_MIN] untuk setiap zona lowmem dalam sistem. Setiap zona lowmem mendapat sejumlah halaman gratis yang dipesan berdasarkan ukurannya secara proporsional. Beberapa jumlah memori minimal diperlukan untuk memenuhi alokasi PF_MEMALLOC; jika Anda mengatur ini lebih rendah dari 1024KB, sistem Anda akan menjadi rusak secara halus, dan cenderung menemui jalan buntu di bawah beban tinggi. Menyetel ini terlalu tinggi akan OOM mesin Anda secara instan.“
Memvalidasi vm.min_free_kbytes Berfungsi
Untuk menguji apakah pengaturan min_free_kbytes berfungsi seperti yang dirancang, saya telah membuat instance virtual linux hanya dengan 3.RAM 75 GB. Gunakan perintah gratis di bawah ini untuk menganalisis sistem:
# gratis -m
Melihat utilitas memori bebas di atas menggunakan flag -m untuk mencetak nilai dalam MB. Total memori adalah 3.5 sampai 3.Memori 75 GB. Memori yang digunakan 121 MB, 3.3 GB memori gratis, 251 MB digunakan oleh cache buffer. Dan 3.Memori 3 GB tersedia.
Sekarang kita akan mengubah nilai vm.min_free_kbytes dan lihat apa dampaknya pada memori sistem. Kami akan menggemakan nilai baru ke sistem file virtual proc untuk mengubah nilai parameter kernel seperti di bawah ini:
# echo 1500000 > /proc/sys/vm/min_free_kbytes# sysctl vm.min_free_kbytes
Anda dapat melihat bahwa parameter diubah menjadi 1.Kira-kira 5 GB dan telah berlaku. Sekarang mari kita gunakan Gratis perintah lagi untuk melihat perubahan yang dikenali oleh sistem.
# gratis -m
Memori bebas dan cache buffer tidak diubah oleh perintah, tetapi jumlah memori yang ditampilkan sebagai tersedia telah dikurangi dari 3327 menjadi 1222 MB. Yang merupakan perkiraan pengurangan perubahan parameter menjadi 1.Memori bebas minimal 5 GB.
Sekarang mari kita buat file data 2GB dan kemudian lihat apa yang membaca file itu ke dalam cache buffer terhadap nilainya. Berikut adalah cara membuat file data 2GB dalam 2 baris skrip bash di bawah ini:. Script akan menghasilkan file acak 35MB menggunakan perintah dd dan kemudian menyalinnya 70 kali ke yang baru data_file keluaran:
# dd if=/dev/random of=/root/d1.jumlah txt = 1000000# untuk i di 'seq 1 70'; lakukan echo $i; kucing /root/d1.txt >> /root/data_file; selesai
Mari kita baca file dan abaikan isinya dengan membaca dan mengarahkan file ke /dev/null seperti di bawah ini:
# cat data_file > /dev/nullOk, apa yang terjadi pada memori sistem kita dengan kumpulan manuver ini, mari kita periksa sekarang:
# gratis -m
Menganalisis hasil di atas. Kami masih memiliki 1.8 GB memori bebas sehingga kernel telah melindungi sebagian besar memori sebagai cadangan karena pengaturan min_free_kbytes kami. Cache buffer telah menggunakan 1691 MB, yang kurang dari ukuran total file data kami yaitu 2.3 GB. Rupanya seluruh data_file tidak dapat disimpan dalam cache karena kurangnya memori yang tersedia untuk digunakan sebagai buffer cache. Kami dapat memvalidasi bahwa seluruh file tidak disimpan dalam cache tetapi mengatur waktu upaya berulang untuk membaca file. Jika di-cache, perlu sepersekian detik untuk membaca file. Ayo coba.
# waktu cat data_file > /dev/null# waktu cat data_file > /dev/null
Pembacaan file memakan waktu hampir 20 detik yang menyiratkan hampir pasti tidak semua di-cache.
Sebagai salah satu validasi terakhir, mari kita kurangi vm.min_free_kbytes untuk memungkinkan cache halaman memiliki lebih banyak ruang untuk beroperasi dan kita dapat berharap untuk melihat cache berfungsi dan membaca file menjadi lebih cepat.
# echo 67584 > /proc/sys/vm/min_free_kbytes# waktu cat data_file > /dev/null
# waktu cat data_file > /dev/null
Dengan memori ekstra yang tersedia untuk caching, waktu baca file turun dari 20 detik sebelumnya menjadi .364 detik dengan semuanya dalam cache.
Saya penasaran untuk melakukan eksperimen lain. Apa yang terjadi dengan panggilan malloc untuk mengalokasikan memori dari program C dalam menghadapi vm yang sangat tinggi ini?.pengaturan min_free_kbytes. Apakah itu akan gagal malloc?? Apakah sistem akan mati?? Pertama-tama setel ulang vm.min_free_kbytes pengaturan ke nilai yang sangat tinggi untuk melanjutkan eksperimen kami:
# echo 1500000 > /proc/sys/vm/min_free_kbytesMari kita lihat kembali memori bebas kita:
Secara teoritis kita memiliki 1.9 GB gratis dan 515 MB tersedia. Mari kita gunakan program tes stres yang disebut stres-ng untuk menggunakan beberapa memori dan melihat di mana kita gagal. Kami akan menggunakan vm tester dan mencoba mengalokasikan memori 1 GB. Karena kami hanya memesan 1.5 GB pada 3.Sistem 75 GB, saya kira ini akan berfungsi.
# stres-ng --vm 1 --vm-byte 1G --waktu habis 60 detikstress-ng: info: [17537] mengirim babi: 1 vm
stress-ng: info: [17537] alokasi cache: ukuran cache default: 4080K
stress-ng: info: [17537] berhasil dijalankan dalam 60.09 detik (1 menit, 0.09 detik)
# stres-ng --vm 2 --vm-byte 1G --waktu habis 60 detik
# stres-ng --vm 3 --vm-byte 1G --waktu habis 60 detik
Mari kita coba lagi dengan lebih banyak pekerja, kita dapat mencoba 1, 2, 3, 4 pekerja dan pada titik tertentu harus gagal. Dalam pengujian saya lulus dengan 1 dan 2 pekerja tetapi gagal dengan 3 pekerja.
Mari kita setel ulang vm.min_free_kbytes ke angka yang rendah dan lihat apakah itu membantu kami menjalankan 3 stresor memori dengan masing-masing 1GB pada 3.Sistem 75GB.
# echo 67584 > /proc/sys/vm/min_free_kbytes# stres-ng --vm 3 --vm-byte 1G --waktu habis 60 detik
Kali ini berhasil tanpa kesalahan, saya mencobanya dua kali tanpa masalah. Jadi saya dapat menyimpulkan ada perbedaan perilaku memiliki lebih banyak memori yang tersedia untuk malloc, ketika vm.nilai min_free_kbytes disetel ke nilai yang lebih rendah.
Pengaturan default untuk vm.min_free_kbytes
Nilai default untuk pengaturan pada sistem saya adalah 67584 yaitu sekitar 1.8% RAM pada sistem atau 64 MB. Untuk alasan keamanan pada sistem yang sangat rusak, saya akan cenderung meningkatkannya sedikit mungkin menjadi 128MB untuk memungkinkan lebih banyak memori bebas yang dicadangkan, namun untuk penggunaan rata-rata, nilai default tampaknya cukup masuk akal. Dokumentasi resmi memperingatkan tentang membuat nilainya terlalu tinggi. Menyetelnya ke 5 atau 10% dari RAM sistem mungkin bukan penggunaan pengaturan yang dimaksudkan, dan terlalu tinggi.
Menyetel vm.min_free_kbytes untuk bertahan dari reboot
Untuk memastikan pengaturan dapat bertahan dari reboot dan tidak dikembalikan ke nilai default saat me-reboot pastikan untuk membuat pengaturan sysctl bertahan dengan meletakkan nilai baru yang diinginkan di /etc/sysctl.file conf.
Kesimpulan
Kita telah melihat bahwa vm.min_free_kbytes kernel linux merdu dapat dimodifikasi dan dapat menyimpan memori pada sistem untuk memastikan sistem lebih stabil terutama selama penggunaan yang berat dan alokasi memori yang berat. Pengaturan default mungkin sedikit terlalu rendah, terutama pada sistem memori tinggi dan harus dipertimbangkan untuk ditingkatkan dengan hati-hati. Kami telah melihat bahwa memori yang dicadangkan oleh merdu ini mencegah cache OS menggunakan semua memori dan juga mencegah beberapa operasi malloc menggunakan semua memori juga.