Linux neden “boş” belleği garip bir şekilde rapor ediyor?


44

Bu, Unix işletim sistemlerinin bellek kullanımını nasıl rapor ettiği ile ilgili kanlı bir sorudur .
Benzer sorular:

Debian 6.0.6 Squeeze çalıştıran üretim sunucum var

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Her gün cron yedekleme betiğini root olarak çalıştırır:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Her şey mükemmel çalışıyor, ancak Munin'in hafıza grafiğinin , yedeklemeden sonra önbellek ve arabellek artışı gösterdiğini fark ediyorum .

Sonra sadece yedek dosyaları indirir ve silerim. Silme işleminden sonra Munin'in hafıza grafiği önbellek döndürür ve yedeklemeden önceki durumuna arabellekleri gönderir .

İşte Munin grafiği:

Dışarıda barındırılan görüntü ölü bir bağlantıydı.


3
Tebrikler, bu soru kanonlandı (bugün bunu sormak için 6. soruya benziyor ve en ilginç ve en güzel örneğe sahip olacak gibi görünüyor :-)
voretaq7

Yanıtlar:


27

Bu, Server'ın takas bölümünü ve bu sitedeki diğer birkaç benzer soruyu kullanmayı reddettiği gibi aynı "problem" dir . ( Yüksek Bellek Linux Server Kullanımı , LINUX Bellek Kullanımı , Bellekteki Düşük Running Web Sunucusu , vs.)

Bellek tüketiminin önbellekten geldiğine dikkat edin . Bu, bir dosyayı bellekte tuttuğu anlamına gelir. Önbelleğe alınmış hafıza "boş" hafızadır. Bellek bloğunu boş bırakmak yerine, işletim sisteminiz son zamanlarda o alanda dosyaları okuyor. Bir uygulama bu belleğe ihtiyaç duyuyorsa, uygulama tarafından kullanılacaktır. O zamana kadar, sıkça başvuruda bulunulursa, diskten bir dosyayı tekrar okumak zorunda kalmamanızdan kurtulma şansınız olur.

Bu grafiğe göre, etkili bellek tüketiminiz grafiğin tamamı boyunca hiç değişmedi.


Sunucuya bu dosyaları önbelleğe almaması talimatını vermek mümkün müdür? Sanırım sync; echo 3 > /proc/sys/vm/drop_cachesyedeklemeden sonra kaçmalı mıyım?

13
@ stan31337 Evet, mümkün, hayır bunu yapmamalısınız . Bu dosyayı hafızada bulundurmak size hiçbir masraf getirmez Tüm önbelleklerinizi temizlerseniz, önbelleğe alınan ve diskten yeniden okunması gereken her dosya sisteminizi yavaşlatır. Yapmak için tasarlandığı şeyi yapmasına izin verin.
Jeff Ferland

2
@ stan31337 Yedekleme dosyanızı sildiğinizde, işletim sistemi otomatik olarak önbellekten dışarı çıkar (bu nedenle, boş hafızanız silindikten sonra tekrar atlar) - Linux açık olmayan ve açamayan bir dosyanın olduğunu bilecek kadar zekidir dosya sisteminden erişilemez ağacı bir daha asla erişilemez. Jeff'in dediği gibi, kesinlikle tüm FS önbelleğinizi boşaltmak istemediğinizi söyleyin (sistem, bu verileri diskten yeniden okuyup yeniden önbelleğe almak zorunda
kalır

61

Linux Benim Ram'ım Yedi sorununu yaşıyorsun .

Panik yapma.

Bu sorun değil.

Sisteminiz Tasarlandığı Gibi Çalışıyor.

Sorun işletim sisteminiz değil - sorun “boş” belleğin ne olduğunu anlamanızdır.


Unix sistemleri sadece çalışan programlardan daha fazlası için bellek kullanır. Bellek aşağıdakiler için kullanılabilir:

  • Çalışan programlar (aktif / kullanılmış)
  • Transit veride tamponlama (tamponlar)
  • Önbelleğe alma son zamanlarda okunan / diske yazılan verileri önbellek
  • Kesinlikle hiçbir şey (ücretsiz)

Aşağıdaki, modern Unix sistemlerinin RAM kullanımını nasıl rapor ettiği ile ilgili kısa (ve büyük ölçüde eksik) bir tur.

Boş hafıza nedir (işletim sistemi tanımı) ?

Bir Unix sistemi RAM’i Ücretsiz olarak rapor ederken, "Bu RAM’i hiçbir şey için kullanmıyorum" anlamına gelir.
Ücretsiz RAM etkin bir şekilde işe yaramaz - Sisteminizi daha hızlı hale getirmiyor, sadece bir şeyin ihtiyaç duyması durumunda "özgür" olarak oturuyor. Bir şey yukarıda bahsettiğim diğer üç maddeden herhangi biri olabilir.

Önbellek ve Arabellek nedir?

Önbellek ve Arabellek belleği, sisteminizi daha hızlı hale getirmek için işletim sisteminin kullandığı RAM'dir. Şu anda programları çalıştırmak için
bu bellek gerekli değildir , bu nedenle işletim sisteminiz sık kullanması gereken verileri tutmak için kullanıyor - örneğin C kütüphanesi (çalıştırdığınız hemen hemen her program tarafından gerekli) neredeyse her zaman cachebellekte tutulur , yani Sistem, ekranda "Hello World" yazdırması için gereken talimatları bulmak için diske gitmek zorunda değildir.
Aslında bundan çok daha karmaşık - paylaşılan hafıza, kablolu hafıza vb. - ama amaçlarımız için bu basit açıklama yeterli.

Aktif bellek nedir?

Aktif bellek, "kullanılmış" bellek - uygulamaların ne yapıyorlarsa kullandıkları RAM - elektronik tabloları sıralama, web sayfaları sunma, grafik düzenleme vb.
" Olarak anlıyoruz. " Aktif "bellek son zamanlarda" etkin "oldu - - içeriğini kullandığını iddia eden program (okuma veya yazma) ve takas için iyi bir aday olarak kabul edilmez.

Aktif olmayan hafıza nedir?

Etkin bellek gibi, Etkin olmayan bellek de uygulamaların ne yaparlarsa kullandığı RAM'dir. Aradaki fark, bu belleğe bir süredir erişilemedi, bu yüzden eğer itme işletim sistemi zorlamak için gelirse, diske ve (biraz şans ile) değiştirilebileceğini iddia eden program tekrar isteyip istemediğini iddia ediyor. asla farketmeyeceğim.

"Kullanılmış" bellek nedir (İNSAN tanımı)

Sizin ve benim "Kullanılmış" bellek olarak düşündüğümüz şey, esas olarak, Aktif ve Aktif Değil belleğin toplamıdır. Tüm RAM şu anda kullanımlarında uygulamalar tarafından talep edildi.
Aktif ve Aktif Değil hafızasının toplamından daha fazla RAM yüklü olduğu sürece (artı 512-1024 MB’lık iyi bir güvenlik marjı), iyi bir yerdesiniz: İşletim sisteminiz büyük olasılıkla takas ve çarpma performansını düşürmeyecek .

"Boş" hafıza (İNSAN tanımı) nedir?

Sizin ve benim "boş" hafıza olarak düşündüğümüz şey programları çalıştırmak için mevcut hafızadır.
Bu, işletim sisteminizin rapor ettiği "Ücretsiz" rakamdan biraz daha karmaşıktır. Bir program RAM istediğinde, işletim sistemi bu RAM'i olabildiğince yıkıcı bir şekilde almaya çalışacaktır:

  • Boş hafıza varsa (hiçbir şey yapmadan otururken) bu RAM tahsis edilecektir.
  • Boş hafıza yoksa, işletim sistemi Önbellek ve Arabellek alanını yamyamlaştırır: Arabellek havuzundaki en yakın zamanda / en sık erişilen şeyler atılır ve programa verilen RAM verilir.
  • Takas makinesini yamyamlaştırmak için bir Tampon / Önbellek RAMi yoksa, etkin olmayan belleğe bakacak ve erişilmesinin en az muhtemel olduğunu düşündüğü bölgeleri seçecektir. Bu veriler takas (disk) ve programa verilen yeni-serbest bırakılmış RAM'le dışarı aktarılır .
  • Tüm Aktif Olmayan RAM'leri değiştirilmişse, swapper Aktif RAM'i diske yerleştirmeye başlayacaktır.
    (Bu, performansın genellikle köpeklere gittiği yerle ilgilidir: Bir program CPU'yu her açışında, değiştirilen bitlerinin RAM'e geri getirilmesi gerekir, bu da başka bir programın Aktif belleğinin çıkarılması gerektiği anlamına gelir . takas işleminde yüksek devir hızı denir )
  • Sistem yapabileceği her şeyi değiştirmişse (ve takas bölümünü doldurmuşsa) veya takas bölümü olmayan bir sistemi kullanıyorsanız , Kötü Şeyler olur. Bu noktada iki şeyden biri gerçekleşecek:
    • malloc()başaramayacak. Bu POSIX'e uygun davranıştır - işletim sistemi, programa RAM istediğini ve isteği yerine getiremediğini söyleyecektir.
      Program daha az RAM isteyebilir veya daha küçük bir bellek parçasıyla yapamıyorsa temizleyebilir ve çıkabilir. (Program kötü yazılmışsa, sadece çökecektir.)
    • Bir Linux kutusuysanız , OOM-Killer çılgınlık tarzında bir sürüşe devam ederek çılgınlığı öldürerek, talebi yerine getirmek için yeterli RAM'i serbest bırakmaya çalışmak için diğer işlemleri sonlandırabilir.
      Buradaki açıklamamı ve bağlantılı soruya cevabımı söyleyemezseniz, bunun sorunla başa çıkmanın korkunç bir yolu olduğunu düşünüyorum.

Dosyaları silerken neden Ücretsiz RAM çıkıyor?

Buradaki örnekte, yedek dosyayı silerek RAM’in "Ücretsiz" olabileceğini fark ettiniz - bunun açıklaması oldukça basit: Bu dosyayı hiçbir şey kullanmadığından (açık dosya tanıtıcısı yok) ve artık erişilemiyor. dosya sistemi (bağlantısız), işletim sisteminin hiç kimsenin bir daha bu verilere erişemeyeceğini bilir ve verileri dosya sistemi önbelleğinden temizler.
Bu işletim sistemi raporunu daha fazla boş hafıza yapar, ancak sistemin performansı üzerinde hiçbir etkisi yoktur.


Şimdi benim için çok açık ... Linux deneyimim biraz 2 ay, hepsi bu Debian sunucusuyla başladı. Bir ay önce Gentoo'yu ev dizüstü bilgisayarıma kurdum ve performansından ötürü çok şaşırdım; bu, Windows bilgisayardan Linux bilgisayarına, iş bilgisayarımda bile tamamen değişti. Linux'u Gentoo ile öğrenmek harika ve hala öğrenilecek çok şey var.

@ stan31337 Belirsiz olduğu tek kişi sen değilsin - özellikle Windows arkaplanından gelen insanlar için zor çünkü bu konuya girmediğiniz sürece Windows bellek kullanımını bu ayrıntı düzeyinde bildirmiyor - sadece "Kullanılmış" (programlar tarafından) ) ve "Ücretsiz" (alınacak programlar için). Mac kullanıcıları biraz daha kolaylar çünkü Aktivite İzleyicisi temelde topSerbest / Kablolu / Aktif / Aktif Değil RAM'in grafik versiyonudur ve raporlar.
voretaq7

Windows üzerinde Process Explorer ile çalışıyordum, gösterecek çok fazla bellek vardı, ama çoğu bana çok açık değildi, aslında onlara

2
Ayrıca, Windows genellikle bu kadar ayrıntılı göstermese de , çok benzer bir kuruma sahip olduğunu belirtmek gerekir .
Joachim Sauer,

Biliyorsunuz, Windows'ta bile bellek okuması kafa karıştırıcı. Bu, işletim sistemi üreticilerinin daha fazla vurgu yapmak isteyebilecekleri veya kullanıcıların şu anda olduğundan daha az umursadıkları bir şeydir.
gparent 17:12

2

Yukarıdakilerin başarısız olup olmadığını kontrol etmek için başka bir şey:

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

Döşeme önbelleği "eksik hafızanız" ın büyük bir kısmı için uygunsa, /proc/slabinfonereye gittiğini kontrol edin . Dişçi veya inode ise, sync ; echo 2 > /proc/sys/vm/drop_cachesonlardan kurtulmak için kullanabilirsiniz.

slabtopAracı, Slab önbelleğinin geçerli kullanımını dost bir biçimde göstermek için de kullanabilirsiniz . cListeyi geçerli önbellek boyutuna göre sıralar.

From: https://stackoverflow.com/a/5467207

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.