Kinerja

Apa itu vm.min_free_kbytes dan cara menyetelnya?

Apa itu vm.min_free_kbytes dan cara menyetelnya?
Apa itu vm.min_free_kbytes sysctl dapat disetel untuk kernel linux dan nilai apa yang harus disetel ke?  Kami akan mempelajari parameter ini dan bagaimana pengaruhnya terhadap sistem linux yang berjalan di artikel ini.  Kami akan menguji dampaknya pada cache halaman OS dan mallocs dan apa yang ditampilkan oleh perintah bebas sistem ketika parameter ini disetel.  Kami akan membuat beberapa tebakan terpelajar tentang nilai ideal untuk merdu ini dan kami akan menunjukkan cara menyetel vm.min_free_kbytes secara permanen untuk bertahan dari reboot.  Jadi ayo pergi.

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/null

Ok, 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_kbytes

Mari 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 detik
stress-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.

Distro Linux Terbaik untuk Gaming pada tahun 2021
Sistem operasi Linux telah berkembang jauh dari tampilan aslinya, sederhana, berbasis server. OS ini telah sangat meningkat dalam beberapa tahun terak...
Cara merekam dan streaming sesi permainan Anda di Linux
Dulu, bermain game hanya dianggap sebagai hobi, namun seiring berjalannya waktu, industri game mengalami pertumbuhan yang sangat pesat baik dari segi ...
Game Terbaik untuk Dimainkan dengan Pelacakan Tangan
Oculus Quest baru-baru ini memperkenalkan ide hebat pelacakan tangan tanpa pengontrol. Dengan jumlah permainan dan aktivitas yang terus meningkat yang...