OOM-katilini zorla değiştirmeye zorlamak mümkün mü?


26

Sistemin aktif olmayan sayfaları ( vm.swappiness) önleyici olarak takas etmesi ( ), ancak sistem RAM dışında çalıştığında (bellek tükenmek yerine) ve takas edilmek zorunda kaldığında oom katili çağırmak mümkün müdür ?

Nihai amaç, büyük sayfa hataları nedeniyle diski kırmaya başladığında sistemin taşlanmasını durdurmaktır, ancak etkin olmayan sayfaların değişmesine izin vermektir.

Başka bir arzu, sistemin katil tetikleyicilerinden önce ne kadar takas belleği kullanmaya zorlandığını yapılandırmak olacaktır. Bu şekilde sistem, fazla ileri gitmediği sürece, biraz değiş tokuş edebilir. Veya tüm RAM'i kullanmadan önce om-katili tetiklemek için böyle bir eşik ayarlayabilirim, böylece her zaman dosya sistemi önbelleği için yer kalır (ve böylece daha fazla disk çökmesini önler).

Bunu yapmak zor olacak gibi görünmüyor. Oom-katiline sadece sistemde X ram kullanılmış / ücretsiz olduğunda tetikleme yapması söylenebilir. Ama bu yüzden soruyorum; Bilmiyorum.

Netleştirmek için, takas kapatmayı ya da vm.swappinessparametreyi ayarlamak istemiyorum


3
İlginçtir ki, takas dosyası olmasa bile olur. Görünüşe göre salt okunur bellek eşlemeli dosyalar (çalıştırılabilir dosyalar, kütüphaneler, belki de grafik kaynakları gibi) değiştirilir.
WGH

Facebook , genel sistem verimliliğine dayanan süreçleri öldürmek için tasarlanan bir kullanıcı alanı arka plan programıdır (yani, yalnızca çökmekte iken). Ancak, masaüstleri / iş istasyonları için kurulum yapmak oldukça karmaşık görünüyor (ki bu muhtemelen gruplara ya da kaplara görevler koymuyor).
Jeffrey Bosboom

Yanıtlar:


22

Ben de bu konu ile mücadele ettim. Ne olursa olsun, sistemimin duyarlı kalmasını istiyorum ve birkaç dakika beklemek için süreçleri kaybetmeyi tercih ediyorum. Çekirdeği öldüren katili kullanarak bunu başarmanın bir yolu yok gibi görünüyor.

Ancak, kullanıcı alanında ne istersen yapabiliriz. Bu yüzden mevcut RAM% 10'un altına düştüğünde en büyük süreci (RSS ile) öldürecek olan Erken OOM Daemon'unu ( https://github.com/rfjakob/earlyoom ) yazdım .

Erken başlangıç ​​olmadan, http://www.unrealengine.com/html5/ adresini birkaç kez başlatarak makinemi (8GB RAM) kilitlemek kolaydı . Şimdi, suçlu tarayıcı sekmeleri işler bitmeden önce öldürülüyor.


1
Sağol, tam olarak aradığım şey buydu. Şimdi column -t -s,bazı büyük csv dosyalarında çalışmaya devam edebilir ve earlyoomyanıt vermemeyi fark etmeden önce mümkün olmadığında bu dosyaya izin verebilirim .
henfiber

4

Bu aşırı detaylı bir çözüm gibi geliyor. Öneririm (ve bunu hazırda bekletmek zorunda kalmayacağım makinelerle yapıyorum) sadece az miktarda takas alanı (128-256MiB) tahsis ediyor. Bu şekilde çekirdek bazı sayfaları değiştirebilir, ancak işler kötüleşmeden OOM katili çağrılabilir.

Bunu gerçekten yapmak istiyorsanız, takas kullanımını izleyen ve program yazarak yapılabilir) Magic SysReq tuşunu kullanarak OOM-katilini çağıran kendi senaryo / programınızı yazmanız gerektiğini düşünüyorum /proc/sysrq-trigger.


1
Küçük bir takas yapmanın çok şık bir çözüm olmadığını savunuyorum. Temel olarak takas işleminizin faydasını sınırlıyorsunuz. Çok fazla etkin olmayan sayfanız varsa ve 10 gb civarında takas yapmaktan faydalanırsa ne olur? 100 gb ram olan kutularım var; 10 gb takas uzak bir fikir değil. Ve bunu kullanıcı alanında yapmak için bir uygulama yazmak sadece sorunlara açıktır (çekirdekte doğal olarak karşılaştırıldığında).
Patrick

Çünkü o zaman “iyi bir takas” ı “kötü bir takas” dan ayırt etmek için bir mekanizmaya ihtiyacınız var ve bu, tasarlanması zor bir algoritma. Açıkçası uygun takas miktarı makineleri ardından :-) olduğunu tahsis için 10GiB uygundur eğer öyleyse, RAM miktarı ve yayınladığınız iş yüküne bağlıdır
mgorven

Bu neden zor olsun ki? Sadece 2 tip swap vardır, vm.swappinesstokmak nedeniyle önleyici takas ve koç bitmesi nedeniyle zorunlu takas. Tek yapılması gereken, çekirdeğin yer değiştirmeye zorlamak için çekirdeği değiştirmeye zorlanmasıdır. Ayrıca 10 gb, zorla takas yapmak için diski atmak için tonlarca alan bırakıyor.
Patrick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.