Apakah mungkin untuk memicu pembunuh OOM pada swapping paksa?

26

Apakah mungkin untuk membuat sistem terlebih dahulu bertukar keluar halaman tidak aktif ( vm.swappiness), tetapi memanggil oom-killer ketika sistem kehabisan RAM (sebagai lawan kehabisan memori) dan dipaksa untuk bertukar?

Tujuan utamanya adalah menjaga agar sistem tidak menggiling hingga berhenti ketika mulai meronta-ronta disk karena kesalahan halaman utama, tetapi masih membiarkan halaman tidak aktif diganti.

Keinginan lain adalah untuk mengkonfigurasi berapa banyak swap memori sistem dipaksa untuk digunakan sebelum pemicu oom-killer. Dengan cara ini sistem dapat beralih ke swap sedikit saja, asalkan tidak terlalu jauh. Atau saya bisa mengatur ambang batas untuk memicu oom-killer sebelum menggunakan semua RAM sehingga selalu ada ruang untuk cache sistem file (dan dengan demikian menghindari lebih banyak disk drive).

Sepertinya ini tidak terlalu sulit untuk dilakukan. Sepertinya Anda bisa memberi tahu oom-killer untuk memicu ketika sistem memiliki X ram digunakan / gratis. Tetapi inilah mengapa saya bertanya; Saya tidak tahu

Untuk klarifikasi, saya tidak ingin mematikan swap, atau menyesuaikan vm.swappinessparameter

Patrick
sumber
3
Cukup menarik, itu terjadi bahkan ketika tidak ada file swap. Rupanya, file memori yang dipetakan hanya dibaca (seperti executables, perpustakaan, mungkin sumber daya grafis) malah diganti.
WGH
Oomd Facebook adalah daemon ruang pengguna yang dirancang untuk membunuh proses berdasarkan throughput sistem secara keseluruhan (yaitu, hanya ketika meronta-ronta). Tetapi tampaknya cukup rumit untuk mengatur untuk desktop / workstation (yang mungkin tidak menempatkan tugas dalam cgroups atau wadah).
Jeffrey Bosboom

Jawaban:

22

Saya juga berjuang dengan masalah itu. Saya hanya ingin sistem saya tetap responsif, apa pun yang terjadi, dan saya lebih suka kehilangan proses daripada menunggu beberapa menit. Sepertinya tidak ada cara untuk mencapai hal ini menggunakan kernel oom killer.

Namun, di ruang pengguna, kami dapat melakukan apa pun yang kami inginkan. Jadi saya menulis Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) yang akan mematikan proses terbesar (dengan RSS) setelah RAM yang tersedia berjalan di bawah 10%.

Tanpa awal, mudah untuk mengunci mesin saya (RAM 8GB) dengan memulai http://www.unrealengine.com/html5/ beberapa kali. Sekarang, tab browser yang bersalah terbunuh sebelum hal-hal tidak terkendali.

Jakob
sumber
1
Terima kasih, itulah tepatnya yang saya cari. Saya sekarang dapat terus berjalan column -t -s,pada beberapa file csv besar dan biarkan earlyoommembunuhnya ketika itu tidak mungkin, sebelum melihat ada yang tidak responsif.
henfiber
4

Ini terdengar seperti solusi yang terlalu rumit. Saya akan menyarankan (dan saya melakukan ini pada mesin saya setup yang tidak perlu hibernasi) hanya mengalokasikan sejumlah kecil ruang swap (128-256MiB). Dengan cara ini kernel dapat menukar beberapa halaman, tetapi pembunuh-OOM dipanggil sebelum hal-hal menjadi buruk.

Jika Anda benar-benar ingin melakukan ini, saya pikir Anda harus menulis skrip / program Anda sendiri yang memantau penggunaan swap dan memanggil pembunuh-OOM menggunakan kunci Magic SysReq (yang dapat dilakukan secara terprogram dengan menulis ke /proc/sysrq-trigger).

Mgorven
sumber
1
Saya berpendapat bahwa memiliki swap kecil bukanlah solusi yang sangat elegan. Pada dasarnya Anda akhirnya membatasi kegunaan swap Anda. Bagaimana jika Anda memiliki banyak halaman tidak aktif dan akan mendapat manfaat dari memiliki 10gb swap? Saya punya kotak dengan ~ 100gb ram di mana 10gb swap bukan ide yang dibuat-buat. Dan menulis aplikasi untuk melakukan ini di userspace hanya terbuka untuk masalah (dibandingkan dengan aslinya di kernel).
Patrick
Karena dengan begitu Anda pada dasarnya membutuhkan mekanisme untuk membedakan "pertukaran yang baik" dari "pertukaran yang buruk", dan itulah algoritma yang sulit untuk dirancang. Jumlah swap yang sesuai jelas tergantung pada jumlah RAM dan beban kerja yang Anda jalankan, jadi jika 10GiB sesuai untuk mesin Anda, alokasikan :-)
mgorven
Mengapa itu sulit? Hanya ada 2 jenis swap, swap preemptive karena vm.swappiness, dan swapping paksa karena kehabisan ram. Yang perlu terjadi adalah ketika kernel dipaksa untuk bertukar, untuk memicu oom-killer. Dan 10GB juga menyisakan banyak ruang untuk bertukar paksa untuk meronta-ronta disk.
Patrick