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?
"Ö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.
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
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.
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.
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.