Linux'ta, ücretsiz komut tarafından bildirilen “tamponlar” ve “önbellek” arasındaki fark nedir?


73

Bu zaman zaman gördüğüm eski bir soru. Anladığım kadarıyla sınırlı (farkları uzun zaman önce okumuş olmakla birlikte, factoid (ler) asla gerçekten sıkışıp kalmış).

Anladığım kadarıyla,

  • tamponlar

    Aktif I / O işlemlerine sahip programlar tarafından kullanılır, yani diske yazılmayı bekleyen veriler

  • Önbellek

    Tamamlanmış G / Ç işlemlerinin, yani temizlenmiş arabelleklerin veya bir isteği karşılamak için diskten okunan verilerin sonucudur.

Posterity için net bir açıklama yapabilir miyim?



Tamponlarda bulduğunuz meta veriler gibi, bu io tamponlarıyla ilgili değil. Çekirdek arabelleklerinden bazıları döşeme ayırıcısında muhasebeleştirilir ancak arabellek veya önbellek sayılmaz.
17'de

Yanıtlar:


42

"Önbelleğe alınmış" toplam ayrıca, herhangi bir tmpfs dosya sistemi gibi başka bellek ayırmalarını da içerecektir. Bunu görmek için şunu deneyin:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

ve ram tabanlı dosya sistemine kopyaladığınız 100 MB'lık "önbellek" değerinin düşeceğini göreceksiniz (yeterince boş RAM olduğunu varsayarsak, makine kullanım açısından çok fazla işlenmişse, bunun bir kısmını takas ile sona erdiğini görebilirsiniz. bellek kullanımı). Her ücretsiz arama çağrısından önce "sync; echo 3> / proc / sys / vm / drop_caches" tüm yazma tamponlarında (sync) bekleyen bir şeyler yazmalı ve tüm önbelleğe alınmış / arabelleğe alınmış disk bloklarını bellekten temizlemeli, böylece sadece serbestçe sadece diğerleri okuyacak önbelleğe alınmış değerdeki tahsisler.

Sanal makineler tarafından kullanılan RAM (VMWare altında çalışanlar gibi), şu anda açık bellek eşlemeli dosyalar tarafından kullanılan RAM (kullandığınız hiper denetleyiciye / sürüme bağlı olarak değişebilir) gibi ücretsiz "önbelleğe alınmış" değerinde sayılabilir. muhtemelen çekirdek versiyonları arasında da).

Bu nedenle, "beklemedeki dosya / ağ yazmayı ve önbellekte saklanan sayıları gelecekteki fiziksel okumaları kaydetmek için RAM'de tutulan / yazılan blokları okur / sayar" gibi basit değildir, ancak çoğu amaç için bu daha basit bir açıklama yapacaktır.


1
İlginç nüanslar için +1. Bu aradığım bilgi türüdür. Aslında, rakamların o kadar iç içe olduğundan, pek çok farklı faaliyete katıldığından ve en iyi genel göstergelerde olduklarından şüpheleniyorum.
Avery Payne

Sanal makineler tarafından kullanılan RAM'in en azından qemu-kvm için "önbellek" olarak sayıldığını sanmıyorum. KVM ana bilgisayarımda önbellek değerinin sadece doğru olamayacak kadar küçük olmadığını (1.9 Gig’da), ancak VM’lerimden birini yok edersem / başlatsam da değişmeyeceğini fark ettim. VM'lerden birine tmpfs mount hilesi uygularsam da değişmez. Orada bir 800Meg tmpfs bölümü oluşturdum ve "önbelleğe alınmış" VM'de uygun değerleri gösterdi, ancak VM ana bilgisayarında değişmedi. Ancak VM’imi yok ettiğimde / başlattığımda "kullanılmış" değer küçüldü / büyüdü.
Mike S

... çekirdek 3.10.0-327 çalıştıran Centos 7.2.1511 VM ana bilgisayarında testler yaptım.
Mike S

@MikeS: Farklı sanallaştırma çözümlerinin belleğin işleyişi nasıl değişebilir, aslında çekirdeğin çeşitli bellek kullanımlarını nasıl ölçtüğü büyük sürümler arasında değişebilir.
David Spillett

@MikeS: "VM'lerden birine tmpfs mount hilesini uygulayın" ile ilgili olarak - VM tarafından kullanılan diğer notları göstermiyorlarsa ana bilgisayar okumalarını etkilemeyecektir. Bir KVM VM'deki etkiyi görüyorum: dd free = 2020'den önce, dd free = 1899'dan sonra, fs free = 2001'den sonra (19Mb fark VM'deki diğer işlemlerden kaynaklanacaktı, çalıştırdığımda boş değildi) test). Ana bilgisayar değişikliği göremeyebilir: VM'de işlemler tarafından kullanımı ücretsiz olsa da, bellek yine de VM'ye tahsis edilmiştir.
David Spillett


5

Tampon hakkında daha net bir açıklama arıyordum ve "Professional Linux® Kernel Architecture 2008"

Bölüm 16: Sayfa ve Arabellek Önbelleği

etkileşim

Sayfalar ve tamponlar arasında bir bağlantı kurmak, çekirdeğin diğer bölümleri için bir fayda sağlamazsa çok az amaca hizmet eder. Daha önce belirtildiği gibi, blok cihazlara bazı blok işlemlerinin yapılması, büyüklüğü altta yatan cihazların blok boyutuna bağlı olan birimlerde gerçekleştirilmeye ihtiyaç duyulabilir, oysa çekirdeğin çoğu kısmı, bu şekilde sayfa tanecikli olarak G / Ç işlemlerini gerçekleştirmeyi tercih eder. İşleri çok kolaylaştırır - özellikle bellek yönetimi açısından. Bu senaryoda, arabellek iki dünya arasında aracı olarak hareket eder.


3

RedHat tarafından açıklanmıştır :

Önbellek Sayfaları:

Önbellek, verilerin şeffaf bir şekilde depolandığı ve bu veriler için gelecekteki isteklerin daha hızlı bir şekilde yerine getirilebileceği bir bölümdür. Bu bellek, çekirdek tarafından disk verilerini önbelleğe almak ve g / Ç performansını iyileştirmek için kullanılır.

Linux çekirdeği, yerel ve uzak dosya sistemleriniz ve disklerinizdeki bilgileri önbelleğe almak için olabildiğince RAM kullanacak şekilde oluşturulmuştur. Zaman geçtikçe sistem üzerinde çeşitli okuma ve yazma işlemleri gerçekleştirilirken, çekirdek sistemde çalışmakta olan çeşitli işlemler veya yakın gelecekte kullanılacak olan ilgili işlemlerin verileri için bellekte depolanan verileri tutmaya çalışır. Önbellek, işlemin durduğu / çıktığı zamanda geri kazanılmaz, ancak diğer işlemler daha fazla hafıza gerektirdiğinde, boş hafıza, daha sonra kullanılabilir hafıza, çekirdek önbellek verilerini depolayarak ve bu hafızayı yeni işleme tahsis ederek hafızayı geri kazanmak için buluşsal çalışacaktır.

Herhangi bir dosya / veri istendiğinde, çekirdek, kullanıcının işlem yaptığı dosyanın bir kopyasını arar ve eğer böyle bir kopya yoksa, yeni bir önbellek sayfası sayfası tahsis eder ve onu doldurur. uygun içerikler diskten okunur.

Bir önbellekte depolanan veriler daha önce hesaplanan değerler veya diskin başka bir yerinde saklanan orijinal değerlerin kopyaları olabilir. Bazı veriler istendiğinde, önbellek önce bu verileri içerip içermediğini görmek için kontrol edilir. Veri önbellekten kaynak orijinden daha hızlı bir şekilde alınabilir.

SysV paylaşılan bellek bölümleri de, disklerdeki herhangi bir veriyi temsil etmemelerine rağmen, önbellek olarak kabul edilir. Biri ipcs -m komutunu kullanarak ve bayt sütununu kontrol ederek paylaşılan hafıza bölümlerinin boyutunu kontrol edebilir.

Tamponlar:

Tamponlar, sayfa önbellekleri altında depolanan verilerin disk bloğu gösterimidir. Arabellekler, sayfa önbelleğinin altında bulunan dosyaların / verilerin meta verilerini içerir. Örnek: Sayfa önbelleğinde bulunan herhangi bir veri talebi olduğunda, ilk önce çekirdek, sayfa önbelleklerinde bulunan asıl dosyalara / verilere işaret eden meta verileri içeren tamponlardaki verileri kontrol eder. Meta verilerden bir kez, dosyanın asıl blok adresi bilinir, işlem için çekirdek tarafından alınır.


2

Tampon / önbellek serbest bırakma

Uyarı Bu, üretim sunucusunda önerilmeyen güçlü bir yöntemi açıklar! Yani uyardın, bir şeyler ters giderse beni suçlama.

Anlamak için, şey, sisteminizi önbelleğe alınmış dosyayı bırakmaktan daha fazla bellek almaya zorlayabilircache :

önsöz

Testi yapmadan önce, bir pencere daha vurabilir:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

takasın gerçek zamanlı olarak gelişimini takip ettiği için.

Not: Geçerli dizinde boş diskleri elden çıkarmak zorundasınız.

Demo
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

Nota, bunu yaptığım ev sahibi şiddetle kullanıldı. Bu gerçekten sessiz bir makinede daha önemli olacaktır.


1
-1 yapabilseydim. Bu, (A) sorulan soru ile ilgisizdir ve (B) önbellek açıklığını tetiklemenin korkunç derecede kuvvetli bir yoludur. İkincisini yapmanın doğrudan yolları vardır, bu nedenle, bir yan etki olarak akana kadar sistemin verileriyle spam yaparak uyum sağlaması için kandırılması imkansız değildir
underscore_d

Aman Tanrım! Lütfen bunu asla gerçek sunucularda yapma!
tamerlaha,

@Tamerlaha Kabul ediyorum, lütfen 1. paragrafı tekrar okuyunuz: uyardınız, beni suçlama ! Bunun amacı tampon / önbellek ima etmektir.
F. Hauri,
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.