İşlemlerin bellek tüketimine bir tür yumuşak sınır koymak mümkün müdür?


10

Ben böyle nadir bir sorun değil sanırım: bir işlem büyük miktarda bellek ayırır (bellek sızıntısı hata nedeniyle olsun, çünkü inanılmaz derecede büyük bir giriş dosyası veya herhangi bir şey işlemeye çalışın). RAM dolar ve bir noktada Linux değiş tokuşa geçmek zorunda kalır. Eh, bazen bu sadece son çare: Eğer pahalı bir hesaplama varsa, sonuna doğru RAM tükendiğinde veri kaybetmek istemiyorum.

Bununla birlikte, daha sık (deneyimlerime göre), bellek tüketimi, hileli, belki de buggy bir süreçle sınırsızdır. Yani, sadece takas için taşınan daha az acil olarak ihtiyaç duyulan bazı verilerle sonuçlanmıyorum, ancak işletim sistemi panik veriyi takas etmek zorunda kalıyor. Ve bu ne yazık ki rahatsız edici süreci ağır bir şekilde kırmakla kalmıyor, aynı zamanda tüm sistemi neredeyse durma noktasına getirebiliyor (SSD'li makinelerde artık o kadar da kötü değil, ama OTOH, gigabayt ve gigabayt çöp verileri yazmanın uzun süreli flaş hücrelerine zarar verir).
Sorunu fark edene ve işlemi manuel olarak öldürene kadar (kendimi sanal bir terminale bile girmem birkaç dakika sürdü!), Koşu seansımın yarısı değiş tokuşta ve sistem düzgün çalışana kadar biraz beklemem gerekiyor tekrar.

Sorunun tek bir acımasız çözümü var: bir sabit bellek sınırı uygulayın. Ama bu sistem çapında yapmak bazen hala ihtiyacım olan süreçleri öldürür ve eğer ulimitrahatsız edici bir işleme başlamadan önce manuel olarak yapmak zorunda kalırsam ... şey, çok geç olana kadar sık ​​sık unutacağım.

Daha mutlu olacağım olası çözüm türleri:

  • Herhangi bir işlem belirli bir bellek kullanımını aşarsa, yapay olarak kısıtlanır, böylece sistemin geri kalanı yanıt verir.
  • Herhangi bir işlem belirli bir bellek kullanımını aşarsa, SIGSTOPped.
  • Bir işlem RAM sınırına yaklaşırsa , büyük değişim başlamadan önce bir uyarı alırım .

Böyle bir davranış veya benzeri bir şey elde etmenin herhangi bir yolu var mı?


2
Cgroups kullanarak bir işlem veya süreç grubu tarafından kullanılan RAM miktarını sınırlayabilirsiniz. stackoverflow.com/questions/3043709/…
Mark Plotnick

2
Bu tam anlamıyla bir şey ulimitiçindir.
DopeGhoti

1
Ulimit -m, 2.4.30'dan beri Linux üzerinde çalışmadığı ve yalnızca bundan önce belirli durumlarda çalıştığı dışında kullanılacak bir şey olurdu. unix.stackexchange.com/questions/129587/…
Mark Plotnick

niceload - noswap yourprg
Ole Tange

Yanıtlar:


6

niceload --noswap yourprg tam olarak bu durum için yapılır: Takas faaliyetine bakar:

  • Değiştirilirse: Süreci çalıştırın
  • Takas ediyorsanız: Süreci çalıştırın
  • İçeri ve dışarı takas ediyorsanız: Takas duruncaya kadar işlemi askıya alın ve takas durduğunda işleme devam edin

Değiştirme işlemi başlamadan önce işlemi askıya almaz, ancak değiştirmeden önce değiştirmenin 1 saniye çalışmasına izin verir.

niceload --mem 1G yourprgbenzer çalışır: 1 GB daha az ücretsiz youprg askıya. 1 GB'den fazla boş olduğunda, prg'niz devam eder.


0

Evet. Pratik olarak herhangi bir modern kabuk ile kolayca yapılır.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

-lKilitli bellek sınırları seçeneğini kullanabilirsiniz . Limit aşılırsa işleminiz bildirilecektir.


-1

Önbelleği temizlemek için Cronjob: Linux'ta bellek önbelleği nasıl temizlenir

Aslında benzer problemlerim var. Kendi özel komut dosyalarını çalıştıran bir sürü kullanıcı var ve her seferinde komut dosyaları kullanılabilir tüm belleği tüketiyor ve redhat sunucusunu indiriyor. RAM'in toplu tüketiminin nedeni, senaryolarının sadece bir olayı bekleyen günlerce çalışabilmesi ve böylece gerçekte hiç kullanmadığı zamanlarda kaynakların durmasıydı. Yani yaptığım sadece önbelleği bir cronjob ile temizlemeye zorlamaktı ve o zamandan beri bir sorun yaşamadım.

Basit ve tembel.


Hm. İlginç bir öneri, korktuğum halde, yaşadığım sorunların çoğu için hiçbir şey yapmıyor. Benim asıl sorun, birçok gigabayt belleği hızla ayırabilen tek işlemlerle (bilimsel uygulamalar).
leftaroundabout

Temizleme önbellekleri genellikle performans sorunlarına neden olur. Çok nadiren performans sorunlarını çözerler. Ancak orada olmadığında belleğin kullanılabilir olmasına neden olmazlar.
Gilles 'SO- kötü olmayı kes'
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.