Apa itu vm.min_free_kbytes dan bagaimana menala?

What Is Vm Min_free_kbytes

Apakah vm.min_free_kbytes sysctl yang dapat disesuaikan untuk kernel linux dan nilai apa yang harus ditetapkan? Kami akan mengkaji parameter ini dan bagaimana ia mempengaruhi sistem linux yang sedang berjalan dalam artikel ini. Kami akan menguji kesannya pada cache halaman OS dan mallocs dan apa yang ditunjukkan oleh perintah bebas sistem apabila parameter ini ditetapkan. Kami akan membuat beberapa tekaan terpuji mengenai nilai-nilai ideal untuk lagu ini dan kami akan menunjukkan bagaimana menetapkan vm.min_free_kbytes secara kekal untuk meneruskan reboot. Jadi mari kita pergi.

Cara kerja vm.min_free_kbytes

Peruntukan memori mungkin diperlukan oleh sistem untuk memastikan fungsi sistem itu sendiri berfungsi dengan baik. Sekiranya kernel membolehkan semua memori dialokasikan, ia mungkin sukar ketika memerlukan memori untuk operasi biasa agar OS berjalan dengan lancar. Itulah sebabnya kernel menyediakan vm.min_free_kbytes yang dapat ditala. Tunable akan memaksa pengurus memori kernel menyimpan sekurang-kurangnya jumlah memori percuma X. Berikut adalah definisi rasmi dari dokumentasi kernel linux : Ini digunakan untuk memaksa VM Linux agar jumlah minimum kilobyte bebas. VM menggunakan nombor ini untuk menghitung nilai tanda air [WMARK_MIN] untuk setiap zon lowmem dalam sistem. Setiap zon lowmem mendapat sejumlah halaman percuma yang disediakan berdasarkan kadarnya. Sebilangan kecil memori diperlukan untuk memenuhi peruntukan PF_MEMALLOC; jika anda menetapkannya lebih rendah dari 1024KB, sistem anda akan rosak secara halus, dan terdedah kepada kebuntuan di bawah beban tinggi. Menetapkan ini terlalu tinggi akan OOM mesin anda serta-merta.



Mengesahkan Kerja vm.min_free_kbytes

Untuk menguji bahawa tetapan min_free_kbytes berfungsi seperti yang dirancang, saya telah membuat contoh maya linux dengan hanya 3.75 GB RAM. Gunakan arahan percuma di bawah ini untuk menganalisis sistem:



#percuma -m



Melihat utiliti memori percuma di atas menggunakan bendera -m untuk mencetak nilai dalam MB. Jumlah memori ialah 3.5 hingga 3.75 GB memori. 121 MB memori digunakan, memori 3.3 GB percuma, 251 MB digunakan oleh buffer cache. Dan memori 3.3 GB ada.

Sekarang kita akan mengubah nilai vm.min_free_kbytes dan melihat apa kesannya pada memori sistem. Kami akan menggunakan nilai baru ke sistem fail maya proc untuk mengubah nilai parameter kernel seperti di bawah:

# echo 1500000> / proc / sys / vm / min_free_kbytes
# sysctl vm.min_free_kbytes



Anda dapat melihat bahawa parameter diubah menjadi 1.5 GB kira-kira dan telah berlaku. Sekarang mari kita gunakan percuma arahan lagi untuk melihat perubahan yang diiktiraf oleh sistem.

#percuma -m

Memori bebas dan cache penyangga tidak berubah oleh perintah, tetapi jumlah memori yang ditunjukkan sebagai ada telah dikurangkan dari 3327 menjadi 1222 MB. Yang merupakan perkiraan pengurangan perubahan parameter ke memori bebas 1.5 GB min.

Sekarang mari kita membuat fail data 2GB dan kemudian melihat apa yang membaca fail itu ke dalam cache penyangga terhadap nilai. Berikut adalah cara membuat fail data 2GB dalam 2 baris skrip bash di bawah. Skrip akan menghasilkan fail rawak 35MB menggunakan perintah dd dan kemudian menyalinnya 70 kali menjadi yang baru fail data pengeluaran:

# dd if = / dev / random of = / root / d1.txt count = 1000000
# untuk i di `seq 1 70`; gema $ i; cat /root/d1.txt >> / root / data_file; selesai

Mari baca fail dan abaikan kandungannya dengan membaca dan mengarahkan fail ke / dev / null seperti di bawah:

#kucingfail data> /penipu/batal

Ok, apa yang berlaku pada memori sistem kami dengan set manuver ini, mari kita periksa sekarang:

#percuma -m

Menganalisis keputusan di atas. Kami masih mempunyai 1.8 GB memori percuma sehingga kernel telah melindungi sebahagian besar memori seperti yang dikhaskan kerana tetapan min_free_kbytes kami. Cache penyangga telah menggunakan 1691 MB, yang lebih kecil daripada jumlah keseluruhan fail data kami iaitu 2.3 GB. Rupanya keseluruhannya fail data tidak dapat disimpan dalam cache kerana kekurangan memori yang tersedia untuk digunakan untuk buffer cache. Kita dapat mengesahkan bahawa keseluruhan fail tidak disimpan dalam cache tetapi menetapkan percubaan berulang kali untuk membaca fail tersebut. Sekiranya ia disimpan dalam cache, memerlukan sedikit masa untuk membaca fail tersebut. Mari mencubanya.

# data cat data_file> / dev / null
# data cat data_file> / dev / null

Fail yang dibaca mengambil masa hampir 20 saat yang menunjukkan bahawa hampir tidak semuanya disimpan dalam cache.

Sebagai salah satu pengesahan terakhir, mari kita mengurangkan vm.min_free_kbytes untuk membolehkan cache halaman mempunyai lebih banyak ruang untuk beroperasi dan kami dapat menjangkakan cache berfungsi dan pembacaan fail menjadi lebih cepat.

# echo 67584> / proc / sys / vm / min_free_kbytes
# data cat data_file> / dev / null
# data cat data_file> / dev / null

Dengan memori tambahan yang tersedia untuk cache, masa membaca fail menurun dari 20 saat sebelum menjadi .364 saat dengan semuanya dalam cache.

Saya ingin membuat percubaan lain. Apa yang berlaku dengan panggilan malloc untuk mengalokasikan memori dari program C dalam menghadapi tetapan vm.min_free_kbytes yang sangat tinggi ini. Adakah ia akan gagal? Adakah sistem akan mati? Tetapkan semula tetapan vm.min_free_kbytes ke nilai yang sangat tinggi untuk meneruskan eksperimen kami:

#membuang 1500000 > /peratus/sys/vm/min_free_kbytes

Mari lihat kembali memori percuma kami:

Secara teorinya kami mempunyai 1.9 GB percuma dan 515 MB tersedia. Mari kita gunakan program ujian tekanan yang disebut stress-ng untuk menggunakan sedikit memori dan melihat di mana kita gagal. Kami akan menggunakan penguji vm dan cuba memperuntukkan 1 GB memori. Oleh kerana kami hanya menyediakan 1.5 GB pada sistem 3.75 GB, saya rasa ini mesti berfungsi.

# stress-ng --vm 1 --vm-bytes 1G - waktu keluar 60an
tekanan: maklumat:[17537]menghantar babi:1vm
tekanan: maklumat:[17537]peruntukkan cache: saiz cache lalai: 46080K
tekanan: maklumat:[17537]larian yang berjaya diselesaikandalam60.09s(1min,0.09kering)
# stress-ng --vm 2 --vm-bytes 1G - waktu keluar 60an
# stress-ng --vm 3 --vm-bytes 1G - waktu keluar 60an

Mari mencubanya lagi dengan lebih ramai pekerja, kita boleh mencuba 1, 2, 3, 4 pekerja dan pada satu ketika ia mesti gagal. Dalam ujian saya lulus dengan 1 dan 2 pekerja tetapi gagal dengan 3 pekerja.

Mari kita tetapkan semula vm.min_free_kbytes ke bilangan yang rendah dan lihat apakah itu membantu kita menjalankan 3 tekanan memori dengan masing-masing 1GB pada sistem 3.75GB.

# echo 67584> / proc / sys / vm / min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G - waktu keluar 60an

Kali ini berjaya tanpa kesilapan, saya mencubanya dua kali tanpa masalah. Oleh itu, saya dapat menyimpulkan bahawa terdapat perbezaan tingkah laku kerana terdapat lebih banyak memori yang tersedia untuk malloc, apabila nilai vm.min_free_kbytes ditetapkan ke nilai yang lebih rendah.

Tetapan lalai untuk vm.min_free_kbytes

Nilai lalai untuk tetapan pada sistem saya ialah 67584 iaitu sekitar 1.8% RAM pada sistem atau 64 MB. Atas sebab keselamatan pada sistem yang terlalu keras, saya cenderung untuk menaikkannya sedikit mungkin hingga 128MB untuk membolehkan memori bebas yang lebih tersimpan, namun untuk penggunaan rata-rata, nilai lalai nampaknya cukup masuk akal. Dokumentasi rasmi memberi amaran tentang menjadikan nilai terlalu tinggi. Menetapkannya ke 5 atau 10% RAM sistem mungkin bukan penggunaan pengaturan yang dimaksudkan, dan terlalu tinggi.

Menetapkan vm.min_free_kbytes untuk bertahan semula

Untuk memastikan tetapan dapat bertahan reboot dan tidak dikembalikan ke nilai lalai ketika reboot pastikan untuk membuat pengaturan sysctl berterusan dengan meletakkan nilai baru yang diinginkan dalam file /etc/sysctl.conf.

Kesimpulannya

Kami telah melihat bahawa tunnel kernel vm.min_free_kbytes dapat diubah dan dapat menyimpan memori pada sistem untuk memastikan sistem lebih stabil terutama semasa penggunaan berat dan peruntukan memori berat. Tetapan lalai mungkin sedikit terlalu rendah, terutama pada sistem memori tinggi dan harus dipertimbangkan untuk ditingkatkan dengan berhati-hati. Kami telah melihat bahawa memori yang disimpan oleh lagu ini dapat menghalang cache OS menggunakan semua memori dan juga menghalang beberapa operasi malloc menggunakan semua memori juga.