Bellek yetersiz olduğunda sistem askıda kalıyor


34

Bir eeePC 900a'm var: disk olarak 8GB flaş ve sadece 1GB RAM var. Üzerinde kurulu olan Linux dağıtımı ArchLinux'dur.

Sistemin belleği bittiğinde aşırı derecede tepkisizleşir: TTY1'e geçmek veya hatta fare işaretçisini hareket ettirmek gibi şeyleri yapmak birkaç saniye / dakika sürer. Bazen sistem donuyor gibi gözüküyor: üç bizimki yalnız bıraktım ve şimdiye kadar hiçbir şey değişmedi.

Bu eeePC'de bir disk bölümü / dosya oluşturmaktan kaçınmayı tercih ederim, çünkü disk zaten o kadar küçüktü ve ayrıca takas alanı üzerindeki birçok yazar flash kart ömrünü çok kısaltacaktır. Dahası, bir takas dosyası / bölümünün sorunu çözmek yerine sadece sorunu gidereceğini düşünüyorum.

Çekirdeğin belleği yetersiz kaldığında bazı rasgele uygulamaları öldürmesi gerekmiyor mu? Bunu yaparken neden başarısız oluyor (veya yaş alıyor)?

Birkaç ay / yıl önce bu konuya daha fazla bakmaya çalıştım ama gerçekten işe yarayacak hiçbir şey bulamadım ...


1
Kurulumunuzda hangi DE / WM kullanıyorsunuz, hangi servisleri / kumandanları kullanıyorsunuz? Tam dolu bir masaüstü ortamı kullanmak ve Chromium veya Firefox ile gezinmek, RAM'inizi brunch için yiyor. Arch Linux'un kendisini çalıştırmak için 1GB RAM yeterli olmalı, ancak asıl önemli olan bunun üzerine koymak.

1
LXDE kullanıyorum. Chromium, RAM'in çoğunu alan programdır. Neyse bu mesele değil. Sistemimin ne kadar hafıza kullandığı ile ilgilenmesi gereken benim değil, bu yüzden ölmemesi gereken sistemim. Benim sistem belleği eteğine çalışıyorsa, o ben sadece istiyorum, istediği herhangi bir uygulamayı kapatmak için ücretsiz dondurmak için değil !
peoro

5
Ben ciddiye (pseudocode) böyle bir senaryo çalışan düşünüyorum demek: while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }. Bu kesinlikle sorunumu çözdü. Fakat bekleyin, çekirdeğin bunu yapması gerekmiyor mu (ve senaryomdan çok daha iyi bir şekilde)? Neden işini yapmıyor?
peoro

2
@Marcin, bu sadece sorunu giderirdi, sorunu çözmez. 4GB belleğim olsa bile (bazı takaslar sayesinde) sistemim hafızası tükenebilir (bu nedenle takılabilir). Kaçınmak istediğim, RAM dışındayken sistemimin donması. Eğer çekirdeğim RAM biter bitmez aniden kromu öldürürse, şu an sahip olduğum 1GB ile bile mutlu olurum.
peoro

4
@ Sihirli "sysrq", doğrudan çekirdeğe giden anahtar bir açılandır. Bu, genellikle klavye ve fare yanıt vermiyor olsa bile çalışacaktır. Bkz en.wikipedia.org/wiki/Magic_SysRq_key
Raman

Yanıtlar:


14

OOM-katilini (bellek dışı katil) doğrudan klavye kombinasyonuyla çağırmak mümkündür:

SysRq-F

SysRq tuşu genellikle klavyelerde PrtSc tuşuyla birleştirilir.

OOM-katil bazı işlemleri (-es) öldürür ve sistem tekrar tepki verir.

Thx Raman, yukarıdaki yorumlarda bu özelliğe ilişkin tavsiye için.

PS: Bu bana çok yardımcı oldu. Chrome'un veya herhangi bir hafızalı açgözlü yazılımdan kaynaklanıyorsa, bu sorunla ilgili en yararlı tavsiyenin bu olduğuna katılıyorum. Ancak OOM-katilinin gerçekten önemli bir süreci öldürebildiğini, dikkatli bir şekilde kullanabileceğini aklınızda bulundurmanız gerekir.


2
Anahtar bende PrtScn|SysRq. Ancak basmak SysRq - Fyalnızca ekran görüntüsü alır
Lee,

2
Temelde yukarıdaki yorumumu aldığınız ve bir cevap verdiğinizden, küçük bir nitelik güzel olurdu. Seni yine de oyladım. :-)
Raman

3
@Lee Bunu etkinleştirmeniz gerekir. Bazı dağıtımlarda varsayılan olarak etkin sysrq özelliği etkin değildir. Bu yardımcı olacaktır: google.ca/search?q=sysrq+enable
Raman

2
@Raman Bahislerim% 99'u varsayılan olarak "etkinleştiremez" diyen bir oyuncuya girdim, çünkü makineleri zaten donmuş durumda ... neden varsayılan olarak etkin değil?
themihai

3
@themihai çünkü birçok kişi güvenlik riski olarak görüyor - uygulama durumuna bakılmaksızın, örneğin kilitleme ekranları vb.
Raman

11

İşlerin doğal hali, uygulama verilerinin RAM'de olması ve dosyaların diskte olmasıdır.
Performans açısından, ideal olan durum, sık kullanımdaki verilerin RAM'de olması ve şu anda ihtiyaç duyulmayan verilerin diskte olmasıdır.
Normal bir sistemde, çekirdek bu ideale ulaşmaya çalışmak için iki şey yapar:

  • Bir süredir kullanılmayan uygulama verileri diske taşınabilir: takas edilir.
  • Son zamanlarda kullanılan dosyalardan gelen veriler RAM'de tutulur: bu, disk önbelleğidir (diskten okunan veriler için) ve disk arabellekleridir (diske yazılmak üzere olan veriler için).

Tipik bir sistemde, RAM'in önemli bir kısmı önbellek ve tamponlara ayrılmıştır (% 50 tipik bir rakamdır). RAM sınırlı bir kaynak olduğundan, bazı uygulama verilerinin takas için değiştirilmesini gerektirebilir (takas yalnızca RAM'i kullanmak için daha iyi bir yol varsa gereklidir).

Takas yapılmayan bir sistemde, uygulama verilerinin neredeyse tüm RAM kullandığı bir nokta vardır ve bu nedenle, önbellek için neredeyse hiç yer kalmaz. O zaman sistemin yavaş olması muhtemel. Çekirdek gerçekten gerekene kadar uygulamaları öldürmeye başlamaz. Uygulamalar kullanılabilir belleğin yalnızca% 99'unu doldurduğu sürece, sistem sürekli çalışmaya devam eder, ancak dosya verilerinin her zaman diskten yüklenmesi ve yeniden yüklenmesi gerekir. Aynı uygulamalar çalışırken, sistem bu noktada takas ile daha hızlı olacaktır.

Bu konuda daha fazla bilgi için, bu lkml tartışmasına ve bu blog gönderisine bakın .

Çekirdeğe disk önbelleği için minimum miktarda RAM ayırmasını bildirmenin doğrudan bir yolunu bilmiyorum. RAM'inizin küçük bir kısmını , belki de sıkıştırılmış olsa bile, takas alanı olarak ayarlayabilirsiniz . Bu durumda başarı raporları var , ancak sizin durumunuzda hiçbir garanti veremiyorum.


1
Açıklama ve bağlantılar için teşekkürler, takasla ilgili bazı şüpheleri gidermeye yardımcı oldular. Soruma @Marcin cevabını takiben, RAM'imde 256 MB sıkıştırılmış sanal takas (compcache) kurdum. Ancak bu, sorumu tam olarak cevaplamıyor: Bütün RAM sadece uygulama tarafından kullanıldığında ve hiçbir şey önbelleğe alınmadığında sistemimin yavaş olacağını biliyorum; Yine de, tamamen RAM dışında olduğumda bu sistemin neden dakikalar / saatler boyunca (belki de sonsuza dek?) Takıldığını anlayamıyorum. 3 saat TTY1’e geçmek için yeterli değilse, çekirdeğimin bellek yetersizken uygulamaları öldürmekle görevini yerine getirmediğini düşünüyorum.
peoro

32 GB'lık fiziksel hafıza ile devre dışı bırakma durumumu devre dışı bıraktım ve kötü yazılımlar bellek ayırma işleminden kaçtığında (merhaba ld, çöp bidonu), bir saniye boyunca inanılmaz derecede çılgınca fareyi hareket ettirmeme izin verecek kadar uyanma, neredeyse bir dakika boyunca takılıyor veya birkaç saniyede iki. Linux'un OOM kullanımı tam bir saçmalık. Şanslıysam, OOM katili masaüstü ortamını tamamen batırmadan doğru işlemi öldürür. Ve ben büyük bir Linux hayranıyım. Çağrı etkin olduğunda çok daha kötü. Linux sayfalama bir şakadır.
doug65536

6

Bu, 2007'den beri bilinen bir hatadır - bkz . Yüksek bellek kullanımı konusunda sistem dondu .

Bu durumda, Windows kullanıcıyı bir veya daha fazla uygulamayı kapatması konusunda uyaran bir iletişim kutusu görüntüler.


2
Ubuntu'da "Atanmamış" gibi görünüyor. Belki de DE kullanıcıyı uyarmalı veya yoğun bellek kullanan uygulamayı dondurmalı mı?
nkkollaw

1
@nbrogi - Sessizce donmadan başka bir şey. Fakat Ubuntu'yu bunu yapmaya ikna eden iyi şanslar.
Dan Dascalescu

6

Son zamanlarda sorunuma bir çözüm buldum.

Linux OOM katili işini düzgün yapamadığından, bir kullanıcı alanı olan OOM Killer: earlyoom kullanmaya başladım . C ile yazılmış, oldukça yapılandırılabilir ve benim için bir cazibe gibi çalışıyor.

Ayrıca, Facebook’un OOMD’si gibi , sunucularında çalışmak üzere geliştirilen bazı alternatifleri de duydum , ancak bunu denemedim.

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.