Soru Bir sunucunun bellekte ne zaman yetersiz olduğunu belirlemek için hangi metriği kullanmalıyım?


Bir Linux makinesinde bellek kullanımı için çok sayıda (yüzlerce?) Farklı önlem vardır, ancak bir sunucunun daha fazla belleğe ihtiyacı olup olmadığını belirlemek için kullanılabilecek iyi bir sezgisel / metrik nedir?

Bazı fikirler:

  • Memtotal - Aktif - Inaktif / proc / meminfo'dan "kablolu" hafıza ölçüsü olarak bakma
  • Ps'deki tüm süreçlerden RSS değerlerinin toplamına bakma
  • Committed_AS dosyasına / proc / meminfo

5
2017-10-11 05:33


Menşei


Hafıza basıncını tespit etmenin bir yolu var. /proc/meminfo ve /proc/vmstat): stackoverflow.com/a/3031924 - Tobu


Cevaplar:


Buna doğru bir cevap yok.

Peter, bakmak istediğiniz değerlerin en üstte ve ücretsiz olarak bildirildiğini söylemekte doğrudur. kaynak kodu Bu değerleri 'C''den nasıl alacağınızı gösteren procps paketi için - ancak betikler için' ücretsiz 'çalıştırmak daha basittir.

Sistem kullanılmayan belleği (ilk çıktı hattı ücretsiz) varsa, daha fazla bellek ekleyerek çok daha hızlı alınamaz - ancak VFS önbellek basıncını azaltarak daha hızlı olabilir (daha uzun süre önbelleklerde saklayın).

Doğru bir cevap olmamasına rağmen, birçok yanlış kullanıcı var - hangi sayfaların paylaşıldığını ancak farklı konumlardan erişilebildiğini kullanıcılardan anlatamazsınız - hafıza kullanımının ne kadar boş olduğunu belirlemek için bellek kullanımına bakmak yeterli değildir.

Bir başlangıç ​​noktası olarak, 'ücretsiz' tarafından bildirilen ücretsiz bellek için iki değere bakmanız gerekir.


2
2017-10-11 08:56





Gerçekten de her şey uygulama (lar) a bağlıdır, ancak hafızayı yönetmek için ana bilgisayar yeteneği hakkında genel bir genel bakış vermesi gereken bellek basıncını belirlemek için çekirdek tarafından kullanılan yöntemi kullanabilirsiniz.

Hafıza basıncı idealdir çünkü sayfa önbelleği, swappiness ve hatta ne kadar hafızaya sahip olduğunuz hakkında endişelenmenize gerek yoktur.

Hafıza basıncı etkin bir şekilde kaç sayfanın aktif olarak işaretlenmesini istediğinin bir sayısıdır. / Proc / meminfo. Çekirdek, sayfa tablosunda kaç sayfadan 'etkin' olandan 'etkin' duruma geçtiğini izleyerek bellek basıncını ölçer. Bu iki durum arasında çok fazla değişiklik olması, muhtemelen daha fazla sayfa etkin hale getirmek için çok fazla boş belleğinizin olmadığını gösterir.

Düşük bellek basıncı, etkin olmayandan etkinliğe çok az sayıda promosyonun gösterilmesiyle gösterilir (çünkü çekirdeğin etkin sayfaların etkin kalmasını sağlamak için yeterli alana sahip olması nedeniyle).

Bu komut, her PERIODIC saniyede basıncı ölçecektir. Daha fazla veriyi daha iyi toplayabilirsiniz. Buradaki fikir, verileri grafik olarak çizip Y ekseninizi merkezde 0 ile sabitlemenizdir. İdeal koşullarda, grafik 0'dan sonra yatay bir çizgi olmalıdır. Çizgiler düzenli olarak 0'ın dışına çıkarsa (özellikle 'Aktif' pozitiftir, veya düzenli olarak oldukça yüksek), ana bilgisayardaki bellek basıncı yüksektir ve daha fazla bellek faydalı olur.

#!/usr/bin/python
import os
import sys
import re
import time

PERIODIC = 1
pgs = re.compile('Active:\s+([0-9]+) kB\nInactive:\s+([0-9]+) kB')
meminfo = open('/proc/meminfo')

def read_meminfo():
    content = meminfo.read(4096)
    m = pgs.search(content, re.M)
    active, inactive = int(m.group(1)), int(m.group(2))
    active = active / 4
    inactive = inactive / 4
    meminfo.seek(0, 0)
    return active,inactive  

if __name__ == "__main__":
    oldac, oldin = read_meminfo()
    while True:
        time.sleep(PERIODIC)
        active, inactive = read_meminfo()
        print "Inactive Pressure:\t%d" % (inactive - oldin)
        print "Active Pressure:\t%d" % (active - oldac)
        oldac = active
        oldin = inactive

2
2017-10-11 14:34





Komutu çalıştırabilirsin top bellek kullanımı da dahil olmak üzere linux'daki tüm önemli bileşenlerin genel görünümünü görmek için. İlk kez ilk kez görüntülendiğinde, kullanılan belleğin varsa arabellekleri ve önbelleği içerdiğini unutmayın.

Ayrıca var freebellek için komut. Gibi yürütebilirsiniz free -m belleği megabayt olarak görüntülemek için

Daha birçok araç var, ama bu sorunun araç kısmını yeterince yanıtladığını düşünüyorum.

Daha fazla belleğe ihtiyacınız olduğunda, çalıştırdığınız uygulamaya bağlıdır. Patlama kapasitesine ihtiyacı var mı? Büyük bir önbellek boyutundan çok yararlanıyor mu? Ama genellikle, takas ve sık sık isabet ediyorsanız, gerçekten daha fazla koça ihtiyacınız var.


1
2017-10-11 05:45



Teşekkürler Peter. Temel linux araçlarını kullanmak yerine, algoritmik olarak zaman içinde izleyebildiğim ve bir sunucunun daha fazla belleğe ihtiyaç duyacağını tahmin edebilecek tek bir "RAM sağlığı" ölçüsü oluşturmaya çalışıyorum, eğer takas atıyorsam, muhtemelen çok geç olur. - loopj
@loopj Hmm ... şimdi ne sorulduğu konusunda kafam karıştı. Bellek belirli bir noktaya geldiğinde beklenen zamanı grafiklemeye mi çalışıyorsunuz? Yine de, temel linux araçlarının veya meminfo'nun çıktılarını alabilir ve bunları otomatik veya manuel olarak zamanla çizebilirsiniz. Belki de noktanızı daha da netleştirmelisiniz. Ya da nagios gibi çözümleri izlemek için mi arıyorsunuz? Hangi uygulamayı kullanıyorsunuz? Ya da jenerik olmaya mı çalışıyorsun? Senaryoyu anlamıyorum. - Grumpy


Ben senin yerinde olsaydım, yük, boş hafıza, free -m ve sunucunuzun ana performans karakteristiği (ör. istek başına gecikme) ve Calc / Excel'de çizilen, çeşitli veri noktaları için "swapout cliff" (bellek konfigürasyonları - 8 G, 16G, 32G vb.). Sonra, "uçurum" ve mevcut bellek arasındaki bağlantıyı bulmak için çeşitli regresyonları deneyeceğim.

Mevcut literatürde bir arama CiteSeerX ayrıca yardımcı olur.


1
2017-10-11 09:22





Bunu daha önce de söyledim, gerçek zamanlı bellek gereksinimini elde etmek için en iyi ölçü, / proc / meminfo içindeki COmmitted_AS alanını gözlemlemek ve ihtiyacınız olan bellek miktarını görmek için zamanla karşılaştırmaktır.

Teorik olarak, eğer Committed_AS'iniz daima (Memfree + swapfree) 'den fazla ise, o zaman siz iyisiniz. Fakat bundan daha azsa ve iş yükünüzü zaman içinde sistemde biriktirirseniz, OOM durumuna doğru yaklaşıyorsunuz demektir. Committed_AS değeri, sisteme tüm bellek istekleri bu anda verildiğinde sistem için ne kadar bellek gerektiğini belirler.

Bunu izlemek, RAM'i artırmanız gerekip gerekmediğini görmek veya iş yükünü azaltmanız gerekip gerekmediğini görmek için zaman içinde iyi bir ölçüdür.


1
2017-10-11 09:47



Committed_AS teorik bir tahmindir, bellek baskısı ile ilgili değil, pratikte gerçekten gerçekleşmeyen bir OOM durumunun olasılığı ile ilgilidir. - Tobu
Teorik olarak söylediğimde söylediğim buydu. Tüm bellek ayırmalarının herhangi bir zamanda verilmesi durumunda, sistemin oOM'a% 99,99 durumlarında gitmemesi için ne kadar bellek gerektiğini belirtir. - Soham Chakraborty
Committed_AS kesin bir tahmin değilse, "gerçek RAM> Committed_AS tutmak" başparmak kuralı benim için asla başarısız oldu. Bazen rasgele o miktara (VM'ler ile kolay) üzerinden gidiyorum ve sistemlerin nasıl ele alındığı konusunda ölçülebilir bir fark göremiyorum. şimdiki ekstra ram ile iş yükü. Maksimum olası iş yükü elbette değişecektir, Committed_AS sadece mevcut olanı tahmin etmektir. - Luke404
if your Committed_AS is always over than (Memfree+swapfree) then you are fine. Olmamalı daha az kullanılabilir hafıza Daha büyük bir taahhüt edilen değer, en kötü durum senaryosunda yerine getirilemeyen bir taahhüdü gösterir, doğru mu? - Isaac
@ Luke404 daha fazla gerçek RAM varsa Committed_AS Gerçekten gerekli olandan daha fazla RAM var. Açıkçası OOM durumlarını bu durumda almazsınız. Sistemimde Committed_AS RAM + takastan daha büyük birleşik var. - Mikko Rantalainen