Takas bölümü olan standart bir Linux (Debian testi) dizüstü bilgisayarım var.
Bununla bir çok deney yapıyorum. Bazıları gerçekten hafızaya aç ve Linux'un varsayılan olarak davranışı benim için bir sorun ... Aptal bir örnek verelim:
- Dizüstü bilgisayarın önünde oturun
- Bir terminal açın
- Tür
python
sonra,a = [0]*100000000
Şimdi bu büyük listeyi işlemek için yeterli RAM'iniz olmayacak. Linux RAM'i dolduracak, sonra takas edecek ve birkaç dakika sonra OOM katili tetiklenecek ve (neredeyse) rastgele hizmetleri öldürecek ve umarım eğer Ctrl + C'ye zamanında python
basarsanız ve terminal hala odaklanıyordu, bilgisayar tekrar tepki verecek.
Bu istenmeyen takastan kaçınmak ve (RAM'de) sahip olduğumdan daha fazla bellek ayırma hakkını reddetmek için bazı bellek sınırlarını zorlamak istiyorum. Bellek talebi belirli bir sınırın altındaysa veya root tarafından sorulursa, root dışında herhangi bir kullanıcının en fazla bellek aç işlemini öldürün.
ulimit -Sv [mem]
Arkadan duydum!
Ho Ho! "Kullanım cgroups
aracılığı cgexec
!" birisi ilk sırada diyor!
Evet, haklısınız: bunlar gerçekten çok iyi çözümlerdir. Fakat:
- Sistem çapında uygulanmazlar
- İşlem başına limitler belirlenir
- Sınırlar statiktir, gerçek miktar boş bir RAM (AFAIK) dikkate alınmaz
- Burada ve orada , bunların zor sınırları zorlamak için gerçekten iyi bir çözüm olmadığını söylüyorlar.
Ne istiyorum ki çekirdek şöyle diyor: "Kullanıcı foo'ya (root değil) aitsiniz , çok fazla bellek kullanıyorsunuz ve hafızamız tükenecek. Üzgünüm ahbap ... şimdi öl!"
Veya: "Sen ne yapıyorsun? X MB'ye ihtiyacın var ve sadece y MB kullanılabilir. Evet, SWAP boş, ama kirli işini yapmak için SWAP'ı kullanmak istemiyorsun, değil mi? Hayır, ben Hayır dedi! Senin için hafıza yok! Eğer ısrar edersen öleceksin! "
overcommit_memory
özel dosya kullanılabilir bellek olarak RAM + SWAP kullanır. Hala takas edeceğim :)
ulimits
neredeyse her yerde gösterildiği gibi kötü bir fikir çünkü işlem başına bir sınırlama ... Biliyorum çatal :) Hakkında cgroups
, bu kesinlikle daha iyi ama daha genel bir şey yok: Dizüstü bilgisayarım hakkında konuşuyorum ama ben de paylaşacağımız üç tane "hesaplama" sunucusuna sahip olmak Kullanıcı sınırlarına göre bu tür bir zorlama yaparsam, en kötü senaryo ile sınırlı olacağım, değil mi?
/proc/sys/vm/overcommit_memory
, düşük bellekteki çekirdek davranışını etkiler.