Apa yang benar-benar dikendalikan oleh parameter vm.swappiness?

37

Per dokumentasi kernel:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

Namun ini agak kabur. Saya mencoba mencari tahu apa yang akhirnya dikendalikan parameter. Saya tahu ini menyesuaikan seberapa agresif kernel mencoba untuk menukar halaman, tetapi proses pengambilan keputusan apa dalam kode kernel yang mempengaruhi?

Apakah ini menyesuaikan berapa lama suatu halaman harus diakses sebelum kernel menukarnya? Jika demikian, apa yang diwakili oleh nilai default 60? Dan berapa banyak yang diubah dengan kenaikan / penurunan 1 (formula akan menyenangkan)?
Atau apakah itu bertukar halaman berdasarkan frekuensi aksesnya?
Atau sesuatu yang lain?

Patrick
sumber
2
Ya, swapiness tidak jelas ;-)
ℝaphink

Jawaban:

27

Sejak kernel versi 2.6.28, Linux menggunakan strategi penggantian halaman Split Least Recent Used (LRU). Halaman dengan sumber sistem file, seperti teks program atau pustaka bersama milik cache file. Halaman tanpa dukungan filesystem disebut halaman anonim, dan terdiri dari data runtime seperti ruang stack yang disediakan untuk aplikasi, dll. Biasanya halaman yang termasuk dalam cache file lebih murah untuk diusir dari memori (karena ini dapat dengan mudah dibaca kembali dari disk bila diperlukan) . Karena halaman anonim tidak memiliki dukungan sistem file, mereka harus tetap dalam memori selama mereka diperlukan oleh suatu program kecuali ada ruang swap untuk menyimpannya.

The vm.swappinesspilihan datang ke dalam bermain di get_scan_count()didefinisikan dalam mm/vmscan.c. get_scan_count()menentukan seberapa agresif daftar anonim dan file LRU harus dipindai ketika mencari halaman untuk diusir. Nilai setiap kasus ditentukan oleh rata-rata mengambang dari rasio yang baru-baru ini diputar dan dipindai di mana referensi yang lebih baru memiliki bobot lebih dari yang lebih tua untuk memperhitungkan perubahan beban kerja sistem.

Ini vm.swappinessadalah pengubah yang mengubah keseimbangan antara bertukar halaman cache file yang mendukung halaman anonim. vm.swappinessadalah nilai prioritas yang diberikan ke halaman anonim, secara default diatur ke 60 . Cache file diberi nilai prioritas 200 dari mana vm.swappinessmodifier dikurangi ( file_prio=200-anon_prio). Ini berarti bahwa, secara default, bobot prioritas cukup mendukung halaman anonim ( anon_prio=60, file_prio=200-60=140). Namun, ketika sistem dekat dengan kondisi kehabisan memori , daftar LRU anonim dan file dipindai sama, kecuali vm.swappinessdiatur ke nol.

Ketika vm.swappinessdiatur ke 100, prioritasnya akan sama ( anon_prio=100, file_prio=200-100=100). Pengaturan vm.swappinesske nol akan mencegah kernel mengusir halaman anonim demi halaman dari cache file.

Thomas Nyman
sumber
Apakah ada cara untuk mengubah swappiness file_prio? Atau batasi pada direktori tertentu?
CMCDragonkai
13

Ada rumus yang digunakan untuk menghitung halaman apa yang akan ditukar. Dalam vmscan.cAnda dapat melihat algoritma ini:

kecenderungan swap = mapped_ratio / 2 + kesulitan + vm_swappiness

Di sini Anda dapat melihat bahwa swappiness adalah skala, yang ditambahkan dalam beberapa algoritma dan Anda dapat mengontrol dengan parameter ini bagaimana kernel akan berperilaku ketika harus bertukar. Anda dapat memperkirakannya sebagai persentase probabilitas, bahwa beberapa halaman memori yang tidak aktif akan ditukar. Jika Anda menetapkan swappiness ke 100, tidak ada kemungkinan, tetapi ada jaminan bahwa swap akan bertukar dan jika Anda menetapkan ke 0, kernel akan mencoba untuk tidak menukar sama sekali selama memiliki memori kosong.

Jan Marek
sumber
6

Telah dikatakan (saya pikir Norman 1986) bahwa sering kali tombol "TUTUP PINTU" dalam lift rusak atau tidak pernah terhubung ke apa pun sejak awal. Ini membuat kontrol ersatz bukan cara memanipulasi lift tetapi menenangkan pengendara yang tergesa-gesa.

Dengan cara yang sama, swappiness memiliki efek yang tidak terkait dengan kontrol deterministik kernel yang terdefinisi dengan baik. Seperti yang dicatat oleh @neon_overlord di askubuntu.com

Karena kebanyakan percaya bahwa bertukar = buruk dan bahwa jika Anda tidak mengurangi swappiness, sistem akan bertukar ketika itu benar-benar tidak perlu. Tak satu pun dari itu benar. Orang-orang mengasosiasikan swapping dengan waktu di mana sistem mereka macet - namun, kebanyakan bertukar karena sistem macet, bukan sebaliknya. Memang benar bahwa ada saat-saat tertentu ketika swapping dapat memiliki penalti yang nyata, tetapi mengurangi swappiness untuk kasus itu dapat mengurangi keseluruhan kinerja sistem atau stabilitas dengan cara lain yang kemudian menjadi nyata ...

Jadi apa yang sebenarnya dikontrolnya? Satu jawaban yang valid - selain jawaban bagus yang sudah disediakan - adalah bahwa ia memodifikasi harapan Anda bahwa Anda memiliki kontrol lebih besar atas sistem Anda dan bahwa memutar-mutar sebuah tombol akan memungkinkan Anda untuk menggunakan kontrol itu dengan cara yang bermakna.

msw
sumber