2011-03-28 31 views
14

Meminfo ve ps arasında bir bellek kullanımı tutarsızlığı alıyorum. Free, süreçlerin görünüşe göre ps'ye göre kullanıldığından daha az boş bellek olduğunu bildiriyor.Linux bellek raporlama tutarsızlığı

ücretsiz göre, sadece 3188mb özgür vardır: Ancak

ps -A --sort -rss -o comm,pmem,rss 

COMMAND   %MEM RSS 
mysqld   13.1 2062272 
java    6.2 978072 
ruby    0.7 114248 
ruby    0.7 114144 
squid   0.1 30716 
ruby    0.0 11868 
apache2   0.0 10132 
apache2   0.0 9092 
apache2   0.0 8504 
PassengerHelper 0.0 5784 
sshd    0.0 3008 
apache2   0.0 2420 
apache2   0.0 2228 
bash    0.0 2120 
sshd    0.0 1708 
rsyslogd   0.0 1164 
PassengerLoggin 0.0 880 
ps    0.0 844 
dbus-daemon  0.0 736 
sshd    0.0 736 
ntpd    0.0 664 
squid   0.0 584 
cron    0.0 532 
ntpd    0.0 512 
exim4   0.0 504 
nrpe    0.0 496 
PassengerWatchd 0.0 416 
dhclient3  0.0 344 
mysqld_safe  0.0 316 
unlinkd   0.0 284 
logger   0.0 252 
init    0.0 200 
getty   0.0 120 

:

free -m 
      total  used  free  shared buffers  cached 
Mem:   15360  13273  2086   0   79  1022 
-/+ buffers/cache:  12171  3188 
Swap:   0   0   0 

Ben hafıza ps kullanarak nereye gittiğini (non 0 RSS değerlerin altına snipped) izini deneyin RSS sütun neredeyse 12GB serbest bırakmalısınız yalnızca yaklaşık 3287mb toplam bellek kullanımına yol açar kadar ekleme gibi, bu mantıklı değil!

Amazon AWS üzerinde çekirdek 2.6.16.33-xenU # 2 SMP x86_64 kullanıyorum.

Hafızam nereye gidiyor? Bunu takip etmek için biraz ışık tutabilir mi?

+5

http://www.linuxatemyram.com/ – Erik

+0

Bu da muhtemelen unix.stackexchange.com için daha uygun olacaktır. Yine de iyi bir soru ve Erik'ten oldukça ilgi çekici (kısa bir yorum) yorumu.Ayrıca, sadece Fedora sistemimde, sadece 4GB'lık en yüksek raporlar bulunurken, serbest -m komutunun (Erik'in linkinden) 7GB civarında ücretsiz olduğunu fark ettim. gnome-system-monitor ayrıca disk önbelleğe almayı da hesaplar. –

+6

Bu linuxatemyram.com ile aynı sorun değil. Dikkatle tamponlar/önbellek serbest sütundan doğru olan 3188mb ücretsiz alıntı yapıyorum. –

cevap

21

Döşeme önbelleğinin kullanımını kontrol edin (Slab:, SReclaimable: ve SUnreclaim:, /proc/meminfo). Bu, çekirdek içi veri yapılarının önbelleğidir ve free tarafından bildirilen sayfa önbelleğinden ayrıdır.

levha önbellek sizin "kayıp bellekten" büyük bir kısmının sorumlusu olarak ise

, gitti nerede olduğunu görmek için /proc/slabinfo kontrol edin. Eğer takma dişler veya inode'larsa, onlardan kurtulmak için sync ; echo 2 > /proc/sys/vm/drop_caches'u kullanabilirsiniz.

Ayrıca dostça bir biçimde Slab önbellek geçerli kullanımı göstermek için slabtop aracını kullanabilirsiniz. c, listeyi geçerli önbellek boyutuna göre sıralayacaktır.

+0

Bu çözümdür. Bu önbellek için çekirdeği boş/boş hafızayı kullanmanın bir yolu olup olmadığını merak ediyorum. Uygulamaların buna ihtiyacı varsa, belleğin bu önbellekten geri kazanılacağını varsayalım, ancak bellek izleme araçları bunu hesaba katmıyor gibi gözüküyor, böylece boş bellek kalmadığı için bana bağırıyorlar. –

+1

@Zoltan: Emin değil. Bu, Yığın Taşması olmak üzere, bellek izleme aracını "SReclaimable" ekleyeceği şekilde düzeltmeyi öneririm. Aslanın kullanım payından hangi slab girişi sorumluydu? – caf

+0

Aslında bu cevabı almak için giriş yaptım. Uygulamalarının en fazla 300 MB tükettiğinde 1,6 GB RAM kullandığını (2 GB'lık bir durumdan endişe verici) bildiren bir sunucu yaşadım. “Echo” çözdü (190 * gerçek * MB'leri kullandı). Kök neden, muhtemelen /var/log/dovecot/dovecot.log.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.gz.2 gibi adlarla milyonlarca dosya yaratan yanlış yapılandırılmış bir logrotate betiğiydi. gz. Bazen, Linux'ta, Alacakaranlık Bölgesine ve geri gidiyoruz gibi geliyor. –

3

Kullanılan bellek miktarını almak için RSS veya VSZ sütunlarını ekleyemezsiniz. Maalesef, Linux'taki bellek kullanımı bundan daha karmaşıktır. Daha ayrıntılı bir açıklama için, paylaşılan kitaplıkların süreçler arasında nasıl paylaşıldığını açıklayan Understanding memory usage on Linux'a bakın, ancak ps gibi araçlar tarafından iki kez sayılır.

ben daha fazla ayrıntı gerekiyorsa her zaman kaynak kodu kazıp nasıl serbest görüntülediği numaraları hesaplar ama hazırlıksız bilmiyorum.

+0

Bu çok bilgilendirici bir bağlantıydı. Teşekkürler – Sk606

1

Paylaşılan bellek değerlerini kaçırdığınızı düşünüyorum. Bence ps, paylaşılan RAM'i RSS alanının bir parçası olarak rapor etmiyor. Görmek için top RES alanıyla karşılaştırın.

Tabii ki paylaşımlı RAM'i eklerseniz, ne kadar eklersiniz? Paylaşıldığı için aynı RAM birçok farklı sürece itibar edilmiş görünebilir.

/proc/[pid]/smaps dosyalarının yaratıcı ayrışmasıyla bu sorunu çözmeye çalışabilirsiniz.

Ama yine de, bu sizi sadece yolun bir parçası haline getiriyor. Bazı bellek sayfaları paylaşılır, ancak yerleşik olarak kaydedilir. Bu sayfalar, fork() numaralı telefondan sonra paylaşılır. Herhangi bir zamanda paylaşılmayanlar olabilirler, ancak toplam kullanılan sistem RAM'lerine sayılmazlar. Programın smaps dosyası da bunları göstermiyor.

+0

Bu durumlarda, eklenen RSS belleği çok düşük değil, çok yüksek olmamalıdır? –