Bir şey tüm belleği yiyor (bazı uygulamalarda bellek sızıntısından şüpheleniyorum). Ne tespit edilir?


16

Liquidsoap + icecast paket ve basit bir web sitesi (httpd + mysqld) çalıştıran sunucum var. Özel birşey yok. Günde ortalama 2000+ ziyaretçi, ortalama 50 civarında eş zamanlı olarak çevrimiçi oluyor.

Sunucuda 8GB RAM var. Zaman geçtikçe, sunucuda yeni bir şey başlatılmamasına ve yeni kullanıcı olmamasına rağmen, boş bellek miktarı sürekli olarak azalır. Bir noktada takas etmeye başlar, sunucudaki yük artar ve yanıt vermez hale gelir. Genellikle yaptığım sadece sunucuyu yeniden başlatmak ...

Neyin hafızayı tam olarak sızdırdığını tespit etmek için ne yapılabilir? Kaynakların kullanımını izlemek için üst kısmı kullanıyorum, ancak gördüğüm kadarıyla yararlı bir şey göstermiyor:

resim açıklamasını buraya girin

Bu kadar hafızayı neyin kullandığını öğrenmenin bir yolu var mı? veya diske yoğun bir şekilde takas yapmaya ne başlar? Sunucuyu yeniden başlatmadan belleği boşaltmanın herhangi bir yolu var mı?


Sunucu yerine bazı hizmetleri (apache, liquidsoap) yeniden başlatmayı denememenizin herhangi bir nedeni var mı?
jamespo

Başlangıçta normal bellek kullanımı için yanıt verdim. Sorunu tanımlamaya yardımcı olabilecek bir dizi araçla güncelledim.
BillThor

@jamespo, aslında bunu denedim, ama hiçbir etkisi olmadı, bu yüzden yardımcı olabileceğini bildiğim tek şey yeniden başlatma oldu.
jayarjo

Önbelleğe alınan 4027092k bellek kullanımını açıklamalı, değil mi? Şu anda başka bir yerde benzer bir sorun üzerinde çalışıyorum ve şimdiye kadar bellek transferi aşağıdaki parametreler ile düzenlenebilir anlamaya başardı: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Bu tam bir düzeltme ve herhangi bir geri bildirim değil en hoş geldiniz. Umarım gitmek için doğru bir yön.

Yanıtlar:


16

topBellek boyutlarını periyodik olarak bildirmek için toplu modda çalıştırmak , işler güneye gittiğinde kimin belleği kullandığını görmek için kullanılabilir. Basamak sartoplu modunda bellek kullanımı ve ilgili I / O üzerinde bazı iyi teşhis vermelidir. Koşu muninsistemini izlemek üzere bazı için kullanılan hangi bellek üzerinde iyi ayrıntılarla bir grafik vermelidir. Bu çok yardımcı olabilir.

Programların maksimum çekirdek boyutunu sınırlamak için limit.conf kullanabilirsiniz. Düzgün ayarlandığında, bu, bellek sızıntısı olan tüm programları öldürmelidir. Bu pam_limits modülü ile çalışır. Sınırlar ulimitskomutla da ayarlanabilir .

Büyük miktarda bellek kullanabilen birkaç program çalıştırıyorsunuz. Bakabileceğiniz bazı şeyler var.

  • Kötü çalışan programlanmış uygulamalar apache2bellekte sızıntı yapabilir. Bu olduğunda bellek boyutunun arttığını görmelisiniz. MaxRequestsPerChild100'e kadar ayarlayarak belirli bir sayıda kullanımdan sonra çocukları geri dönüştürmek için apache2'yi ayarlayabilirsiniz . Bu sorunu çözüyorsa, sızıntıyı çözmeniz gerekir. Önce bunu izlerdim.
  • MySQL, verileri belleğe yüklemeyi deneyebilir. Bellekte çok fazla veri varsa, bu biraz daralmaya neden olabilir, ancak gördüğünüz kadar dramatik olmamalıdır.
  • Büyük bir tmpfsdosya sisteminiz varsa, dosyalar kullanıldığında silinmezse bellek sızdırabilirsiniz. Büyük uzun ömürlü dosyalar da sorun olabilir.
  • Sorun kabaca günün aynı saatinde ortaya çıkarsa, bellek sızdıran zamanlanmış bir programınız olabilir.
  • Paylaşılan belleği ayıran ancak çıkmadan önce serbest bırakmayan bir programınız varsa, nispeten görünmez bir bellek sızıntısına sahip olursunuz. Paylaşılan bellek belleğe kilitlenmişse, değiştirmeye zorlayabilir. Kullanılabilir paylaşılan hafıza miktarı tipik olarak nispeten sınırlıdır.
  • Liquidsoap + icecast paketi bellek kullanan tamponlama sorunlarıyla karşılaşabilir. Bu kombinasyonu kullanmadım, bu yüzden nasıl görüneceğinden emin değilim.

Normal bellek kullanımı: Boş bellek çok istediğiniz bir şey değildir. Sisteminiz uzun zamandır çalışıyorsa ve çok fazla boş belleğe sahipse bir şeyler yanlıştır. Bir dosyayı her okuduğunuzda veya yazdığınızda, bloklar arabellek önbelleğine girer. Bu, boş belleğinizi azaltacaktır ve iyi bir şeydir. Sistem, başka bir yere bellek bakmadan birkaç programı başlatmak için yeterli boş alan sağlayacaktır. Birçok program hızlı çalıştığından, çalışmayı durdurduklarında bellekleri boş havuza geri gönderilir.

Arabellek önbelleğindeki bir dosyayı okuduğunuzda, disk erişimi gerekmez ve okuma arabelleği önbelleğinden çözülür. Yazmalar benzer bir mekanizma kullanır. Sisteminizin belleğe ihtiyacı varsa, arabellek önbelleği kullanılan ilk yerlerden biridir. Çoğu tampon derhal serbest bırakılabilir.

Bellek sızıntısı varsa, boş bellek görürsünüz ve tamponların her ikisi de küçülmeye başlar. Sızan bellek nihayet takas alanına taşınması gerektiğinden, bu hala ciddi bir sorun değildir. Siz takas alanını doldurana kadar sisteminiz hala iyi çalışır ve kalan boş alanı programların başlatılamayacağı noktaya kadar çeker. Az miktarda takas alanının kullanılabilmesi tipiktir.


Benim durumumdaki sorun biraz garip. Yük çok büyük olsa ve sunucu yoğun bir şekilde değişse bile, bol miktarda boş bellek var (tamponlar ve önbellekler hakkında okuduktan sonra anladığım gibi). top, bellekte artan bir süreç göstermiyor. Ancak yükleme artar ve bir noktada sunucu kullanılamaz hale gelir: | Detaylı cevap için teşekkürler.
jayarjo

2
@jayarjo: Munin ve sar neler olup bittiğini tespit etmeye yardımcı olmalı. Çok fazla boş belleğiniz varsa, değiştirmemelisiniz. Farklı bir G / Ç sorununuz olabilir. sarhangi bölümün G / Ç'ye sahip olduğunu belirlemeye yardımcı olur ve sorunu keşfetmeye yardımcı olabilir.
BillThor

MaxRequestsPerChild
Advice

11

RAM kullanımı ile ilgili en iyi 10 uygulamayı görmek için bu komutu kullanabilirsiniz:

ps -A --sort -rss -o comm,pmem | head -n 11

Bazen bu komut birçok alt işlem oluşturulduysa size yardımcı olur:

ps auxf

Bu şekilde hangi işlemlerin bir araya geldiğini görebilirsiniz.


Bunlar kullanışlı komutlar, teşekkürler onları gelecek için not edeceğim. Ancak sorun, her zaman üstte aynı işlemler olması (bunları ekli ekran görüntüsünde görebilirsiniz) - apache, mysql, liquidsoap, icecast. Ve sunucu yükü ölüyor olsa bile, aynı miktarda bellek (gerçekten ihmal edilebilir) kullanırlar (veya en azından kullandıkları gösterilir) |
jayarjo

@jayarjo: Süreç sayısı değişiyor mu? Çok daha fazla süreciniz var mı? Fiziksel bir sunucu mu yoksa sanal bir sunucu mu?
Raffael Luthiger

İşlem sayısında bir değişiklik fark etmedim. Temelde üst yaptığımda, sunucu yükü ölürken büyük yük dışında, orijinal soruya eklediğim için çok benzer bir resim görüyorum: | Sunucu fizikseldir.
jayarjo

2
"Vmstat" ile daha fazla bilgi edinmeye çalışın (örn. Vmstat -s). Veya daha önce bahsedilen araç "sar" ile. RAM tabanlı bir dosya sisteminiz var mı? O zaman belki "iostat" daha fazla bilgi verebilir.
Raffael Luthiger

1
Bir bellek sızıntısı tespit etmeye çalışırken "pmem" (% MEM) alanı psveya topçıktı bakmak doğru şey olup olmadığından şüphe duydum: Bu sadece işlem şu anda kullanmakta fiziksel bellek yüzdesi değil mi? Ancak işlemin kullanılan (sızan dahil) hafızasının diğer kısımları değiştirilebilir. Belki bir işlemin büyüklüğünü ölçmek için "boyut" veya "boyut" daha uygun olabilir? Örn, ps -A --sort -size -o comm,size | head -n 11veyaps -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev

8

Hiçbir şey bu belleği uygulamalar açısından kullanmıyor.

Gerçek bellek kullanımınızın program kullanımı açısından ne olduğu hakkında daha iyi bir fikir edinmek için sayfa önbelleğini temsil eden 'önbellek' değerini düşmeniz gerekir.

Temelde bu iyi bir bellek yönetimi ve ideal olarak bu ne istiyorsun.

Daha fazla bilgi için buradaki bağlantıya bakın: http://www.linuxatemyram.com/


evet bu bağlantıyı buldum ve tamponlar ve önbellekler hakkında okudum, ama okuduğumdan alabildiğim kadarıyla değişime neden olamazlar, değil mi?
jayarjo

@jayarjo Ben orada ne olduğunu anlamak için o zaman sorunu gösteren istatistiklere ihtiyacımız olacağını düşünüyorum. Verdiğiniz numaralar takas veya çok fazla gerçek bellek kullanımını göstermiyor.
Matthew Ife

1

Ben bu konuda bir profesyonel değilim, ama sıvı sabun + icecast multimedya ile ilgili. Sistem serbest olduğunda, gelecekteki kullanımlar için belleği önbelleğe alır ve / veya kaplar. Ve trafik günün belirli bir saatinde / belirli bir süre içinde artarsa, değiştirmeye başlayacaktır. Bu noktada, istekler (içeriği görüntüleyen kullanıcılar) artarsa, gerekli kaynaklar 8 GB'den fazla koç olacaktır.

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.