it-swarm.asia

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

Bu, zaman zaman gördüğüm eski bir soru. Anlayışım oldukça sınırlıdır (uzun zaman önce farklılıklar hakkında bilgi sahibi olmakla birlikte, dahil olan factoid (ler) asla gerçekten sıkışmamıştır).

Anladığım kadarıyla,

  • Tamponlar

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

  • Önbellek

    Tamamlanmış G/Ç işlemlerinin, yani, boşaltılan arabelleklerin veya verilerin bir isteği karşılamak için diskten okunan sonuçlarının sonucudur.

Gelecek kuşaklar için net bir açıklama alabilir miyim?

73
Avery Payne

"Önbellek" toplamı, herhangi bir tmpfs dosyatipi gibi başka bellek ayırmalarını da içerecektir. Bunu yürürlükte 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 100Mb değerindeki "önbellek" değer düşüşünü göreceksiniz (yeterli boş RAM olduğu varsayılarak, makine zaten terimler konusunda aşırı işlenmişse, bazılarının takasla sonuçlandığını görebilirsiniz. bellek kullanımı). Her bir ücretsiz çağrıdan önce "sync; echo 3>/proc/sys/vm/drop_caches", tüm yazma arabelleklerinde (senkronizasyon) bekleyen herhangi bir şey yazmalı ve tüm önbelleklenmiş/arabelleklenmiş disk bloklarını bellekten temizlemelidir; önbellek değeri.

Sanal makineler (VMWare altında çalışanlar gibi) tarafından kullanılan RAM), RAM) değerinin serbest "önbelleğe alınmış" değerinde de sayılabilir. bellek eşlemeli dosyalar (kullandığınız hipervizöre/sürüme ve muhtemelen çekirdek sürümleri arasında da değişiklik gösterir).

Bu nedenle, çoğu durumda bu basit açıklama, RAM gelecekteki fiziksel okumaları kaydetmek için tutulan) son zamanlarda okunan/yazılmış bloklar bekleyen dosya/ağ yazımları ve önbellek sayımları kadar basit değildir. yapacağım.

41
David Spillett

Zor bir soru. Boş alanı hesaplarken, aslında tampon eklemeniz ve her ikisini de önbelleğe almanız gerekir. Ben bulabildim

Bir arabellek henüz diske "yazılmamış" bir şeydir. Önbellek, diskten "okunan" ve daha sonra kullanılmak üzere saklanan bir şeydir.

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135

8
Viky

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

Çekirdeğin diğer bölümleri için herhangi bir fayda yoksa, sayfalar ve arabellekler arasında bir bağlantı oluşturmak çok az amaca hizmet eder. Daha önce belirtildiği gibi, blok cihazlara ve blok cihazlardan bazı transfer işlemlerinin, boyutu alttaki cihazların blok boyutuna bağlı olan birimlerde gerçekleştirilmesi gerekebilir, oysa çekirdeğin birçok kısmı, sayfa ayrıntı düzeyi ile G/Ç işlemleri yapmayı tercih eder. özellikle bellek yönetimi açısından işleri kolaylaştırır. Bu senaryoda, arabellekler iki dünya arasında aracı görevi görür.

5
c4f4t0r

RedHat ile açıklandı:

Önbellek Sayfaları:

Önbellek, verileri şeffaf bir şekilde depolayan ve böylece bu veriler için gelecekteki isteklerin daha hızlı sunulabileceği bir parçasıdır. Bu bellek, çekirdek tarafından disk verilerini önbelleğe almak ve g/Ç performansını artırmak için kullanılır.

Linux çekirdeği, yerel ve uzak dosya sistemlerinizden ve disklerinizden bilgi önbelleğe almak için olabildiğince çok RAM) kullanacak şekilde oluşturulmuştur. sistem üzerinde çalışan çeşitli işlemler veya yakın gelecekte kullanılacak ilgili işlemlerin verileri için bellekte depolanan verileri saklamaya çalışır. Önbellek, işlem sırasında geri kazanılmaz ancak dur/çık, ancak diğer işlemler kullanılabilir boş bellekten daha fazla bellek gerektirdiğinde, çekirdek önbellek verilerini depolayarak ve bu belleği yeni işleme ayırarak belleği geri almak için sezgisel tarama çalıştırır.

Herhangi bir dosya/veri istendiğinde, çekirdek kullanıcının üzerinde işlem yaptığı dosyanın bir kopyasını arayacak ve böyle bir kopya yoksa, yeni bir önbellek sayfası ayıracak ve uygun içerikler diskten okunur.

Önbellekte saklanan veriler, daha önce hesaplanan değerler veya diskte başka bir yerde saklanan orijinal değerlerin kopyaları olabilir. Bazı veriler istendiğinde, önbellek ilk önce bu verileri içerip içermediğini kontrol eder. Veriler, kaynak Kökeni'nden daha hızlı bir şekilde önbellekten alınabilir.

SysV paylaşılan bellek segmentleri de disklerde herhangi bir veri temsil etmese de önbellek olarak hesaplanır. Paylaşılan bellek segmentlerinin boyutu ipcs -m komutunu kullanarak ve bayt sütununu kontrol ederek kontrol edilebilir.

Tamponlar:

Arabellekler, sayfa önbellekleri altında depolanan verilerin disk bloğu temsilidir. Arabellekler, sayfa önbelleğinin altında bulunan dosyaların/verilerin meta verilerini içerir. Örnek: Sayfa önbelleğinde bulunan herhangi bir verinin talebi olduğunda, önce çekirdek, sayfa önbelleklerinde bulunan gerçek dosyaları/verileri gösteren meta verileri içeren arabelleklerdeki verileri kontrol eder. Meta verilerden, dosyanın gerçek blok adresi bilindikten sonra, işlem için çekirdek tarafından alınır.

3
Ijaz Ahmad Khan

Arabellek/önbellek boşaltma

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

Anlamak için, force sisteminize önbelleğe alınmış dosyayı bırakmak yerine cache için olabildiğince çok bellek devredebilirsiniz:

Testi yapmadan önce, başka bir pencereyi bir hit açabilirsiniz:

$ 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 evrimini gerçek zamanlı olarak takip etmek için.

Nota: Geçerli dizinde boş disk alanı imha etmeli, mem + swapınız var.

$ 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 sunucuda çok kullanılıyor. Bu gerçekten sessiz bir makinede daha önemli olacak.

2
F. Hauri