Linux belleği ne kullandı? Düşük önbellek, düşük tampon, VM değil


11

Her şeyden önce, evet, durumumu açıklamayan LinuxAteMyRAM'i okudum .

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Yukarıda gösterildiği gibi, -/+ buffers/cache:çizgi göstergeleri kullanılan bellek hızının çok yüksek olduğunu gösterir. Ancak, çıkışından, top100 MB'tan fazla bellek kullanılan herhangi bir işlem görmüyorum.

Peki, hafızayı ne kullandı?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

Bu, x84_64 Linux çalıştıran bir x86_64 makinesidir (ortak marka sunucusu değil), sanal makinedeki bir kap değil. Çekirdek ( uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

İçeriği /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dftmpfsdosya sistemlerinden büyük bellek tüketimi olmadığını bildirir .


2
Çıktısı nedir ps -eo pid,user,args,pmem --sort pmem?
Braiam

Buraya yapıştırılan bağlantı , birkaç kez denedi, aynı çıktıyı aldı.
Jason

3
Kullanmayın head! Komutun tam çıktısını istiyorum. Eğer kullanmanı isteseydim headonu emrime koyardım. Lütfen, insanların istediği komuta her zaman tam çıktı verin.
Braiam

3
Bir telefonda, kafamın üstündeki sözdizimini hatırlamıyorum, ancak sysv paylaşılan belleğini kontrol edin. Komut ipcs, sanırım.
derobert

5
Bunun için bir çözüm buldunuz mu? - Burada benzer bir sorun yaşıyorum: superuser.com/questions/793192/…
Hackeron

Yanıtlar:


4

Linux'ta bellek teşhis ve anlamak için garip bir canavar olabilir.

Normal işlem altında, hepsi olmasa da, belleğiniz bir göreve veya bir başkasına tahsis edilecektir. Bazıları halihazırda çalışan ön plan süreçlerine tahsis edilecektir. Bazıları diskten önbelleğe alınan verileri depolar. Bazıları, belirli bir zamanda aktif olarak yürütülmeyen süreçlerle ilişkili verileri tutacaktır.

Linux'taki bir işlemin kendi sanal adres alanı vardır (çıktısında VIRT top). Bu, işlemle ilişkili tüm verileri içerir ve işlemin ne kadar "büyük" olduğu düşünülebilir. Ancak, tüm bu belleğin aktif olarak "gerçek" bellek haritasının (çıkışındaki RES) bir parçası olması nadirdir top. RES veya yerleşik bellek, zaman içinde RAM'de doğrudan erişilebilen verilerdir. Bir de paylaşılan bellek (SHR) var. Bu, aynı işlemin birden çok örneği arasında paylaşılabilir. Dolayısıyla, bir işlem tarafından kullanılan bellek RES artı SHR'nin herhangi bir noktasındadır, ancak paylaşılan belleği kullanan işlemin birden fazla örneği varsa kullanım RES artı RES artı RES ... artı SHR'dir.

Peki neden RES ve VIRT arasındaki fark? Şüphesiz ki bir süreçte ayrılan bellek bloğu varsa, bu bellek tahsis edilir, değil mi? Hayır. Bellek sayfalara ayrılmıştır ve sayfalar Etkin veya Etkin Değil olabilir. Aktif olanlar RES'de olanlardır. Aktif olmayan "geri kalanı" dır. Şu anda erişilmedikleri için bir tarafa itilebilirler. Bu, bellek sıkılaşırsa diske değiştirilebilecekleri anlamına gelir. Ama sadece doğrudan diske gitmiyorlar. Önce önbellekte oturuyorlar. Her zaman takas etmek istemezsiniz, bu yüzden uygulama ve takas alanı arasında bir tampon vardır. Değiştiriciler yürütmek için farklı bir işlem seçtikçe ve farklı sayfalar etkin ve pasif hale geldikçe bu arabellekler sürekli değişiyor. Ve tüm bunlar, sadece bir insanın yetişmesini sağlamak için oruç tutmanın bir yolu.

Ve her şeyden önce disk tamponları var. Etkin olmayan bellek bir önbelleğe gitmekle kalmaz, aynı zamanda önbellek diske değiştiğinde, yazmak için sıraya alınacak bir disk arabelleğine gider. Bu, karışımdaki ikinci bir önbellek katmanı. Ve bu disk arabellekleri genel IO arabelleklemesi için sistemin diğer bölümleri tarafından da kullanılır. Yani sürekli değişiyorlar.

Peki ne gibi şeyler görüyoruz topve freevb ya belli bir süre boyunca makinenin veya toplanmış istatistiklerin mevcut durumu anlık anlık görüntülerdir. Verileri okuduğunuzda güncelliğini yitirir.

Herhangi bir işlem büyük miktarda belleğe erişebilir, ancak bunu yapmak nadiren mantıklıdır. Zaten tüm belleğe bir kerede erişemiyor, bu yüzden şu anda bakmadığı bellek özellikle "çekirdek kilitli" olarak işaretlenmedikçe önbelleğe taşınıyor.

Yani bir uygulama tarafından "kullanılan" bellek miktarı ve "sahip olduğu" bellek miktarı tamamen farklı iki şeydir. Bir uygulama veri alanının çoğu aslında "çekirdek" bellekte değil, önbellektir, ancak önbellek RAM'de olduğu için çoğu zaman anında kullanılabilir ve sadece "çekirdek" bellek olmak için "etkinleştirilmesi" gerekir. Bu, diske değiştirilmediği sürece, daha sonra değiştirilmemesi gerektiğinde (arabellekte varsa hızlı olabilir).

Canavarın yüksek hızlı doğası ve rakamların her zaman değiştiği gerçeği nedeniyle, sayılar ne olduklarını hesaplayarak kısmen değişebilir, bu nedenle "bu ne kadar bellek kullanıldığını" tam olarak söylemek mümkün değildir. kullanıcının bakış açısı. Meminfo, çekirdek tarafından sağlanan zamandaki bir anlık görüntüdür, ancak yürüten çekirdek olduğu için, o zaman hiçbir işlem o anda aktif olarak yürütülmediği için bellek kullanımını işleyen herhangi birinin gerçek durumunu göstermesi gerekmez - süreçler arasındadır.

Dediğim gibi, hepsi çok kafa karıştırıcı.

Ama günün sonunda gerçekten önemli değil. Önemli olan ne kadar belleğe "boş" sahip olduğunuz değil, ne kadar takas alanı kullandığınız ve ne sıklıkta takas alanına erişildiğidir. Bellek eksikliğini değil, bir sistemi yavaşlatan takas (bellek yetersizliği aşırı değişime neden olsa da). Çok fazla kullanılmış belleğiniz varsa, ancak (veya çok az) takas alanı kullanmıyorsanız, işler normaldir. Genel olarak serbest bellek arzu edilmez ve genellikle tamamen geçişlidir, çünkü bir amaç için kullanılırdı, ancak henüz bir başkası için tahsis edilmemiştir - örneğin önbellek idi ve diske değiştirildi, ancak henüz başka bir şey için kullanılmadı ya da disk arabellekleriydi, arabellekler diske temizlendi, ancak hiçbir uygulama henüz önbellek için istemedi.


6
Bu gerçekten ilginç ama OP'nin neden bu özel tutarsızlığı gözlemlediği sorusuna cevap vermiyor.
terdon

Bence tek gerçek tutarsızlık OP'lerin beklentileri ile Linux'un sağladığı şey arasında yatıyor. Yani, Linux'un verdiği değerler toplanmaz ve bunun nedeni zaten değişmiş olmasıdır.
Majenko

OP gerçekten soruyu anlayamadığı için “doğru” cevabın nasıl seçilebileceğini bilmiyorum. Sistemin karşısında mavi olana kadar nasıl çalıştığını açıklayabiliriz, ancak eğer bu temelleri kavrayamazsa ve sorunun aslında anlamsız olduğunu fark edemezse, asla "doğru" bir cevabımız olmayacaktır.
Majenko

Bunu yazdığınız için teşekkür ederim ama dürüst olmak gerekirse arkasındaki agnostisizm tonunu sevmiyorum. "Anlık görüntü" teorisine katılıyorum, ancak anlık görüntü, RAM kullanımının yüksek olduğunu söyleyen aynı sayıyı vermeye devam ederken, nasıl olduğunu bulamıyorsanız, merak etmeyecek misiniz?
Jason

5
Bunu blogunuza göndermelisiniz. İyi, ama burada alakalı değil. Süreçlerin VIRT'i tüm RAM kullanımlarını hesaba katmadığından ve sistem, baskıya rağmen değiş tokuş etmediğinden, garip bir şey oluyor (ve yazdıklarınızı anlayan birinden garip geliyor).
Gilles 'SO- kötü olmayı bırak

0

Bu cevabın bir parçası:

"Kullanılmış" bellek ("serbest" komutunda) ile "Etkin (kullanıcı) işlemlere ayrılan bellek" (/ proc / meminfo içinde) olarak adlandırılanlar arasında bir fark vardır. Tamam, bu yüzden sisteminizde toplam 48149 MB (yaklaşık 47 Gb) var

/ Proc / meminfo'nuza bakarsanız şunu görürsünüz: Etkin değil: 17296272 kB = (yaklaşık 16,5 Gb) - Etkin olmayan bellek, sonlandırılmış işlemlerden olabilir. Ayrıca aktif olan bir işlem tarafından uzun süredir kullanılmayan bir bellek de olabilir. Bellek sadece işlemin sona ermesi nedeniyle "boşaltılmaz". Neden? çünkü daha çok iş. Aynı bellek sayfası tekrar kullanılabilir, bu nedenle linux çekirdeği, bir işlem gerekene kadar verileri "etkin olmayan" listede bırakır.

Bu sayfa bunlardan bazılarını açıklıyor. http://careers.directi.com/display/tu/Anlama +ve+optimizing+Memory+utilization ; Linux çekirdeği tarafından kullanılan PFRA (Sayfa çerçevesi geri kazanma algoritması) bölümünü okuyun: "Herhangi bir işlem tarafından referans verilmeyen disk ve bellek önbelleklerine dahil edilen sayfalar, işlemlerin Kullanıcı Modu adres alanlarına ait sayfalar geri alınmalıdır" "Geri Alma" "kullanılmış" (etkin olmayan + aktif) ve "serbest" e taşımak anlamına gelir.

Bu, Bellek yönetimini daha ayrıntılı olarak açıklar: Aktif ve aktif olmayan listelerin nasıl çalıştığı ve sayfaların aralarında nasıl hareket ettiği https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

Ben de veri yapıları için çekirdek tarafından kullanılan bellek olduğunu ve bu "slab 1049464 kb" (~ 1 GB) olarak ortaya çıkıyor inanıyorum, ama bunun ayrı olarak sayılır olumlu değil.


Sadece geçmişte, paylaşılan bellek segmentlerini tahsis eden, ancak bunları serbest bırakmayan, kötü yazılmış bir uygulama nedeniyle belleği biten bir sistemle ilgili deneyimim olduğunu eklemek istedim. Paylaşılan bellek segmentleri, bunları kullanan tüm işlemler öldüğünde bile devam etti. Bu Linux değildi, ama linux için de geçerli olabilir. yukarıda belirtildiği gibi, bu konuda bilgi için ipcs'e bakın. bkz. makelinux.net/alp/035 Paylaşılan hafızayı açıkça dağıtmanız gerektiğini söylüyor.
SSL

1
Cevabınızla ilgili her şeyi anlamıyorum, ancak “Etkin olmayan bellek, sonlandırılmış işlemlerden olabilir” kesinlikle yanlıştır. Userland hafızası iki çeşittir: haritalanmış veya anonim. Eşlenen bellek her zaman geri alınabilir çünkü veriler bir dosyadan yeniden yüklenebilir. Anonim bellek değiştirilirse geri alınabilir. Aktif olmayan bellek, geri kazanım için iyi bir aday olan bellektir; ancak bu bellek hala kullanımda olduğundan içeriğin bir dosyada olması ya da bir yerde değiştirilmesi gerekir. Bir işlem öldüğünde, belleği serbest kalır ve artık aktif + etkin değil olarak hesaplanmaz.
Gilles 'SO- kötü olmayı bırak'

1
Bazı referanslar: Etkin olmayan bellekte artışa ne sebep olabilir ve nasıl geri kazanılır? Sunucu Arızası; Red Hat eski ama yine de uygulanabilir ipuçları . Bhavin Turakhia'nın alıntıladığınız makalesi de; konuyla ilgili açık değildir, ancak “PFRA'yı anlama” bölümündeki anonim ve haritalı sayfalar hakkında açıklama yapar.
Gilles 'SO- kötü olmayı bırak'

Bu makaleden bir işlem tarafından referans alınmayan etkin olmayan sayfalar hakkında düşündüm: kernel.org/doc/gorman/html/understand/understand013.html Her ne kadar hala devam eden bir işlem tarafından serbest bırakılmış sayfalar olabileceğini düşünüyorum. bölümü "LRU Listelerinden Sayfaların İadesi"
ssl

Ama muhtemelen bu sadece takas önbelleğindeki sayfaları ifade eder?
SSL

-2

NFS kullanıyor musunuz?
Her slabtop -oiki şekilde de koşmaya değer olabilir nfs_inode_cache, kontrolden çıkabilirsiniz.


-4

Bakmanız gereken şekil , çıkışınızda "0" olan takas kullanılır , bu da RAM'iniz bitti DEĞİLDİR demektir. Sisteminiz belleği değiştirmediği sürece, yine de yorumlanması çok zor olan diğer figürler hakkında endişelenmemelisiniz.

Edit: Tamam, öyle görünüyor ki cevabım özlü değil, şifreli olarak kabul ediliyor. Şimdi biraz açıklayayım.

Sanırım burada asıl sorun, çok doğru olmayan top / ps çıktılarını yorumlamaktır. Örneğin, aynı paylaşılan kütüphanelerin çoklu kullanımları beklediğiniz gibi hesaplanmadığından, bkz. Http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

Bununla birlikte, doğru olan şey, takas boyutu tam olarak sıfırsa, sisteminizin belleğinin bitmediğinden (henüz). Tabii ki, bu çok dersin bir ifadesidir, ancak sistemlerinizin gerçek bellek kullanımını profillemek için en doğru şey olmayacaktır. (En üste bakarsanız, çıktıyı en azından virt veya% mem için sıralayın.)

Ayrıca bkz. Http://elinux.org/Runtime_Memory_Measurement


1
Sisteminiz de değişiyorsa endişelenmemelisiniz, bu normaldir. Sisteminiz çok sık değişiyorsa endişelenmelisiniz (bu, büyük bir takas alanına sahip olmakla aynı şey değildir). Kullanılan takasın 0 olması, kendi başına tuhaf, çok az boş fiziksel belleğe sahip.
Gilles 'SO- kötü olmayı kes'

çıktısı, sisteminin hiç değişmediğini gösteriyor. Bu kesinlikle en iyi takas oranıdır. Küçük bir takas büyüklüğünün iyi bir şey olduğunu söylemedim, ama sıfır bir boyut kesinlikle. Ve sistemde gerçekten boş bellek kalmadığı sürece, neden değiştirmeye başlasın?
Ekvator

Hayır, değiştirmenin olmaması optimal olmaktan uzaktır. Şu anda kullanılmayan programların belleği, sık kullanılan dosyalar için disk önbelleğine yer açmak üzere değiştirilmelidir. Sadece çıktı hakkında eklediğiniz biraz gelince free, ben demek istediğini düşünüyorum top- ama o zaman bile toplam sadece toplamdan daha fazla olabilir (çünkü paylaşılan bellek birden çok kez sayılır), daha az değil.
Gilles 'SO- kötü olmayı bırak'

toplam ile ne demek istiyorsun sadece daha az olamaz? top sadece ekrana sığabilecek kadar çok işlem gösterir, yukarıdakilerin tüm çalışan süreçler olmadığından eminim, dolayısıyla bellek kullanımına göre sıralanmazlar, bu çıktı parçası 'belleği ne kullandı' sorusu için oldukça işe yaramaz .
Echsecutor

oh, ve ben takas başlamak için en uygun zaman olduğu için bir tartışma girmek istemiyorum, ama linux sunucusunun varsayılan sadece "şu anda kullanılmıyor" çünkü bellek takas etmektir.
Echsecutor
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.