İşletim sistemini çökertebilecek açgözlü uygulamalar için bellek sınırlayıcı çözümler


32

Bilgisayarımı bilimsel programlama için kullanıyorum. Sağlıklı 8GBbir RAM ve 12GBtakas alanına sahiptir. Genelde, sorunlarım gittikçe büyüdüğü için, mevcut tüm RAM'leri aştım. Kilitlenmekten ziyade (tercih edilir), Ubuntu, Birlik ve açık terminaller de dahil olmak üzere her şeyi değiş tokuş etmeye başlıyor gibi görünüyor. Eğer bir run-away programını zamanında yakalayamazsam, yapabileceğim hiçbir şey yok - beklemekten başka bir şey yok - örneğin bir komut istemine geçmek 4-5 dakika sürer. Ctrl-Alt-F2rahatsız edici süreci öldürebilirim.

Kendi aptallığım bu forumun kapsamı dışında olduğundan, mevcut bir belleği tek bir rahatsız edici programdan kullandığımda Ubuntu'nun çökme yoluyla çökmesini nasıl önleyebilirim?

Evde deneme *!

Bir terminal açın, başlatın pythonve numpykurduysanız şunu deneyin:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Uyarı: olumsuz etkileri olabilir, süreci takip ederek iotopveya topzaman içinde öldürmek için. Olmazsa, yeniden başlattıktan sonra görüşürüz.

Yanıtlar:


21

Yerleşik kabuk ulimit, kaynakları kısıtlamanıza izin verir. Sizin durumunuz için, kabuktaki (ve çocukları) bellek kullanımını sınırlamak için kullanın ulimit -v.

100 MB'lık (100000 KB) bir hafıza sınırı belirleme gösteri:

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Bu ps uww -C script-name-herepython kullanılarak en az 29 MB bellek gerektirdiği gözlemlenmiştir (VSZ sütunu). Python betiğiniz daha fazla belleğe ihtiyaç duydukça RSS sınırı artar, bu sütunu uyarlayın.


1
Çok kötü, asıl uygulamanın nasıl göründüğünü bilmiyoruz. Gösterildiği gibi ulimit, o kabuğun çocukları olan tüm işlemleri etkiler. Bir daemon olarak mı çalışıyor, yoksa işleri daha da karmaşıklaştıracak birçok çocuğu olup olmadığını bile bilmiyoruz. Bkz coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/...
ppetraki

1
Var mı yok kullanıcı dostu ön uç ulimit ve için cgroups ? Windows'ta, işletim sistemi RAM'in tükenmesine yakınlaştığında, sistem donmalarını önlemek için her zaman bir uyarı penceresi açılır. Ubuntu'da her zaman hafıza kullanımına bir göz atmam gerekir mi?
Dan Dascalescu

1
@DanDascalescu Yapılandırılmış bir takas dosyanız varsa, o zaman daha uzun gecikmeler yaşarsınız, ancak yine de çalışabilirsiniz. Takas işleminin başladığını fark ettiğinizde, sistem monitörünü RAM kullanımı açısından kontrol edebilirsiniz. Sisteminizde gerçekten bellek yetersiz kalıyorsa, en yüksek "kötü" puan olan bir işlemi (genellikle en çok belleği tüketen işlemi) öldüren bellek dışı (OOM) katili çağrılır.
Lekensteyn

12

Gruplar, bellek kullanımınızı işlem başına sınırlamanıza izin vermelidir.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Bilimsel bilgi işlem, hafızanızı yoğun şekilde kullanır, uygulamanızı bir grup halinde yerle bytirerek, hafıza baskısı azaltılacağından işlemlerin geri kalanı kurban olmamalıdır.

Alternatif olarak, bir VM, uygulama yalnızca elbette performans pahasına sanal makineye verilen belleği kullanabildiğinden, bir tür zor sınır olarak kullanılabilir. Bununla birlikte, bir VM, bir grup oluşturmaya ve sürdürmeye kıyasla başlatılmamış için yapılandırma yapmak çok daha kolaydır.

Kararlar kararlar :) İyi şanslar!


1
Ulimit ve grupların kullanıcı dostu bir ön yüzü yok mu? Windows'ta, işletim sistemi RAM'in tükenmesine yakınlaştığında, sistem donmalarını önlemek için her zaman bir uyarı penceresi açılır. Ubuntu'da her zaman hafıza kullanımına bir göz atmam gerekir mi?
Dan Dascalescu

Hayır! Ayrıca işletim sisteminiz de donmamalı, bu ayrı bir problem. Pencereler açılır, sadece başlamak için bir bandajdır. Tonlarca bellek kullanıyorsanız, nedenini araştırmalısınız? Örneğin, modern tarayıcılar sanbox'larıyla kolayca 70-150M PER TAB tüketebilirler. Bunu kapatmak veya ayarlamak, son kullanıcı tarafından düzenli olarak kullanılan önemli miktarda belleği boşaltabilir. Zamanlayıcıların, yer kazanmak için nadiren kullanılan programları değiştirmeleri beklenir, ancak daha çok uyanırlarsa, bunları düzeltmeniz gerekir veya birincil göreviniz bellek yoğunsa (web), daha fazla ram gerekir.
ppetraki

8
Belleği ne tükettiğini biliyorum - Chrome. Ancak OS, yine de çalışan uygulamalara karşı istikrarını korumalıdır.
Dan Dascalescu,

1
Bir kullanıcı olarak nereden geldiğini anlıyorum. Bununla birlikte, istediğiniz bir genel bilgisayar platformunu bir cihaza dönüştürmek demektir. En az karmaşık (hataya eğilimli) yöntem olarak, bir işletim sistemi mühendisinin, bu önlemleri sağlamak için uygulanması gereken, tüm bilgisayarın nasıl çalıştırılacağı hakkında çarpıcı biçimde karar verilmiş kararlar vermesidir. Bu genellikle son kullanıcı esnekliği pahasına gelir. Tablet bilgisayarlarında bunun örneklerini görüyorsunuz. Masaüstlerinde esneklik korunur.
ppetraki
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.