OOM katilinin daha önce müdahale etmesi mümkün mü?


34

Geliştirme sistemimi maksimum güvenilirliğe ayarlamaya çalışıyorum. Değiş tokuş etmeyi devre dışı bıraktım, çünkü GUI kullanımı için makineyi artık kullanılamayacak şekilde tepkisiz hale getiriyor. Bununla birlikte, eğer saldırgan uygulamalar hafızayı yerse, bazı mekanizmalar hız maliyetinden en iyi şekilde faydalanacak şekilde hareket ediyor gibi görünmektedir. Sabit sürücü takas işlemi yoktur, ancak sistem de aynı şekilde tepkisizleşmektedir. Bu yüzden, sistem bellek kazanımı konusunda herhangi bir özel çaba göstermeden önce OOM katilinin devreye girmesine izin vermek istiyorum. OOM katilini, örneğin 100 MB'tan daha az boş fiziksel bellek olması durumunda çalışacak şekilde yapılandırmak mümkün müdür?


2
Bence asıl mesele şu ki, başlamak için yeterli koç yok. Tokmak olmadığı sürece takas kullanmazsınız. Değiş tokuşu kapatarak ... koç biter ve sayfanın nereye gideceğini bilemezsiniz. Hangi çirkin şeylerin olmasına neden olur. Sisteminiz çok kötü bir şekilde ayarlanmış gibi görünüyor ve hiçbir değişiklik yapmadı.
Journeyman Geek

8
Katılmıyorum Geliştirme ve 'güç kullanımı' genellikle deneysel kullanımı içerir. Örneğin, bir komut satırı görüntü işleme aracı kullanıldığında, işlemin görüntü boyutuyla ilgili olarak ne kadar bellek harcayacağına ilişkin hiçbir özellik yoktur. Bu yüzden sadece bir deneme verdim. Ve tüm makinemi işe yaramaz hale getirmesini beklemiyorum. Tek bir deney için, güvenliğini sağlamak için ulimit kullanabilirim, ancak bazen çok sayıda işlemle tüm sistem işletimi için, bir işlemin kapsamı o kadar yararlı değil, tüm makine için kesinlikle bir 'hayat sigortası' dır.
dronus

1
Takas kullanırken sisteminizin durma noktasına gelmesi şüphelidir. Bilgisayarınız takas kullanıyor, belleği yetersiz. Değiştirme işlemi yavaşlıyor, çünkü disk erişimi yavaş. Disk erişimi nedeniyle ?? yavaş. Onun sorunları tamamen aşağı. Sadece ram konusunda yetersiz değilsin. Bu, başka bir şey yüzünden bunu azaltmak için tek yolu kullanamazsınız.
Journeyman Geek

7
@JourneymanGeek, sol sahada değilsiniz. Diskler tokma, döneme göre yavaştır, bu nedenle ağır takas etme sistemi her zaman durur. Elbette hafızası yetersiz çünkü çok fazla hafıza kullanan bir program çalıştırmayı denedi. Asıl soru, hafıza yetersizken ne yapılması gerektiğidir? Domuzu öldürün veya disk önbelleği için boş hafıza kalmamasından dolayı yavaşlayın.
psusi

2
@TomWijsman, Disk IO, bellek IO'sundan daha yavaş bir çok büyüklük sırasıdır, bu nedenle disk takas kullanmak her zaman çok büyük bir yavaşlama anlamına gelir. Bazen (özellikle koçun pahalı olduğu ve bu nedenle çoğu insanın fazla olmadığı) eski günlerde, hiç denediğiniz şeyi yapamamanız tercih edilir. Bu günlerde disk, RAM'den çok daha yavaş ve ram, çoğu insanın sahip olabileceği kadar ucuz, bu nedenle, nadiren, sahip olduklarından daha fazla koç kullanan bir şeyi yanlışlıkla çalıştırdıkları nadir durumlarda, 1000'den daha fazla pes etmek daha iyi oluyor. Bunu yapmak için uzun süreler.
psusi

Yanıtlar:


36

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 bir ortam olmadan, birkaç kez http://www.unrealengine.com/html5/ adresini başlatarak makinemi (8GB RAM) kilitlemek kolaydı . Şimdi, suçlu tarayıcı sekmeleri işler bitmeden önce öldürülüyor.


3
Kaşıntıyı kaşındığın için teşekkürler! Şimdiye kadar sevgi dolu erken ev.
Thomas Ferris Nicolaisen

1
Sadece Android uzun zamandır aynı şeyi anladım. Bunun için sizin gibi özel kod kullanıp kullanmadığından emin değilim.
dronus

1
earlyoomŞimdi test ediyorum , ilk tetikleme testinde iyi sonuç veriyor. Bunun neden çekirdek konfigürasyonu veya sistem araçlarıyla uygulanamadığını merak ediyorum.
dronus

12

Çekirdeğin varsayılan politikası, uygulamaların boş fiziksel bellek olduğu sürece sanal bellek ayırmaya devam etmesine izin vermektir. Fiziksel hafıza, uygulamalar tahsis ettikleri sanal hafızaya dokunana kadar kullanılmaz, böylece bir uygulama sistemin sahip olduğundan daha fazla hafıza tahsis edebilir, daha sonra dokunmaya başlayabilir, çekirdeğin hafızasının tükenmesine ve bitmesine neden olabilir bellek (OOM) katili. Domuz yağı çıkarma işlemi öldürülmeden önce, disk önbelleğinin boşaltılmasına neden oldu, bu da sistemin önbellek doluncaya kadar bir süre boyunca yanıt vermesini yavaşlatıyor.

Varsayılan değerin değerini 2 ile yazarak belleğin aşmasını engellemek için değiştirebilirsiniz /proc/sys/vm/overcommit_memory. Varsayılan değer /proc/sys/vm/overcommit_ratio50'dir, bu nedenle çekirdek, uygulamaların ram + takasının% 50'sinden fazlasını tahsis etmesine izin vermez. Eğer takasınız yoksa, çekirdek, uygulamaların ramınızın% 50'sinden fazlasını tahsis etmesine izin vermeyecek ve diğer% 50 önbellek için boş bırakılacaktır. Bu biraz fazla olabilir, bu nedenle% 85 kadar bir değere kadar bu değeri arttırmak isteyebilirsiniz, böylece uygulamalar ram'ınızın% 85'ini tahsis edebilir ve önbellek için% 15'i bırakabilirler.


1
Teorik altyapıya sahip olmayan bu değerleri oradaki varsayılanlardan değiştirmek daha güvenilir bir sistemde ulaşamayacaktır, bu değişikliği sadece uygun istatistiklerle doğrulayabilirsiniz. Sırf onu değiştirebilmen, yapman gerektiği anlamına gelmez. Sürekli düşük bellek koşullarında, sahip olduğunuzdan daha fazla bellek kullandığınız ve daha fazla bellek satın almanız gerektiği anlamına gelirseniz, ayarlarınızla oynamanız ve rastgele uygulamaları öldürmeniz gerektiği anlamına gelmez. Günlük çalışmanıza müdahale etmek ya da yolsuzlukla tanışmak, bu gerçekten gitmek için bir yol değil ...
Tamara Wijsman

3
@ TomWijsman, soru sürekli düşük bellek koşullarında olmadığı açıkça ortaya koyuyor; sadece beklenmedik bir şekilde büyük miktarda bellek alan bir komut çalıştırıyor. Daha fazla bellek satın almak, tükendiğinde tek çözüm değildir. Diğer potansiyel çözümler arasında, sahip olduğunuz hafızadan yararlanmanın daha iyi yollarını bulma veya bu kadar hafızaya ihtiyaç duyan şeyleri yapmama sayılabilir. Soru, ikincisinin dışarı çıkıp daha fazla ram almaktan daha kabul edilebilir olduğunu açıkça ortaya koyuyor.
psusi

Sorudaki hangi çizgi bunu netleştiriyor? Ben verilenleri görüyorum I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.. Siz bir emir çalıştırdığını varsayırken, GUI'den bahsetti. Daha fazla bellek satın almak ilk çözümdür, kendiniz daha az bellek kullanmak ikinci çözümdür, sisteminizi kararlı varsayılan değerlere uyarak kararsız hale getiren son çözümdür. Sorunun tam anlamıyla cevaplanması gerekmiyor, bu yüzden yorumlarda ikimizi de rahatsız etmek zorunda olduğunuz sorunun ne olduğunu görmüyorum. Rant yardımcı olmuyor ...
Tamara Wijsman

4
Hey, bu cevap çok güzeldi. Ne yazık ki, “taahhüt”, uygulama programcıları tarafından tahmin edilen oldukça kötü görünen göründüğü sanal bellek talebini ifade eder. Benim (hayır takas) masaüstü çalışırken Örneğin, 'olarak commit'ted yaklaşık 400 en fazla 2.000 MB fiziksel kullanılan bellek, ama 1600mb var /proc/meminfos' Committed_ASdevletler. Bazı uygulamaların çalışması sırasında, bu değer fiziksel belleği kolayca aşar, bu nedenle uygulanabilir bir sınır koymak zordur.
dronus

3
Bunu denemeden önce işinizi kaydedin! : PI her şeyden derhal başarısız oldu (bash, pencere yöneticisi vb.).
jozxyqk

8

Benim için vm.admin_reserve_kbytes = 262144 ayarı tam olarak bunu yapıyor. OOM katil sistemi tamamen tepkisiz gitmeden önce müdahale eder.


1
Fikir hoşuma gidiyor, ancak hiç kullanılmamış 256MiB fiziksel belleğiniz var mı?
Jérôme Pouiller

1
Önbellek için 256MiB kullanılacaktır. Önbellek gerçekten önemlidir, sadece daha hızlı çalışmakla ilgili değildir, önbellek için yeterli bellek yoksa sistem hiç işe yaramaz. Çalışmakta olan her programın kodu bellekten kaldırılabilir, çünkü mmaped ve diskten geri okunabilir. Önbellek olmadan her görev anahtarı disk okumayı gerektirir ve sistem tamamen tepkisizleşir.
Michael Vigovsky

4

Diğer cevapların iyi otomatik çözümleri var, ancak SysRqişlerin ne zaman elinden gideceği konusunda anahtarı etkinleştirmenin de faydalı olabileceğini düşünüyorum . İle SysRqanahtarın, çekirdeği mesajlaşma elle olurdu ve güvenli bir yeniden başlatma (ile gibi şeyler yapabiliriz SysRQ + REISUBuserspace tamamen dondurdu bile).

Çekirdeğin istekleri dinlemesine, kernel.sysrq = 1yalnızca bir bit maskesiyle kullanmanız muhtemel işlevleri ayarlamasına veya etkinleştirmesine izin vermek için ( burada belgelenmiştir ). Örneğin kernel.sysrq = 244, yukarıdaki güvenli yeniden başlatma için gereken tüm kombinasyonların yanı sıra OOM katilinin elle çalıştırılması da mümkün olacaktır SysRq + F.


-2

Güvenilirliğe düşük bellek koşulları ve OOM katiliyle ulaşılmaz.

Bir partiyi bir dolabın içinde organize etmek ve "dolabımı temizlemekten" küçük bir çalma listene yerleştirmek yanlış .

OOM katilinin daha önce müdahale etmesi mümkün mü?

Bunu yapmak, istenmeyen yan sonuçlara neden olacaktır, çünkü öldürülen şey üzerinde hiçbir kontrolünüz yoktur.

Geliştirme sistemimi maksimum güvenilirliğe ayarlamaya çalışıyorum.

Maksimum güvenilirlik, sisteminizi test etmeyi ve bu testlere dayanarak sisteminizi geliştirmeyi içerir .

Sadece rastgele şeyleri düzeltmek sizi hiçbir yere götürmez ...

Değiş tokuş etmeyi devre dışı bıraktım, çünkü GUI kullanımı için makineyi artık kullanılamayacak şekilde tepkisiz hale getiriyor. Bununla birlikte, eğer saldırgan uygulamalar hafızayı yerse, bazı mekanizmalar hız maliyetinden en iyi şekilde faydalanacak şekilde hareket ediyor gibi görünmektedir.

Düşük bellek koşullarına nedeniyle, takas devre dışı bırakılması davranışını iyileştirmek olmaz , o tersini yapar .

Bu durumda güvenilirliği artırmak için, sisteminizin daha duyarlı olması ve kullanıcının niyeti olmadan öldürülecek rastgele işlemlerin olmaması için daha fazla bellek ekleyin. Düşük bellek koşullarına ve bunun gibi bir mekanizmaya başvurmamalısınız, özellikle bir geliştirme ortamında ...

Sabit sürücü takas işlemi yoktur, ancak sistem de aynı şekilde tepkisizleşmektedir.

Düşük hafıza koşulları, takas alsanız da olmasanız da cevap vermemenize neden olur.

Bu yüzden, sistem bellek kazanımı konusunda herhangi bir özel çaba göstermeden önce OOM katilinin devreye girmesine izin vermek istiyorum.

Yukarıda açıkladığım gibi, iyiden daha fazla zarar verecek özel çabalar. Bunun yerine, kendinize ihtiyaç duymadığınız süreçleri öldürebilirsiniz, ama sanırım OOM ihtiyacınız olan süreçleri öldürecek.

OOM katilini, örneğin 100 MB'tan daha az boş fiziksel bellek olması durumunda çalışacak şekilde yapılandırmak mümkün müdür?

Öyle olabilir, ancak bu günlerde çok pahalıya mal olmayan fazladan bir bellek satın alırsanız daha yüksek bir yatırım getirisi elde edersiniz. Düşük hafıza koşullarında çalışmaya devam ederseniz, uzun vadede ayağınıza çarpacağınızı düşünün. OOM bir görevli gibi, size yardım etmiyor, OS'ye yardım ediyor ...


7
Elbette, takas devre dışı bırakma davranışı geliştirir, çünkü diski parçalamak yerine, OOM hafıza diskini devreye sokar ve öldürür. RAM'in tükenmesi sorun değil (ve daha fazlasını eklemek, sadece tükenmek için daha çok uğraşman gerektiği anlamına gelir). Sorun, tükendiğinde ne yapmanız gerektiğidir. OOM'un domuzu öldürmesini ve böylece düşük bellek durumunu gidermesini istiyorsunuz.
psusi

7
Çünkü sizinkinden daha fazla bellek kullanmaya çalışan bir uygulamayı öldürmek, tüm sistemi diz çöktürmek için tercih edilir. Mükemmel bir dünyada sınırsız belleğe sahip olacaksınız ve asla tükenmeyeceksiniz, ama gerçekte, bazen kazayla bitiyorsunuz ve sistemin durması için "yeterli hafıza" değil.
psusi

5
Fazladan bir bellek satın almak, satın alınan miktara bağlı olarak bazı sorunları çözebilir. Ancak, büyüklük sırasına göre ucuz kullanımların olabileceği gerçeğini değiştirmiyor. Bu nedenle uygulamanın başarısız olmasını istiyorum, ancak bu şartlar altında sistem DEĞİL. Bazı örnekler: Sıkıştırılmış resimlerle dolu bir klasörü işleyin, çoğu "normal" boyutta, ancak bazıları gerçekten büyük. Küçük bir hata, bellek kaçakçılığı 1 GB / sn yediğinde ölü bir döngüye neden olabilir. Yanlışlıkla bir video dosyasını bir metin düzenleyicide açın. Genellikle bu, sarsıntılı fare gibi semptomlarla sona erer ve OOM devreye girene kadar neredeyse UI ölür.
dronus 22.03

6
@TomWijsman aynı zamanda neredeyse ölü döngülere sahiptir, çünkü ortalama durumda doğrusal davranan, ancak en kötü durumda, girdi verilerine bağlı olarak üstel olan algoritmalar vardır. Ve fare sarsıntılı ise ve klavyenin girişinde bir dakikalık gecikme gösteriyor gibi tıklarsa bir öldürme sinyali gönderemiyorum. O zaman genellikle bir metin modu terminaline geçiyorum ve sadece killkör bir şekilde yazılmış olan giriş işleminin devam etmesi için dakikalar beklerim .
dronus

7
Öldürülen uygulamaları öldürme konusunda da sorunum yok. 2GB fiziksel + 2GB geçişli bir sistem düşünün. Fiziksel belleği hızla tüketen bir uygulama, takası da kolayca yiyebilir. Sadece dakikalar geçtikten sonra sistemi tepkisiz hale getirdikten sonra ölecekti. Peki neden GUI operasyon lapa lapa olmadan önce hızlı bir şekilde öldürmek değil? Pek çok süreç 10mb ile tüm çalışmalarını yapıyor, bazıları 1gb alıyor ve bazıları nadiren 10gb'ye ihtiyaç duyuyor, bu hayat.
dronus
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.