RAM'in% 30'u “arabellekler” dir. Bu ne?


13
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           501M        146M         19M        9.7M        335M        331M
Swap:          1.0G         85M        938M

$ free -w -h
              total        used        free      shared     buffers       cache   available
Mem:           501M        146M         19M        9.7M        155M        180M        331M
Swap:          1.0G         85M        938M

Çıktısında "tamponları" nasıl tanımlayabilir veya açıklayabilirim free?

Bu sistemle ilgili (bilinen) bir sorunum yok. Ben sadece "tampon" neredeyse "önbellek" (155M vs 180M) kadar yüksek olduğunu merak ve merak ediyorum. "Önbellek" dosya içeriğinin sayfa önbelleğini temsil düşündüm ve "önbellek / arabellekleri" en önemli parçası olma eğiliminde olduğunu düşündüm. "Tamponlar" ın ne için olduğunu daha az netleştiriyorum.

Örneğin bunu daha fazla RAM'e sahip olan dizüstü bilgisayarımla karşılaştırdım. Dizüstü bilgisayarımda "tamponlar" rakamı "önbellekten" (200M'ye karşı 4G) daha küçük bir büyüklük sırasıdır. Eğer "tamponların" ne olduğuna dair doğru bir anlayışa sahip olsaydım, tamponların neden daha küçük sistemde bu kadar büyük bir oranda büyüyebileceğini sormaya başlayabilirdim.

man proc ("Büyük" komik eskimiş tanımını göz ardı):

Tamponlar% lu

Muazzam derecede büyük olmaması gereken (20MB veya daha fazla) ham disk blokları için göreceli olarak geçici depolama.

Önbellek% lu

Diskten okunan dosyalar için bellek içi önbellek (sayfa önbelleği). SwapCached içermez.


$ free -V
free from procps-ng 3.3.12
$ uname -r
4.9.0-6-marvell
$ systemd-detect-virt
none

$ cat /proc/meminfo
MemTotal:         513976 kB
MemFree:           20100 kB
MemAvailable:     339304 kB
Buffers:          159220 kB
Cached:           155536 kB
SwapCached:         2420 kB
Active:           215044 kB
Inactive:         216760 kB
Active(anon):      56556 kB
Inactive(anon):    73280 kB
Active(file):     158488 kB
Inactive(file):   143480 kB
Unevictable:       10760 kB
Mlocked:           10760 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         513976 kB
LowFree:           20100 kB
SwapTotal:       1048572 kB
SwapFree:         960532 kB
Dirty:               240 kB
Writeback:             0 kB
AnonPages:        126912 kB
Mapped:            40312 kB
Shmem:              9916 kB
Slab:              37580 kB
SReclaimable:      29036 kB
SUnreclaim:         8544 kB
KernelStack:        1472 kB
PageTables:         3108 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1305560 kB
Committed_AS:    1155244 kB
VmallocTotal:     507904 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB

$ sudo slabtop --once
 Active / Total Objects (% used)    : 186139 / 212611 (87.5%)
 Active / Total Slabs (% used)      : 9115 / 9115 (100.0%)
 Active / Total Caches (% used)     : 66 / 92 (71.7%)
 Active / Total Size (% used)       : 31838.34K / 35031.49K (90.9%)
 Minimum / Average / Maximum Object : 0.02K / 0.16K / 4096.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 59968  57222   0%    0.06K    937       64      3748K buffer_head            
 29010  21923   0%    0.13K    967       30      3868K dentry                 
 24306  23842   0%    0.58K   4051        6     16204K ext4_inode_cache       
 22072  20576   0%    0.03K    178      124       712K kmalloc-32             
 10290   9756   0%    0.09K    245       42       980K kmalloc-96             
  9152   4582   0%    0.06K    143       64       572K kmalloc-node           
  9027   8914   0%    0.08K    177       51       708K kernfs_node_cache      
  7007   3830   0%    0.30K    539       13      2156K radix_tree_node        
  5952   4466   0%    0.03K     48      124       192K jbd2_revoke_record_s   
  5889   5870   0%    0.30K    453       13      1812K inode_cache            
  5705   4479   0%    0.02K     35      163       140K file_lock_ctx          
  3844   3464   0%    0.03K     31      124       124K anon_vma               
  3280   3032   0%    0.25K    205       16       820K kmalloc-256            
  2730   2720   0%    0.10K     70       39       280K btrfs_trans_handle     
  2025   1749   0%    0.16K     81       25       324K filp                   
  1952   1844   0%    0.12K     61       32       244K kmalloc-128            
  1826    532   0%    0.05K     22       83        88K trace_event_file       
  1392   1384   0%    0.33K    116       12       464K proc_inode_cache       
  1067   1050   0%    0.34K     97       11       388K shmem_inode_cache      
   987    768   0%    0.19K     47       21       188K kmalloc-192            
   848    757   0%    0.50K    106        8       424K kmalloc-512            
   450    448   0%    0.38K     45       10       180K ubifs_inode_slab       
   297    200   0%    0.04K      3       99        12K eventpoll_pwq          
   288    288 100%    1.00K     72        4       288K kmalloc-1024           
   288    288 100%    0.22K     16       18        64K mnt_cache              
   287    283   0%    1.05K     41        7       328K idr_layer_cache        
   240      8   0%    0.02K      1      240         4K fscrypt_info           

Yanıtlar:


14
  1. "Buffer" ve diğer önbellek arasındaki fark nedir?
  2. Bu ayrımı neden bu kadar belirgin görüyoruz? (Olası tarihsel neden)
  3. Ne için Bufferskullanılır?
  4. Neden Buffersözellikle daha büyük veya daha küçük olmasını bekleyebiliriz ?

1. "Buffer" ve diğer önbellek türleri arasındaki fark nedir?

Buffersblok cihazlar için kullanılan sayfa önbellek miktarını bildirir. Çekirdek, rapor verirken bu miktarı sayfa önbelleğinin geri kalanından kasıtlı olarak çıkarmak zorundadır Cached.

Bkz. Meminfo_proc_show () :

cached = global_node_page_state(NR_FILE_PAGES) -
         total_swapcache_pages() - i.bufferram;
...

show_val_kb(m, "MemTotal:       ", i.totalram);
show_val_kb(m, "MemFree:        ", i.freeram);
show_val_kb(m, "MemAvailable:   ", available);
show_val_kb(m, "Buffers:        ", i.bufferram);
show_val_kb(m, "Cached:         ", cached);

2. Bu ayrımı neden bu kadar belirgin görüyoruz? (Olası tarihsel neden)

Sayfa önbelleği, genellikle en az 4096 bayt olmak üzere MMU sayfa boyutundaki birimlerde çalışır. Bu, mmap()bellek eşlemeli dosya erişimi için önemlidir . [1] [2] Yüklü program / kütüphane kodunun sayfalarını bağımsız işlemler arasında paylaşmak ve istek üzerine tek tek sayfaları yüklemeye izin vermek için kullanılır. (Ayrıca, başka bir şeyin alana ihtiyacı olduğunda ve son zamanlarda kullanılmadığında sayfaları boşaltmak için).

[1] Bellek eşlemeli G / Ç - GNU C Kütüphanesi el kitabı.
[2] mmap- Wikipedia.

Erken UNIX'te "blok önbellek" disk blokları vardı ve mmap () yoktu. Görünüşe göre mmap () ilk eklendiğinde, sayfa önbelleğini arabellek önbelleğinin üstüne cıvataladılar. Bu göründüğü kadar dağınık. Sonunda, UNIX tabanlı işletim sistemleri arabellek önbelleğinden kurtuldu. Şimdi tüm dosya önbellekleri sayfa birimlerinde. Sayfalar diskteki konuma göre değil (dosya, ofset) tarafından aranır. Buna "birleştirilmiş tampon önbellek" deniyordu, belki de insanlar "tampon önbellek" i daha iyi biliyorlardı.

[3] UBC: NetBSD için Etkin Birleştirilmiş G / Ç ve Bellek Önbellekleme Alt Sistemi

"Linux'un eklediği ilginç bir bükülme, bir sayfanın diskte depolandığı aygıt blok numaralarının sayfa ile birlikte bir buffer_headyapı listesi biçiminde önbelleğe alınmasıdır . Değiştirilmiş bir sayfa diske geri yazıldığında, G / Ç istekler, sayfanın verilerinin nereye yazılması gerektiğini belirlemek için dolaylı blokları okumaya gerek kalmadan hemen aygıt sürücüsüne gönderilebilir. "[3]

Linux 2.2'de yazma için kullanılan ayrı bir "tampon önbellek" vardı, ancak okumalar için değil. "Sayfa önbelleği, verileri yazmak için arabellek önbelleğini kullandı, verilerin fazladan bir kopyasına ihtiyaç duydu ve bazı yazma yükleri için bellek gereksinimlerini iki katına çıkardı" (?). [4] Ayrıntılar hakkında çok fazla endişelenmeyelim, ancak bu geçmiş Linux'un Bufferskullanımını ayrı ayrı rapor etmesinin bir nedeni olacaktır .

[4] Linux 2.4 bellek yönetiminde sayfa değiştirme , Rik van Riel.

Buna karşılık, Linux 2.4 ve üzeri sürümlerde fazladan kopya mevcut değildir. "Sistem disk IO'sunu doğrudan sayfa önbellek sayfasına gidip geliyor." [4] Linux 2.4, 2001 yılında piyasaya sürüldü.

3. Ne için Bufferskullanılır?

Blok cihazlar dosya olarak kabul edilir ve sayfa önbelleğine sahiptir. Bu, "dosya sistemi meta verileri ve ham blok cihazlarının önbelleğe alınması için" kullanılır. [4] Ancak Linux'un mevcut sürümlerinde, dosya sistemleri dosya içeriklerini bu dosyadan kopyalamaz, bu nedenle "çift önbellekleme" yoktur.

Aklıma BuffersLinux tampon önbellek olarak sayfa önbellek parçası. Bazı kaynaklar bu terminolojiye katılmayabilir.

Varsa, dosya sisteminin ne kadar arabellek önbelleği kullandığı belirli dosya sisteminin ayrıntılarına bağlıdır. Söz konusu sistem ext4 kullanıyor. ext3 / ext4, günlük, dizin içeriği ve diğer bazı meta veriler için Linux arabellek önbelleğini kullanır.

Ext3, ext4 ve ocfs2 dahil olmak üzere bazı dosya sistemleri, fiziksel blok günlük kaydını işlemek için jbd veya jbd2 katmanını kullanır ve bu katman temel olarak tampon önbelleğini kullanır.

- Haberi tarafından Ted Tso 2013

Linux çekirdek 2.4 sürümünden önce, Linux'un ayrı sayfa ve arabellek önbellekleri vardı. 2.4'ten beri, sayfa ve arabellek önbelleği birleştirilmiştir ve Bufferssayfa önbelleğinde temsil edilmeyen ham disk bloklarıdır, yani dosya verileri değil.

...

Ancak arabellek önbelleği, çekirdeğin hala sayfalar yerine bloklar açısından blok I / O gerçekleştirmesi gerektiğinden kalır. Çoğu blok dosya verilerini temsil ettiğinden, arabellek önbelleğinin çoğu sayfa önbelleği ile temsil edilir. Ancak az miktarda blok verisi dosya desteklenmez - örneğin meta veriler ve ham blok G / Ç - ve bu nedenle yalnızca tampon önbellek tarafından temsil edilir.

- Quora cevapları Bir çift tarafından Robert Aşk son 2013 güncellendi.

Her iki yazar da Linux çekirdek bellek yönetimi ile çalışan Linux geliştiricileri. İlk kaynak teknik detaylar hakkında daha spesifiktir. İkinci kaynak, bazı özelliklerde çelişmiş ve modası geçmiş olabilecek daha genel bir özettir.

Önbellek sayfalarda dizine alınmış olsa bile dosya sistemlerinin kısmi sayfa meta veri yazma işlemleri gerçekleştirebileceği doğrudur. Kullanıcı işlemleri bile , en azından doğrudan bir blok cihaza kullandıklarında write()(aksine mmap()) kısmi sayfa yazma işlemleri gerçekleştirebilir . Bu sadece yazma işlemleri için geçerlidir, okumalar için geçerli değildir. Sayfa önbelleğini okuduğunuzda, sayfa önbelleği her zaman tam sayfaları okur.

Linus , blok boyutlu yazma işlemleri için arabellek önbelleğinin gerekli olmadığını ve dosya sistemlerinin, blok önbellek yerine kendi dosyalarına eklenmiş sayfa önbelleği olsa bile kısmi sayfa meta veri yazmalarını yapabileceğini söylemiştir. Eminim ext2'nin bunu yaptığını söyleme hakkı vardır. ext3 / ext4 günlük kaydı sistemiyle bunu yapmaz. Bu tasarıma yol açan sorunların ne olduğu daha az açıktır. Konuştuğu insanlar açıklama yapmaktan yoruldular.

ext4_readdir (), Linus'un rant'ını karşılamak için değiştirilmedi. İstediği yaklaşımın diğer dosya sistemlerinin readdir () öğesinde de kullanıldığını görmüyorum. Ben XFS dizinleri için de tampon önbellek kullanır düşünüyorum. bcachefs sayfa önbelleğini readdir () için kullanmaz; btrees için kendi önbelleğini kullanır. Ben btrfs bir şey eksik olabilir.

4. Neden Buffersözellikle daha büyük veya daha küçük olmasını bekleyebiliriz ?

Bu durumda dosya sistemimin ext4 günlük boyutunun 128M olduğu ortaya çıktı . Bu, neden 1) tampon önbelleğimin 128M'nin biraz üzerinde stabilize olabileceğini açıklıyor; 2) arabellek önbelleği, dizüstü bilgisayarımdaki RAM miktarı ile orantılı olarak ölçeklenmiyor.

Diğer bazı olası nedenler için, bkz . Çıktıdaki arabellek sütunu nedir? Tarafından bildirilen "arabelleklerin" freeaslında Buffersslab belleğinin bir kombinasyonu ve geri alınabilir olduğunu unutmayın.


Dergi yazarlarının arabellek önbelleğini kullandığını doğrulamak için, bir dosya sistemini güzel hızlı RAM'de (tmpfs) simüle ettim ve farklı günlük boyutları için maksimum arabellek kullanımını karşılaştırdım.

# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=256
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             256M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2521        4321         285          66         947        5105
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2523        3872         551         237        1223        4835
Swap:          7995           0        7995

# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=16
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             16M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2507        4337         285          66         943        5118
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2509        4290         315          77         977        5086
Swap:          7995           0        7995

Bu cevabın tarihi: Dergiye nasıl bakmaya geldim

Önce Ted Tso'nun e-postasını bulmuştum ve bunun yazı önbelleğe alınmasını vurgulamasıyla ilgilendim. "Kirli", yazılı olmayan verilerin sistemimde RAM'in% 30'una ulaşabilmesi şaşırtıcı olurdu . sudo atop10 saniyelik bir aralıkta, söz konusu sistemin sürekli olarak sadece 1 MB yazdığını gösterir. İlgili dosya sistemi bu oranın 100 katına kadar ayak uydurabilecektir. (Bir USB2 sabit disk sürücüsünde, maksimum verim ~ 20MB / s).

Blktrace ( btrace -w 10 /dev/sda) kullanılması, önbelleğe alınan ES'lerin yazılması gerektiğini doğrular, çünkü okunan neredeyse hiç veri yoktur. Ayrıca bu mysqld, IO yapan tek kullanıcı alanı işlemidir.

Yazmalardan (icinga2 mysql'e yazma) sorumlu olan hizmeti durdurdum ve tekrar kontrol ettim. "Tamponlar" 20M altında damla gördüm - Bunun için hiçbir açıklama var - ve orada kalmak. Yazıcının yeniden başlatılması, her 10 saniyelik aralık için ~ 0.1M yükselen "tamponlar" ı gösterir. Bu oranı sürekli olarak koruduğunu ve 70M ve üzerine çıktığını gözlemledim.

Koşu echo 3 | sudo tee /proc/sys/vm/drop_caches4.5m, yine "tampon" düşürmek için yeterliydi. Bu, tampon birikimimin Linux'un gerektiğinde hemen düşebileceği "temiz" bir önbellek olduğunu kanıtlıyor. Bu sistem yazılmamış veri biriktirmiyor . ( drop_cachesherhangi bir geri yazma işlemi gerçekleştirmez ve bu nedenle kirli sayfaları bırakamaz. Önce önbelleği temizleyen bir test çalıştırmak isterseniz, synckomutu kullanırsınız ).

Tüm mysql dizini sadece 150M'dir. Biriken arabellekler mysql yazımlarındaki meta veri bloklarını temsil etmelidir, ancak bu veriler için çok fazla meta veri bloğu olacağını düşünmeme şaşırttı.


3

Sürümünüz freedoğru fikre sahip. Varsayılan olarak, raporunda arabellekleri ve önbelleği birleştirir. Bunun nedeni temelde aynı şey olmalarıdır. Her ikisi de RAM'de hatırlayan bilgisayardır (Daha hızlı olan ikincil depolama: Diskler ve SSD), Disk ve SSD'yi okurken gördüğü şey.

İşletim sistemi, belleğin başka bir şey tarafından daha iyi kullanıldığını düşünüyorsa, onu boşaltabilir. Bu nedenle arabellek ve önbellek konusunda endişelenmeyin.

Ancak bir DVD izlemek arabelleğin yükselmesine ve diğer tampon / önbellek içeriğinin çıkarılmasına neden olabilir. Bu nedenle, DVD oynatıcıyı çalıştırmak için nocache kullanabilirsiniz ( bir soruna neden oluyorsa ).

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.