Sistem belleği az olsa bile Ubuntu'nun donmasını önleyin


24

Bazen işlem için hafızada tutmak istediğim çok büyük veri dökümü ile çalışıyorum. Bazen programımın üreteceği bellek miktarını yanlış hesaplarım ya da bir hata ayıklayıcı, bellek kullanımını kullanılabilir belleği aşan bir faktörle çarpar.

Ne zaman hafızaya aç bir işlem başlatsam, aklı başında bir işletim sisteminden beklediğim şey şu: tüm boş hafızaları yemeye çalışın, daha sonra ihtiyaç duymadıkları hafızayı bırakmaları için gerekli olmayan diğer bazı işlemlerden isteyin, sonra değiş tokuş etmek için yazın.

İşte Ubuntu'nun benim için yaptığı şey: tüm boş belleği tüketin, ardından işletim sisteminden tüm temel hizmetleri değiştirmesini isteyin (gnome oturumu, terminal, klavye), ardından dondurun ve fişi çekmemi bekleyin.

İki soru:

  1. Bir işletim sistemi, kullanıcı girişlerini dinlemeyi bırakmanın bir şey olduğu kadar önemli olabileceğini nasıl varsayabilir?
  2. Bazı aptalca bir işlem sistemin sağladığından daha fazla kaynak tüketmeye çalışsa bile, Ubuntu'ya temel hizmetleri asla takas etmemesini ve kullanıcı girdisine her zaman tepki vermesini nasıl söyleyebilirim.

Ne kadar RAM taktınız? Takas büyüklüğünüz ne kadar (terminalde swaponbulmak için yazın)? Şerefe, Al
heynnema

3
16 gb koç ve 16 gb takas. Ancak buradaki mesele bu değil, daha fazla hafıza ekleyerek bu problem çözülemez.
Klamann

1
İki şeyden birini dene. 1) swappinessayarı 10'a ayarlayın, yani: vm.swappiness = 10/etc/sysctl.conf. Daha fazla bilgi için burada swappiness arayın. 2) Değiş tokuş etmek işe yaramazsa ... İsteseniz bile ... takas alanınızın boyutunu 1.5x16G'ye yükseltin ve bunun yardımcı olup olmadığına bakın. Bana bilgi vermeye devam edin. Şerefe, Al
heynnema

1
@Klamann Daha fazla takas ekleyerek sorunu çözmeyeceğini kabul ediyorum. RAM + SWAP kullanan tüm kırık bir programınız olduğunda, ekstra SWAP eklemek sadece kaçınılmazlığı geciktirir.
WinEunuuchs2Unix 5:16

1
Dediğim gibi WinEunuuchs2Unix @, vm.swappiness=10gereken KATMA sysctl.conf kütüğünde için. Deneyimli bir kişi sysctl.conf dosyasını düzenlemeden vm.swappiness = 10 değerini ayarlamak için anında sysctl komutunu kullanabilir. Şerefe, Al ps: OP'nin yanıt vermesini bekliyor.
heynnema

Yanıtlar:


5

Sorun için hala bir çözümüm yok, ancak başkalarının ilgisini çekebilecek iki geçici çözüm önerebilirim:

1) erken ev

Yani tükettiğini belli bir eşik ulaşıldığında en bellek (ayrıca bkz bu süreci bellek kullanımı izler ve öldüren bir hizmettir bu ve bu Linux çekirdeğinde OOM katil ilişkin soru)

Küçük parçalarda kesinlikle bellek isteyen bir demo işlemi ile test ettim. İşte ilk izlenim: Sahtekarlık sürecine başladığım zaman, hızlıca tüm RAM'imi yiyor. Ardından takas başlar, sistem tepkisizleşir. Birkaç saniye sonra sistem tekrar devreye girer. Earlyoom günlüğü, hem bellek hem de takas kullanımı% 90'a ulaştığında, bellek yeme sürecini öldürdüğünü göstermektedir.

Takas başladığında ve süreç öldürüldükten sonra hala can sıkıcı bir gecikme var, diğer işlemlerin bazı bölümleri genellikle talep edilinceye kadar takas halinde kalıyor, ancak bu bir başlangıç.

2) sadece takas işlemini devre dışı bırak

Bunun tartışmalı bir konu olduğunu biliyorum , ancak masaüstü sistemlerinin ve özellikle bir sürecin tüm hafızanızı yemeye çalıştığı zaman zaman meydana gelebilecek geliştirme makinelerinin amaçları için, anlam ifade ediyor: Değişmeden, OOM katili işe yarıyor istendiği gibi. Hafızanız tükendiğinde, öldürmek ve ondan kurtulmak için en iyi işlemi bulur . Gecikme yok, gecikme yok.

Geçerli oturum için takas özelliğini devre dışı bırakabilir sudo swapoff -aveya değişikliği kalıcı yapabilirsiniz .


Sorunun doğru çözümü elbette ana bellek tükendiğinde sistemin duyarlı kalması ve yarın yokmuş gibi hafızayı değiştirmeye başlaması olabilir, ancak bu yakın zamanda gerçekleşmiyor gibi görünüyor.


1
Takas devre dışı bıraktım ve sistemim doğrudan düşük bellekten (<100MB) donmaya devam ediyor. OOM katilinin etkin olup olmadığını nasıl anlarım?
Michael,

0

İki şeyden birini deneyin:

1) swappiness ayarını 60, varsayılan ayarlarından 10'a değiştirin, yani: vm.swappiness = 10 'u /etc/sysctl.conf' a ekleyin (terminalde, yazın sudo gedit /etc/sysctl.conf), sonra sistemi yeniden başlatın . Daha fazla bilgi için burada swappiness arayın.

2) Eğer swappiness işe yaramazsa ... istemeseniz bile ... swap dosyanızın boyutunu 1.5x16G'ye yükseltin ve bunun yardımcı olup olmadığına bakın.

Bana bilgi vermeye devam edin. Şerefe, Al


Bazı testler için bir VM kurdum, çünkü işletim sistemimi birkaç saniyede bir yeniden başlatmak gerçekten can sıkıcı bir hal aldı. Ubuntu 16.04, 2 gb ram, 3 gb takas, 20 gb disk. Sonra çok fazla hafıza alan bir senaryo koştum: Varsayılan değişim (60) ile sistem donuyor ve birkaç dakika sonra kapattım, çünkü kurtarma zamanı kabul edilemezdi. Geçiş 10 ile, sistem birkaç saniye donar, daha sonra girişi kabul eder, ancak herhangi bir işlemi başlatamazsınız (örn top. Hafıza kartını öldürmek için). Bir dakika kadar sonra işlem öldürülür. Mükemmel değil, ama yaklaşıyoruz.
Klamann

Bizi haberdar et. VM, gerçek hayattaki işletim sisteminizi gerçekten taklit etmeyecek, ancak ayarlarla oynamanıza izin verecek. Eğer değiş tokuş etmek sorununuzu çözerse merak edeceğim. Şerefe, Al
heynnema

Ah iyi. İlerleme! Değiş tokuş hakkında biraz bilgi edinin. Biraz değer ile oynayabilirsiniz. Şerefe, Al
heynnema

Sistem donduğunda ne kadar takas kullanılıyordu? Şerefe, Al
heynnema

2
neden, bunun anlamı ne? daha fazla bellek, o belleği de emersem sistemin sıkışmasını önleyemez.
Klamann

0

Ben de benzer bir sorunu çözdüm. Tecrübelerimin sana uygun olup olmadığını bilmiyorum.

Son zamanlarda, USB'den başlatılan geri döngü LVM cihazlarına linux'un nasıl kurulacağına dair bir kılavuz yayınladım (böylece grubun dahili diske kurulması gerekmeden orijinal olarak bırakılıyor). İşte rehber: https://github.com/DareDevil73/linux-on-loopback-usb .

Sonra donma sorununda yüksek bellek yüküne düştüm ve anormal bir takas alanı kullanımı gördüm (tüm RAM yenildi ve takas kullanımı sıfıra yakındı). Belli ki LVM takas bölümü uygun bir şekilde monte edildi ve çalışıyordu, ancak çekirdeğin neden beklendiği gibi kullanmadığını bilmiyorum.

Alternatif bir çözüm denedim. Bir takas döngü dosyası yarattım (LVM değil) ve dondurma gitti. Artık takas dosyası olduğu gibi kullanılır ve işletim sistemi asla donmaz!

Daha derin bilgi almak için lütfen https://github.com/DareDevil73/linux-on-loopback-usb#known-issues adresine bakın .


Lütfen bağlantıları cevaplar halinde genişletin.
Konrad Gajewski
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.