Ubuntu hızla RAM tükeniyor ve bilgisayarım donmaya başlıyor. Hangi komut bunu çözecek?


73

Arka planda yazılım derlerken çok sık sık başıma geliyor ve aniden her şey yavaşlamaya başlıyor ve sonunda [hiçbir şey yapmazsam] hem RAM'de hem de takas alanım bittiğinde aniden donuyor.

Bu soru, Gnome Terminali'ni açmak, geçmişimi araştırmak ve bir sudokomutu çalıştırmak için yeterli zamana ve kaynağa sahip olduğumu varsayıyor .

Hangi komut, beni sert bir yeniden başlatma veya herhangi bir yeniden başlatma yapmaktan kurtarabilir?


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Thomas Ward

1
Eğer takas alanınız tükenirse, bence çok azınız var. Bu bilgisayarda 20G takas alanı var. Önemli olan, hafızanızı yiyen şeyi öldürmek için kullanılabilir bir sistemle size yeterli zaman vermesidir. Sadece kullanacağın şeyi aldığın bir şey değil, asla kullanmayacağını umduğun şey.
JoL

1
Hem RAM hem de takasın doldurulduğundan emin misiniz? Öyle olsaydı, OOM işleyicisi derleyicinizi öldürür ve belleği boşaltırdı (ve ayrıca derleme işleminizi mahveder). Aksi takdirde, bence daha yeni doluyor ve takasınız sistem diskinizde olduğundan yavaşlıyor olabilirsiniz.
sudo

3
Desteklemek için yeterli RAM'iniz yoksa, paralel yapı sayınızı azaltmayı deneyin. Yapınız değişmeye başlarsa, daha yavaş olacaksınız. İle make, denemek -j44 paralel bir anda kurar örneğin.
Shahbaz,

1
"Alexa bana 8

Yanıtlar:


84

Deneyimlerime göre Firefox ve Chrome, ilk 7 bilgisayarımdan daha fazla RAM kullanıyor. Muhtemelen bundan daha fazla ama ben benim açımdan uzaklaşıyorum. Yapmanız gereken ilk şey , tarayıcınızı kapatmak . Bir emir mi?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

En popüler tarayıcıları oradaki tek bir komuta bağladım, ancak açıkçası başka bir şey kullanıyorsanız (veya bunlardan birini kullanmadığınızı biliyorsanız) komutu değiştirin. Önemli killall -9 ...olan bu. İnsanlar SIGKILL(9 numaralı sinyal) hakkında sinirlenirler ancak tarayıcılar oldukça dayanıklıdır. Bundan daha fazlası, yavaşça sonlandırmak SIGTERM, tarayıcının ek bir RAM patlaması gerektiren - bir sürü temizleme çöpü yaptığı anlamına gelir - ve bu durumda göze alamayacağınız bir şey.

Bunu zaten çalışan bir terminale veya Alt+ bir F2diyaloga sokamıyorsanız, bir TTY'ye geçmeyi düşünün. Control+ Alt+ F2, giriş yapmanıza izin vermesi gereken (yavaş olsa da) ve htopsorunu ayıklamak gibi bir şey kullanmanıza izin vermesi gereken TTY2'ye yönlendirir . Başaramadığım bir noktaya kadar RAM tükettiğimi sanmıyorum htop.

Uzun vadeli çözüm, daha fazla RAM satın almayı, uzak bir bilgisayardan kiralamayı veya şu anda ne yaptığınızı yapmamayı içerir. Karmaşık ekonomik argümanları size bırakacağım ama genel olarak konuşursak, RAM satın almak ucuz, ancak yalnızca bir miktar paraya ihtiyacınız varsa, dakika başına faturalanan bir VPS sunucusu veya saat iyi bir seçimdir.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Thomas Ward

lazygitZaman zaman kullandığım kendi emrimle bağlantılı birkaç emir aldım , belki de buna benzer bir şey uygulanabilir mi? Bütün killall ...senaryo basit bir emptyramşeye indirgenebilirdi
Francisco Presencia

Hangi tarayıcının çalıştığını biliyorsanız, tam komutu çalıştırmanıza gerek yoktur ve RAM sıkıntısı belirleyebilen çoğu insanın yaptığını varsayarım. Ek olarak, emptyramsadece delme yerine bir senaryo yazdığımı hatırlamakta zorlanırdım killall -9 firefox.
Oli

2
RAM satın almak ... neden sadece daha fazla RAM indirmiyorsunuz?
Stephan Bijzitter

1
Şaka yapabilirsin, ancak sahip olduğun çok daha fazla RAM ve CPU gerektiren kısa bir süre için bir şeyler yapman gerekirse, bir kerede VPS kiralamak bir kerelik için oldukça ekonomik.
Oli

66

Magic System Request Key etkinleştirilmiş bir sistemde, Alt + System Request+ tuşlarına basmak f(klavyenizde işaretlenmemişse System Request, çoğunlukla Print Screentuşun üstünde bulunur ), çekirdeğin bellek kaybettiricisini (oomkiller) el ile çağırır ve bu durum en kötü rahatsız edici işlemi seçmeye çalışır. hafıza kullanımı ve öldür. Bunu, tanımladığınızdan belki de daha az zamanınız varsa ve sistem sadece neredeyse başlamak üzere (ya da çoktan başlamışsa) düşmeye başladıysa - bu durumda muhtemelen ne öldürüleceğini umursamazsınız, sadece sona kullanılabilir bir sistem ile. Bazen bu X'i öldürmekle sonuçlanabilir, ancak bugünlerde çoğu zaman eskiden olduğundan daha kötü bir süreç seçmek daha iyidir.


5
@ T.Sar doğruca çökmeye gidiyorsanız, zaten hafıza kaybedenleri öldürür veya kaçırırsınız. Oyunculuktan kaçınırsan hiçbir şey kazanmazsın.
Ruslan,

4
Ayarladığınız zaman bu sadece çalışır @Muzer kernel.sysrqiçin 1ya Gözlerinde farklı doğru bit içeren bir numara /etc/sysctl.d/10-magic-sysrq.conf.
Ruslan,

9
@ T.Sar Aklı başında bir yapı sistemi kullanıyorsanız, ilerlemenizi kaybetmeyeceksiniz. Tüm nesne dosyalarını ancak gerçekte derlediğiniz dosyaları saklayacaksınız, daha sonra bıraktığınız yere geri döneceksiniz.
Muzer

3
@ T.Sar Sadece derlediğiniz şeyin aklı başında olmaması, yapı sisteminin aklı başında olmadığı anlamına gelmez. Çok eski zamanlardan beri sistemler kurmak, sonraki derlemelerde yeniden kullanılmak üzere nesne dosyalarını sakladı. Öte yandan, Linux'tan (genellikle oldukça iyi tasarlanmış) daha az aklı olan birçok yazılım projesini kesinlikle adlandırabilirim. Örneğin, Firefox veya OpenOffice gibi bir şeyi 8 paralel derleme dizisi ile derlerken, RAM gigabayt sırasına göre kolayca görebiliyorum. Ayrıca yüzlerce kütüphaneye dayanan çok sayıda yekpare kurumsal sistem de bulunmaktadır.
Muzer

7
@ T.Sar Linux, derleyicinin POV'sinden gerçekten karmaşık değildir. Aslında olan hiçbir C programı yok. Peki ya C ++? Hiç Eigen veya Boost kullanarak bir program oluşturmayı denediniz mi? Derleyicinin bazen bu tür programlarla ne kadar hafıza yediğini görünce şaşıracaksınız - ve kendileri karmaşık olmaları gerekmez.
Ruslan

20

Diğer cevapların aksine, bunu yaparken takas işleminizi devre dışı bırakmanızı öneririm. Takas sisteminizin öngörülebilir bir şekilde çalışmasını sağlarken ve genellikle diske erişen uygulamaların verimliliğini artırmak için kullanılır (kullanılmayan sayfaları disk önbelleğine yer açmak için kullanarak), bu durumda sisteminiz yavaşlamış gibi geliyor kullanılamaz seviyelere çünkü çok aktif olarak kullanılan hafıza, zorla takas edilmek üzere tahliye ediliyor.

Bu görevi yaparken takas işleminin tamamen devre dışı bırakılmasını öneriyorum, böylece bellek dışı katil RAM doldurulur dolmaz davranır.

Alternatif çözümler:

  • Takas bölümünüzü RAID1'e koyarak takas okuma hızını artırın
    • Ya da riskli hissediyorsanız RAID0, ancak disklerinizden herhangi birinin arızalanması durumunda çok sayıda çalışan program düşecektir.
  • Eşzamanlı yapım işi sayısını azaltın ("daha fazla çekirdek = daha fazla hız", hepimiz söylüyoruz ki, RAM üzerinde doğrusal bir ücret aldığını unutuyoruz)
  • Bu her iki yönde de olabilir, fakat zswapçekirdeği etkinleştirmeyi deneyin . Bu, sayfaları takas işlemine gönderilmeden önce sıkıştırır, bu da makinenizi hızlandırmak için yeterli sayıda kıkırdama odası sağlayabilir. Öte yandan, sadece yaptığı ekstra sıkıştırma / dekompresyon ile engel teşkil edebilir.
  • Optimizasyonları azaltın veya farklı bir derleyici kullanın. Kodu optimize etmek bazen birkaç gigabayt hafızayı alabilir. LTO'nuz açıksa, bağlantı aşamasında da çok miktarda RAM kullanacaksınız. Her şey başarısız olursa, projenizi daha hafif bir derleyici (örneğin tcc) ile derlemeye ürüne isabet eden hafif bir çalışma süresi performansı pahasına derlemeyi deneyebilirsiniz . (Bunu geliştirme / hata ayıklama amacıyla yapıyorsanız, bu genellikle kabul edilebilirdir.)

6
Takas kapattıysanız, bu bellek yetersiz olduğunda Linux'un davranışıdır. Eğer Linux, hafıza dışı katili çağırmaz, ancak donarsa, kurulumda daha derin problemlerin olduğunu gösterebilir. Elbette, takas açıksa, davranış biraz farklıdır.
Score_Under

10
@Akiva Hiç takas olmadan denediniz mi? Bu cevap çok açık. sudo swapoff -aZaten bir sıkıntı içindeyken koşmanın sizi kurtaracağını eklemek isterim : herhangi bir ek takas alanı kullanımını derhal durduracaktır, yani bir sonraki anda OOM katili çağrılmalı ve makineyi çalışma düzenine sokmalıdır. sudo swapoff -aAyrıca bellek sızıntılarını ayıklamak veya firefox derlemek için mükemmel bir önlemdir. Normalde, takas biraz yararlıdır (örneğin hazırda bekletme ya da gerçekten istenmeyen şeyleri değiştirmek için), ancak gerçekten bellek kullandığınızda donmalar daha kötüdür.
Jonas Schäfer,

2
@Score_Under: Her diskteki ayrı takas bölümlerinin, bir md raid0 cihazındaki takastan önemli ölçüde daha etkili olduğu düşünülüyor. Bunu nerede okuduğumu unuttum. Linux RAID wiki, baskın0 üzerinden ayrı bölümler önerir, ancak neden daha iyi olduğu hakkında çok güçlü bir şey söylemez . Her neyse, evet, RAID1 veya RAID10n2, özellikle pagecache için daha fazla RAM bırakmak için çok kirli ama çok soğuk bazı sayfaların yerini alabilmek istiyorsanız, takas için anlamlıdır. yani takas performansı önemli değil.
Peter Cordes,

2
Demek istediğim şu ki, tavsiyenize uyarak, bir kişi bu programları çalıştıramayabilir, çünkü takas gerekir. Zamanın% 100'ünde başarısız olan bir yapı, sistemi kilitleme şansı% 50 olan bir yapıdan daha kötü, değil mi?
Dmitry Grigoryev

2
Takas olmadan, birçok makinede büyük miktarda kod derlemek mümkün değildir. Neden onun feda etmek istediği bir derleme olduğunu varsayıyorsun?
David Schwartz

14

Sisteminizde en fazla RAM kullanarak işlemi sonlandırmak için aşağıdaki komutu (gerekirse tekrar tekrar) kullanabilirsiniz:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

İle:

  • ps -eo pid --no-headers --sort=-%mem: çalışan tüm işlemlerin işlem kimliklerini bellek kullanımına göre sıralanmış olarak gösterme
  • head -1: sadece ilk satırı sakla (en çok belleği kullanarak işlem yap)
  • xargs kill -9: süreci öldürmek

Dmitry'in doğru yorumundan sonra düzenle:

Bu, çalışan hassas işler olmadığında (istemediğiniz görevler) uygulanmaması gereken hızlı ve kirli bir çözümdür kill -9.


5
Bu, OOM katilinin durumu ele almasına izin vermekten çok daha kötü. OOM katili bundan daha akıllı. Gerçekten böyle komutları devam eden derlemeleri olan bir bilgisayarda mı çalıştırıyorsunuz?
Dmitry Grigoryev,

@DmitryGrigoryev bazen masaüstümde Xorg'u öldürmek çok akıllıca. Modern çekirdeklerde OOMK bir miktar akıl kazanıyor gibi gözüküyor, ama ondan sonra buna gerçekten güvenmem.
Ruslan,

11

Kaynak tüketen komutlarınızı çalıştırmadan önce, setrlimit (2) sistem çağrısını, muhtemelen ulimitbash kabuğunuzun (ya da limitzsh'daki yerleşik) özellikle de olduğu -vgibi kullanabilirsiniz RLIMIT_AS. Daha sonra çok büyük sanal adres alanı tüketimi (örneğin, mmap (2) veya malloc (3) tarafından kullanılan sbrk (2 ) ile ) başarısız olur ( errno (3) olur ENOMEM).

Sonra onlar (yani siz yazdıktan sonra kabuğunuzdaki aç işlemler ulimit) sisteminizi dondurmadan önce sonlandırılırlar.

Ayrıca bkz. Linux RAM'im Yedim ve bellek aşırı alımını devre dışı bırakmayı düşünün (komutu echo 0 > /proc/sys/vm/overcommit_memory root olarak çalıştırarak, proc (5) ... bölümüne bakın ).


11

arka planda yazılım derlerken bu oldukça sık başıma geliyor

Bu durumda, "killall -9 make" gibi bir şey (veya derlemenizi yönetmek için ne kullanıyorsanız kullanın). Bu, derlemenin daha da ilerlemesini durduracak, ondan başlatılan tüm derleyici işlemlerini YUKARACAK (umarım onların da durmasına neden olacak) ve bir bonus olarak, giriş yaptığınız kullanıcı olarak derlediğinizi varsaymak zorunda değildir. olarak Web tarayıcınız, X oturumunuz veya rastlantısal bir işleminiz yerine probleminizin gerçek nedenini öldürdüğü için, sistemde yaptığınız herhangi bir şeyi engellemez.


2
Bu cevabı bulmak için şimdiye kadar kaydırma yapmak zorunda kalmam çok yazık. Birisinin bu RAM yiyen kişi üzerinde ilerlemeyi askıya alacak bir yol önereceğini umuyordum.
TOOGAM,

OP'nin beklediği cevaba yakın bir şey değil, ama edebi soruyu cevaplıyor: saçma makinem üzerine inşa ettiğimde kullanılamaz hale geliyor - saçma makinede yapmayı bırak.
9ilsdx 9rvj 0lo

9

Kendiniz için biraz daha takas oluşturun.

Aşağıdakiler 8 G takas ekleyecektir:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

Hala yavaş olacak (değişiyorsunuz) ama gerçekten bitmemelisiniz. Linux'un modern versiyonları dosyalara geçebilir. Bu günlerde takas bölümü için tek kullanım alanı dizüstü bilgisayarınızı hazırda bekletme modudur.


1
Bu metodu aslında burada betik olarak kullandım . Anında takas eklemek için oldukça yararlı.
Sergiy Kolodyazhnyy,

7
Bazı takaslar genellikle akıllıcadır, ancak büyük miktarlarda tahsis etmek, makinenin OOM katili girmeden ve bir gönüllü seçmeden önce makinenin daha fazla atmasını sağlar. Baş parmağın "takas olarak koçunu ikiye katla" konusundaki eski, eski rolü çoktan öldü. Şahsen ben toplamda ~ 1 GB'tan fazla takas ayırma konusunda hiçbir değer göremiyorum.
Criggie

5
Ext4 ile, sistem bozulurken 8GB G / Ç yapmak zorunda kalmamanız fallocate -l 8G /root/moreswapyerine bunu yapabilirsiniz dd. Bu, başka hiçbir dosya sistemiyle çalışmaz. Kesinlikle değil, takasın yazılı olmayan uzantıları delik olarak gördüğü XFS değil. (Sanırım bu xfs posta listesi tartışması sonuçlanmadı ). Ayrıca swapd, disk alanından tasarruf etmek için anında takas dosyaları oluşturan / kaldıran bir daemon'a bakın . Ayrıca askubuntu.com/questions/905668/…
Peter Cordes

1
@Criggie "Şahsen ben toplamda ~ 1 GB takas toplamından daha fazlasını ayırmada hiçbir değer göremiyorum" - Firefox'u oluşturmayı denediniz mi?
Dmitry Grigoryev,

1
@Akiva Son kontrol ettiğimde önerilen yapı yapılandırması 16 GB RAM idi. Ana çalıştırılabilir dosya ( xul.dll) yaklaşık 50 MB'dir, bu nedenle Linux çekirdeğinden 10 kat daha ağırdır.
Dmitry Grigoryev

5

Kısa sürede ücretsiz bir yığın RAM almanın bir yolu , sıkıştırılmış bir RAM diski oluşturan ve orada değiştiren zram kullanmaktır . Herhangi bir yarı-iyi CPU ile, normal takastan çok daha hızlıdır ve sıkıştırma oranları, web tarayıcıları gibi birçok modern RAM domuzunda oldukça yüksektir.

Zram kurulu ve yapılandırılmış olduğunu varsayarsak, yapmanız gereken tek şey çalıştırmak

sudo service zramswap start

Bu btrfs gibi tüm dosya sistemlerinde çalışır mı?
Akiva

1
@Akiva zram diske asla dokunmaz, bu yüzden evet derdim;)
Dmitry Grigoryev

3

sudo swapoff -asistem belleği yetersiz kaldığında, çekirdeği otomatik olarak en yüksek puana sahip işlemi kesecek şekilde takas işlemini devre dışı bırakacağız . Bunu, RAM-ağır bir şey çalıştıracağımı biliyorum, değiştirirse ve sonsuza dek takılıp kalmasına izin vermek yerine kontrolden çıkarsa öldürmeyi tercih ederim. sudo swapon -aDaha sonra tekrar etkinleştirmek için kullanın .

Daha sonra, takas ayarlarınıza bir göz atmak isteyebilirsiniz. Takas alanınız kök bölme ile aynı disktedir ve takas tuşuna bastığınızda sisteminizi yavaşlatır. Ayrıca, benim görüşüme göre, modern sistemler genellikle çok fazla takas ile yapılandırılmış. 32GiB RAM genellikle 32GiB takas alanını gerçekten takas alanınıza koymak istiyorsanız sanki varsayılan olarak 32GiB takas alanı tahsis edilir.


Oh, az önce birisinin bunu başka bir yerde yorumladığını gördüm.
sudo

3

Birinin yapabileceği başka bir şey de bu komut ile bellek sayfası önbelleğini boşaltmaktır:

echo 3 | sudo tee /proc/sys/vm/drop_caches

Gönderen kernel.org dokümantasyon (vurgu eklenmiştir):

drop_caches

Buna yazmak, çekirdeğin temiz önbellekleri ve ayrıca diş macunları ve inodlar gibi geri kazanılabilir döşeme nesnelerini düşürmesine neden olur. Bir kere düştüğünde, hafızası boşalır .

Sayfa önbelleğini boşaltmak için: echo 1> / proc / sys / vm / drop_caches Yeniden doldurulabilir döşeme nesnelerini boşaltmak için (diş hekimleri ve inode'lar dahil): echo 2> / proc / sys / vm / drop_caches Döşeme nesnelerini ve pagecache'yi boşaltmak için: echo 3> / proc / sys / vm / drop_caches

Bu tahribatsız bir işlemdir ve hiçbir kirli nesneyi serbest bırakmaz. Bu işlem tarafından serbest bırakılan nesne sayısını artırmak için, kullanıcı / proc / sys / vm / drop_caches yazmadan önce `sync 'komutunu çalıştırabilir. Bu, sistemdeki kirli nesnelerin sayısını en aza indirecek ve düşürülecek daha fazla aday yaratacaktır.


İlginç ... bu komut mantığını açıklamak ister misin?
Akiva

1
@ Akiva temel olarak bu, Linux çekirdeğine RAM'i boşaltmasını söyler. Bu, rahatsız edici süreci öldüren nedenden kurtulmaz, bu yüzden Oli'nin cevabı sorunun çözümü. Bırakma önbellekleri sisteminizin hafızasının tükenmesini önler, bu nedenle donmayı önler, böylece asıl sorunu çözmeniz için size zaman kazandırır. Bu muhtemelen, takas dosyası yapmaktan biraz daha hızlı olacaktır, özellikle de SSD'de değil, sabit diskindeyseniz
Sergiy Kolodyazhnyy

7
Önbellek, belleği doldururken gidilecek ilk şey, bu yüzden bunun çok yardımcı olacağını sanmıyorum. Aslında, bu komutun hata ayıklama çekirdeği davranışı veya zamanlama diski erişim optimizasyonları dışında pratik bir kullanımı olduğunu sanmıyorum. Daha fazla performansa ihtiyaç duyan herhangi bir sistemde bu komutu çalıştırmamaya alçakgönüllülükle öneririm.
Score_Under

2
@Score_Under - "Belleği doldurduğunuzda önbellek gidilecek ilk şeydir" - bu, ayarlarınıza bağlı olarak değişir /proc/sys/vm/swappiness. Değişkenlik 0 olarak ayarlanmışsa haklısınız. Varsayılan 60 ayarı ile yakınsınız. Bununla birlikte, 200 olarak ayarlanmışsa, ilk önce bırakılan koşu işlemlerinde en az kullanılan sayfalar olacaktır ... bu durumda, bu komut yararlı olabilir . Ancak, takasın 0 (veya bazı düşük değer, belki 20 veya 30) olarak ayarlanması daha iyi bir genel yaklaşım olacaktır.
Jules

3
@Score_Under Bu komut, kswapdhata içeren eski çekirdeğe yararlı oldu (bazı insanlar onunla cronjobs bile yarattı). Ama haklısın, bu soruya yardımcı olacağından şüpheliyim.
Dmitry Grigoryev,

1

"Arka planda derleme" dedin. Ön planda ne yapıyorsun? Eclipse veya başka bir kaynak yoğun IDE ile geliştiriyorsanız, konsolda her şeyin uygun şekilde sonlandırılıp sonlandırılmadığını kontrol edin.

Geliştirme ortamları çoğu zaman geliştirme aşamasında birden fazla işlemi başlatmaya izin verir, bunlar da artık ilgilenmiyorsanız (hata ayıklayıcıda veya tam olarak bitmediyse) asılı kalabilir. Eğer geliştirici dikkat etmiyorsa, gün içinde birden fazla gigabayt kullanarak onlarca unutulmuş işlem birikebilir.

IDE'de sonlandırılması gereken her şeyin sonlandırılıp sonlandırılmadığını kontrol edin.

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.