Linux bellek dışı uygulama teardown kaçının


34

Bazen Linux kutumun hafızasının tükendiğini ve bununla başa çıkmak için rastgele işlemleri parçalamaya başladığını buluyorum.

Bundan kaçınmak için yöneticilerin ne yaptığını merak ediyorum? Bellek miktarını yükseltmek için tek gerçek çözüm (yalnız takasın yükseltilmesine yardımcı olacak mı?) Veya bunu önlemek için kutuyu yazılımla kurmanın daha iyi yolları var mı? (yani, kotalar veya bazıları?).


Burada bir cevap buldum: serverfault.com/questions/362589/… Patrick yanıtı çok öğretici
Amaury

Yanıtlar:


44

Varsayılan olarak Linux'un beyinde biraz zarar görmüş bir bellek yönetimi kavramı vardır: Sisteminizin sahip olduğundan daha fazla bellek ayırmanıza olanak tanır, daha sonra başınız belaya girdiğinde rasgele bir işlemi gerçekleştirir. (Öldürülenlerin gerçek anlamları bundan daha karmaşıktır - bunun iyi ya da kötü bir şey olup olmadığı hakkında birçok ayrıntı ve tartışma için Google "Linux OOM Killer").


Bir miktar akıl sağlığını hafıza yönetiminize geri yüklemek için:

  1. OOM Killer'ı devre dışı bırakın ( vm.oom-kill = 0/etc/sysctl.conf dosyasını girin)
  2. Hafıza aşımını devre dışı bırak ( vm.overcommit_memory = 2/etc/sysctl.conf
    dosyasını girin ) Bunun bir trinary değer olduğunu unutmayın: 0 = "yeterli RAM varsa, tahmin et", 1 = "Her zaman evet de", 2 = "hayır hafızasına sahip ""

Bu ayarlar Linux'un geleneksel şekilde davranmasını sağlayacaktır (eğer bir işlem malloc () işleminden daha fazla bellek isterse) başarısız olur ve bellek isteyen işlemin bu başarısızlıkla başa çıkması beklenir).

Yeniden yüklemek için makinenizi yeniden başlatın /etc/sysctl.confya da prochemen yeniden etkinleştirmek için dosya sistemini kullanın.

echo 2 > /proc/sys/vm/overcommit_memory 

11
Zekice tasarlanmış bir Linux değil, hafızayı tahsis eden programcılar asla kullanmayacak. Java VM'leri bununla ünlüdür. Java uygulamaları çalıştıran sunucuları yöneten bir yönetici olarak fazladan bir saniye olmadan hayatta kalamazdım.
Aleksandar İvaniseviç

11
Java programcıları kullanılmayan bellek ayırmazlar, java'da malloc yoktur. Sanırım bunu -Xms gibi JVM ayarlarıyla karıştırıyorsunuz. Her durumda, takas alanı ekleyerek sanal bellek boyutunu artırmak, aşırı yüklenmekten çok daha güvenli bir çözümdür.
jlliagre

5
Bu çözümün sisteminizin bellek tükenmesini veya öldürme işlemlerini durdurmayacağını unutmayın. Sizi yalnızca geleneksel Unix davranışına döndürecek, eğer bir işlem tüm hafızanızı yerse bir sonraki malloc'u deneyen herhangi biri (ve büyük olasılıkla çökmeyecek) olmayacaktır. Eğer şanssızsanız, bir sonraki işlem init (ya da kritik öneme sahip başka bir şey), OOM Katilinin genellikle önlediği bir şeydir.
pehrs

8
jlliagre, Java VM'leri (Sanal Makineler) dedim, Java programları değil, yönetici bakış açısıyla aynı olmasına rağmen :)
Aleksandar Ivanisevic

8
Belki de yukarıdakileri eklemenin /etc/sysctl.confmuhtemelen bir sonraki yeniden başlatmada etkili olacağından bahsetmeye değer ; eğer şimdi değişiklik yapmak istiyorsanız, sysctlkomutu root izinleriyle kullanmalısınız, örneğinsudo sysctl vm.overcommit_memory=2
nickgrim


3

Bir sunucu için kısa cevap, daha fazla RAM satın almak ve kurmaktır.

Rutin olarak yeterli OOM (Bellek Dışı) hatalarıyla karşılaşan bir sunucu , daha sonra VM (sanal bellek) yöneticisinin yanı sıra Linux çekirdeğinde sysctl seçeneğini aştığı için bu iyi bir şey değil.

Takas miktarını (çekirdek bellek yöneticisi tarafından diske yerleştirilmiş sanal bellek) kullanmak, mevcut değerlerin düşük olup olmadığına yardımcı olur ve kullanım, her biri büyük miktarda bellek yerine, bir veya birkaç her birini, mevcut toplam sanal belleğin (RAM + takas) büyük bir miktarını talep eden işler.

İkiden fazla zaman (2x) tahsis eden birçok uygulama için, takas olarak RAM miktarı, iyileştirme konusunda azalan getiri sağlar. Bazı büyük hesaplama simülasyonlarında, hızın yavaşlaması katlanılabilir ise bu kabul edilebilir.

RAM (ECC veya değil) mütevazı miktarlar için oldukça uygun, örneğin 4-16 GB, itiraf etmeliyim ki, bu problemi uzun zamandır yaşamıyorum.

Kullanarak da dahil olmak üzere bellek tüketimi bakarak en temelleri freeve tophafıza kullanım alışkanlıklarına en yaygın iki hızlı değerlendirmeler olarak, bellek kullanımına göre sınıflandırılmaktadır. Bu nedenle, her alanın bu komutların çıktısındaki anlamını en azından anladığınızdan emin olun.

Hiçbir uygulama spesifikasyonu (örneğin, veritabanı, şebeke servis sunucusu, gerçek zamanlı video işleme) ve sunucunun kullanımı (az sayıda güç kullanıcısı, 100-1000 kullanıcı / müşteri bağlantısı) ile ilgili olarak herhangi bir genel öneri düşünemiyorum. OOM sorunu.


3

Fiziksel bellek miktarını artırmak, her koşulda etkili bir yanıt olmayabilir.

Bunu kontrol etmenin bir yolu 'atop' komutudur. Özellikle bu iki çizgi.

Bu sağlıklı olduğunda sunucu dışarı:

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

Kötü çalışıyorken (ve fazladan siparişi 50 ile 90 arasında ayarlamadan önce, vmcom'un 50G'nin üzerinde iyi çalıştığını, birkaç saniyede bir patlayan süreçleri patladığını ve NFSd çocuk süreçlerinin patlaması nedeniyle yükün radikal bir şekilde sekmesini sağladığını görüyoruz. sürekli ve yeniden yaratıldı.

Kısa süre önce, çok kullanıcılı Linux terminal sunucularının sanal bellek tahsisini büyük ölçüde üstlendiği ancak istenen sayfaların çok azının tüketildiği durumları çoğalttık.

Bu kesin rotanın izlenmesi tavsiye edilmese de, aşırı bellek hafızasını varsayılan 50'den 90'a ayarladık, bu da problemin bir kısmını hafifletti. Tüm kullanıcıları başka bir terminal sunucusuna taşımak zorunda kaldık ve tüm avantajı görmek için yeniden başlattık.


2

Bir işlemin ölmeden önce talep etmesine izin verilen bellek miktarını azaltmak için ulimit kullanabilirsiniz. Sorununuz sunucunuzu çökerten bir veya birkaç kaçmak kaydıyla işlem yapıyorsa çok kullanışlıdır.

Sorununuz yalnızca ihtiyacınız olan hizmetleri çalıştırmak için yeterli belleğiniz olmaması durumunda, yalnızca üç çözüm vardır:

  1. Önbellekleri ve benzerlerini sınırlandırarak servisleriniz tarafından kullanılan hafızayı azaltın.

  2. Daha büyük bir takas alanı oluşturun. Performansta size mal olacak, ancak size biraz zaman kazandırabilir.

  3. Daha fazla hafıza satın al


0

Bu hata ile ilgili benzer bir sorun vardı ve çözüm daha eski / daha yeni (sabit) çekirdeği kullanmaktı.

Ancak o zamanlar makinemi yeniden başlatamadım, bu yüzden bir tür çirkin geçici çözüm kök olarak giriş yapmak ve bu komutla sistem önbelleklerini temizlemek oldu:

echo 3 > /proc/sys/vm/drop_caches

-5

@ voretaq7 linux beyin hasarlı hafıza yönetimi kavramına sahip değil, varsayılan olarak vm.overcommit_ratio 0,

0       -   Heuristic overcommit handling. Obvious overcommits of
            address space are refused. Used for a typical system. It
            ensures a seriously wild allocation fails while allowing
            overcommit to reduce swap usage.  root is allowed to
            allocate slightly more memory in this mode. This is the
            default.

Bu şekilde, eğer 4GB'lık bir ram varsa ve sanal bellek ile 4.2 GB'lık bir tahsis etmeye çalışırsanız, tahsisatınız başarısız olur.

Vm.overcommit_ratio = 1 ile

            1    -   Always overcommit. Appropriate for some scientific
            applications. Classic example is code using sparse arrays
            and just relying on the virtual memory consisting almost
            entirely of zero pages.

Vm.overcommit_ratio = 2 ile

           2    -   Don't overcommit. The total address space commit
            for the system is not permitted to exceed swap + a
            configurable percentage (default is 50) of physical RAM.
            Depending on the percentage you use, in most situations
            this means a process will not be killed while accessing
            pages but will receive errors on memory allocation as
            appropriate.

            Useful for applications that want to guarantee their
            memory allocations will be available in the future
            without having to initialize every page.

Bu nedenle, varsayılan olarak linux fazla zorlamaz, eğer uygulamanız daha fazla hafıza varsa, belki de kodunuz buggy demektir.


2
Burada kendinle çelişiyorsun. En üstte "varsayılan olarak vm.overcommit_ratio 0" deyin ve sonra en alttaki "varsayılan linux aşırıya kaçmıyor" diyorsunuz. İkincisi doğru olsaydı, vm.overcommit_ratio varsayılan olarak 2 olur!
Michael Hampton

vm.overcommit_ratio = 0, malloc, fiziksel ramınızdan daha fazla bellek ayırmaz, bu yüzden benim için aşırıya kaçma anlamına gelmez,
aşırıya kaçma

2
Evet, yanlış anladınız.
Michael Hampton

yanlış anladınız, varsayılan 0, ramdan daha fazla sanal bellek tahsis etmek için tahsis etmiyor ve 2 geçmiyor vm.overcommit_ratio + takas alanına izin veriyor, bu yüzden yanlış anladığımı söylersem
c4f4t0r 10:13

2
Tabii ki. Açık bariz komisyonlar reddedildi. Gerisi geçer. Daha dikkatli okumalısın.
Michael Hampton
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.