Bellek yetersiz olduğunda Linux'un donmasını nasıl önlerim?


25

Bugün (yanlışlıkla) Linux kutumda hızlıca çok fazla bellek kullanan bir program çalıştırdım. Sistemim dondu, tepkisiz hale geldi ve bu yüzden suçluyu öldüremedim.

Gelecekte bunu nasıl önleyebilirim? En azından duyarlı bir çekirdeği veya çalışan bir şeyi tutamaz mı?


Kopyası hafızanın bittiğinde Sistem asılı ve tanınmış bulunuyor hata
Dan Dascalescu

Yanıtlar:


15

Bahse girerim, sistemin aslında "donma" (çekirdeğin asılı olduğu anlamına gelmez), ama daha çok tepkisizdi. Şanslar çok zor değişiyordu, etkileşimli performansa ve sistem hacminin taş gibi düşmesine neden oluyordu.

Sen olabilir takas kapatmak, ama bu sadece nedeniyle daha az kullanılabilir disk önbelleğine azalmış performansıyla birlikte OOM öldürülmüş süreçlere kötü performans sorunu (ve tüm nedenlere eğlenceli) değiştirir.

Alternatif olarak, gülünç miktarda bellek alan ve değiştirmeye neden olan tek bir işlem olasılığını ortadan kaldırmak için işlem başına kaynak sınırlarını (genellikle rlimitve / veya olarak adlandırılır ulimit) kullanabilirsiniz; uygunsuz anlar çünkü sistemin onlara vermeye istekli olduğundan biraz daha fazla hafıza istediler.

Büyük miktarda bellek kullanımına neden olabilecek bir şey yapacağınızı biliyorsanız, muhtemelen mlockall()kabuğunu çalıştıran bir sarmalayıcı programı yazabilirsiniz ; Bu onu bellekte tutardı ve muhtemelen “duyarlı bir çekirdeği tutmak” için en yakın şey olurdu (çünkü bu sorun CPU'nun fazla kullanılmaması değil).

Şahsen, kaynak aptallığı "aptalca şeyler yapma" yöntemine abone oluyorum. Kökünüz varsa, bir sisteme her türlü zararı verebilirsiniz ve bu nedenle olası sonuçlarını bilmediğiniz her şeyi yapmak riskli bir iştir.


2
Ne yazık ki, "aptalca şeyler yapma", Chrome gibi bellek gerektiren uygulamaları çalıştıran kullanıcılara yardımcı olmaz ( 134612 , 393395 sayılarına bakın ).
Dan Dascalescu

1
@DanDascalescu Ve aptalca bir şey yaptığınız her zaman açık değildir. Makinem geçen gün askıda kaldı çünkü “UNION” u (karmaşık) bir SQLite sorgusunda “UNION ALL” olarak değiştirdim.
Michael,

Bilinen-adamcağız programlar, kaynak kısıtlı bir yapılandırmada çalıştırılabilir (ve gerekir) - ulimitya da eğer kalçalı bir gençseniz bu günlerde gruplaşırlar, işi oldukça iyi yapar. Kritik olmayan bir ortamda etkilerini doğrulamaksızın, üretimdeki sorgularda değişiklik yapıyorsanız, bu sizin temel sorunuzdur.
womble

8

Yukarıda Tronic tarafından yapılan yorumda belirtildiği gibi, OOM-katilini (bellek yok edici) doğrudan klavye kombinasyonu ile çağırmak mümkündür SysRq- F.

SysRqtuşu genellikle PrtScklavyelerde tuşun içinde birleştirilir .

OOM-katil bazı işlemleri (-es) öldürür ve sistem tekrar tepki verir. OOM-killer'a doğrudan erişim, varsayılan olarak etkin olmayabilir , durumunun nasıl kontrol edileceğini ve / veya nasıl etkinleştirileceğini bulmak için bu soruyu kontrol edin.

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.



0

Eğer çekirdeği derlemeye gibi hissedersen, deneyebilirsiniz yama gelen EDITbu sorunun bölüm: /programming//q/52067753/10239615
Bu tahliye etmez Active(file)yüksek bellek baskısı sırasında sayfaları ve böylece OOM katili verir Neredeyse anında tetiklemek için, çekirdeğin artık, her işlemin çalıştırılabilir kod sayfalarının sabit diskten yeniden okunması için dakikalarca donmuş bir işletim sistemine neden olması gerekmez.


-1

Bu, önlenmesi özellikle zor bir şeydir. Çünkü çekirdeğin değişmeye başlaması. Bir çözüm takas kapatmaktır. Sistemin belleği bittiğinde, değişmeye başlamak yerine, çekirdek bazı işlemleri öldürür; genellikle öldürmek için doğru işlemi seçer, ama yine de, rastgele bir işlemi öldürmek, yanıt vermeyen bir sisteme sahip olmaktan daha iyidir.

Bu, sunucular için özellikle iyi bir çözüm olabilir, çünkü sunucular genellikle yeterli RAM'e sahiptir ve takas alanını kullanmaya başladıklarında zaten bir sorun olduğu anlamına gelir. Ancak, masaüstleri genellikle takas alanına ihtiyaç duyar, bu yüzden masaüstleri için iyi bir çözüm olmadığını düşünüyorum. Sunucularda, özellikle de bellek sızıntısı şüphesi olduğunda, takas alanını sık sık kapatıyorum.


4
Herhangi bir sistemdeki değiş tokuşun kapatılması kötü bir fikirdir, çünkü kullanılmayan sayfaların değiştirilmesine ve disk önbelleği için boş alan kullanılmasına izin vermez. Bu, özellikle bellek sızıntısı olduğunda geçerlidir.
womble

2
Ve takas kapalıyken, sistem çağrı nedeniyle hala yavaşlayabilir. Sadece kirli sayfalar yerine delice sayfalar temizliyor olacak. (Takas olmadan asla kirli bir sayfa çıkartamaz, her zaman temiz olanları çıkarmak zorunda kalır.)
David Schwartz

Bellek sızıntısı olan bir sunucum var. İlk kez gerçekleştiğinde, sunucuya yanıt vermediğinden sıfırlama düğmesine basmam gerekiyordu. Ancak takas kapattığım için, sunucu apache çocuğunu çok büyürse öldürür (MaxRequestsPerChild'e ek olarak bir korumadır). Sonuç, sunucunun sorunsuz çalışmasıdır. Zaten pek kullanılmamış sayfalara sahip değil ve kesinlikle delice temiz sayfalar sayfalama değil.
Antonis Christofides

@AntonisChristofides: Bundan aldığınız paket dersin ne olduğunu sandığınızdan emin değilim. Çözümünüz kesinlikle kötü bir çözümdür, çünkü nadiren erişilen kirli sayfaların fiziksel bellekten çıkmaması, altta yatan sorunu çözememesi nedeniyle performansı engeller ve OOM katilinin kritik bir işlemi öldürme riskini alırsınız. Uyardığım özel tehlikeyle karşılaşmadınız, ama takasınız olmadığından hala risk altındasınız.
David Schwartz

8
Değişken veya değmesiz OOM katili otomatik olarak çalışmaya başlamadan önce donar. Bu gerçekten düzeltilmesi gereken bir çekirdek hatasıdır (tüm disk önbelleğini bırakmadan önce OOM katilini daha önce çalıştırın). Maalesef, çekirdek geliştiricileri ve daha pek çok kişi bu sorunu göremiyor. Devre dışı bırakma / etkinleştirme, daha fazla RAM satın alma, daha az işlem yürütme, sınırları belirleme vb. Gibi genel öneriler, çekirdeğin düşük bellek kullanımının deve toplarını emdiği temel sorunu çözmez. Bu arada, sistem donduğunda hızlı bir şekilde iyileşmesini sağlayacak şekilde OOM katilini elle çalıştırmanızı (SysRq-F) öneririm.
Tronic
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.