Vraag Wat is in Linux het verschil tussen "buffers" en "cache" gerapporteerd door de gratis opdracht?


Dit is een oude vraag die ik van tijd tot tijd heb gezien. Mijn begrip ervan is eerder beperkt (ik heb al lang geleden over de verschillen gelezen, maar de betrokken factoïde (n) zijn nooit echt vastgelopen).

Zoals ik het begrijp,

  • buffers

    Worden gebruikt door programma's met actieve I / O-bewerkingen, d.w.z. data die wachten om op schijf te worden geschreven

  • Cache

    Is het resultaat van voltooide I / O-bewerkingen, dat wil zeggen buffers die zijn gespoeld of gegevens zijn gelezen van schijf om aan een verzoek te voldoen.

Kan ik een duidelijke verklaring voor het nageslacht krijgen?


68
2018-06-10 15:46


oorsprong


stackoverflow.com/questions/6345020/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Het lijkt meer op metadata die je in buffers vindt, het is niet gerelateerd aan io-buffers. Sommige kernelbuffers worden verwerkt in de plaattoewijzer, maar tellen helemaal niet mee voor buffers of cachegeheugen. - eckes


antwoorden:


Het "gecachte" totaal zal ook enkele andere geheugentoewijzingen omvatten, zoals eventuele tmpfs-bestanden. Om dit te zien, probeer je:

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

en je ziet de "cache" -waarde dalen met de 100 MB die je naar het RAM-gebaseerde bestandssysteem hebt gekopieerd (ervan uitgaande dat er voldoende vrije RAM was, zou je kunnen merken dat een deel ervan in ruil is terechtgekomen als de machine al overbelast is in termen van geheugengebruik). De "sync; echo 3> / proc / sys / vm / drop_caches" vóór elke oproep om gratis te zijn, zou alles in behandeling moeten schrijven in alle schrijfbuffers (de sync) en alle in de cache opgeslagen / gebufferde schijfblokken uit het geheugen moeten wissen, dus gratis zal alleen andere lezen toewijzingen in de "gecachte" waarde.

Het RAM dat door virtuele machines wordt gebruikt (zoals die welke onder VMWare draaien) kan ook worden geteld in de vrije "cache" -waarde, net als RAM dat wordt gebruikt door momenteel geopende geheugenmap-bestanden (dit zal variëren afhankelijk van de hypervisor / versie die u gebruikt en mogelijk ook tussen kernelversies).

Het is dus niet zo eenvoudig als "buffertellingen in afwachting van bestands- / netwerkschrijvers en in de cache tellen recent gelezen / geschreven blokken in de RAM om toekomstige fysieke leesmappen te bewaren", hoewel voor de meeste doeleinden deze eenvoudiger beschrijving zal doen.


41
2018-06-10 16:26



+1 voor interessante nuances. Dit is het soort informatie dat ik zoek. Ik vermoed zelfs dat de cijfers zo gecompliceerd zijn, zo betrokken bij zoveel verschillende activiteiten, dat ze op zijn best algemene indicatoren zijn. - Avery Payne
Ik denk niet dat het RAM-geheugen dat door virtuele machines wordt gebruikt, wordt geteld als "in cache", tenminste voor qemu-kvm. Ik merk dat op mijn KVM-host de cachewaarde niet alleen te klein is om correct te zijn (bij 1,9 Gig), maar het verandert niet als ik een van mijn VM's vernietig / start. Het verandert ook niet als ik de tmpfs-mounttruc op een van de VM's uitvoer. Ik creëerde daar een 800Meg tmpfs-partitie en "cached" toonde de juiste waarden op de VM, maar deze veranderde niet op de VM-host. Maar de "gebruikte" waarde is gekrompen / gegroeid toen ik mijn VM vernietigde / opstartte. - Mike S
... Ik heb tests uitgevoerd op een Centos 7.2.1511 VM-host met kernel 3.10.0-327. - Mike S
@MikeS: Hoe verschillende virtualisatieoplossingen omgaan met geheugen kan variëren, in feite kan de kernel die verschillende soorten geheugengebruik gebruikt tussen hoofdversies veranderen. - David Spillett
@MikeS: met betrekking tot "voer de tmpfs-mount-truc uit op een van de VM's" - I die de hostleesresultaten niet zal beïnvloeden als ze geen andere mem weergeven die door de VM wordt gebruikt. Ik zie het effect in een KVM VM zelf: vóór dd vrij = 2020, na dd vrij = 1899, na drop fs free = 2001 (het verschil van 19Mb zal te wijten zijn aan andere processen op de VM, het was niet inactief toen ik rende de test). De host ziet de wijziging mogelijk niet: het geheugen is waarschijnlijk nog steeds toegewezen aan de VM, ook al is het gratis voor gebruik door processen in de VM. - David Spillett


Moeilijke vraag. Wanneer u vrije ruimte berekent, moet u beide buffer en cache toevoegen. Dit is wat ik kon vinden

Een buffer is iets dat nog moet worden "geschreven" naar schijf. Een cache is iets dat is "gelezen" vanaf de schijf en opgeslagen voor later gebruik.

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


8
2018-06-11 12:01





Ik was op zoek naar meer duidelijke beschrijving over buffer en ik vond het in "Professional Linux Kernel Architecture 2008"

Hoofdstuk 16: Pagina en buffercache

wisselwerking

Het instellen van een koppeling tussen pagina's en buffers heeft weinig zin als   er zijn geen voordelen voor andere delen van de kernel. Zoals al opgemerkt,   sommige overdrachtbewerkingen van en naar blokapparaten moeten mogelijk zijn   uitgevoerd in eenheden waarvan de grootte afhangt van de blokgrootte van de   onderliggende apparaten, terwijl veel delen van de kernel de voorkeur hebben om te dragen   uit I / O-operaties met paginagranulariteit, omdat dit dingen veel maakt   eenvoudiger - vooral op het gebied van geheugenbeheer. In deze   scenario, buffers fungeren als tussenpersonen tussen de twee werelden.


5
2018-01-23 08:07





Buffer / cache vrijmaken

Waarschuwing Dit verklaart een sterke methode die niet wordt aanbevolen op de productieserver! Dus je bent gewaarschuwd, geef mij niet de schuld als er iets misgaat.

Voor begrip, het ding, je zou kunnen dwingen uw systeem om zoveel mogelijk geheugen te delegeren naar cache dan het cachebestand laten vallen:

Preambule

Voordat u de test uitvoert, kunt u een ander venster een hit openen:

$ 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
...

voor het volgen van de evolutie van swap in real time.

Nota: Je moet zoveel schijf vrij in de huidige map verwijderen, je hebt mem + swap

De 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, de gastheer waarop ik dit heb gedaan, wordt sterk gebruikt. Dit wordt belangrijker op een hele stille machine.


2
2018-02-25 13:41



-1 als ik kon. Dit is allebei (A) niet relevant voor de gestelde vraag en (B) een vreselijk botte manier om de cacheaansluiting te triggeren. Er zijn directe manieren om dit laatste te doen, dus het is niet verdedigbaar om het systeem te misleiden door het te spammen met gegevens totdat het wordt opgesoupeerd als een neveneffect - underscore_d
Oh mijn god! Doe dat nooit op echte servers! - tamerlaha
@Tamerlaha I aggree, maar lees alsjeblieft de eerste alinea opnieuw: je bent gewaarschuwd, geef mij niet de schuld! Het doel hiervan is om de buffer / cache-implicatie te tonen. - F. Hauri


Uitgelegd door Rode Hoed:

Cache-pagina's:

Een cache is het deel van het geheugen dat op transparante wijze gegevens opslaat zodat toekomstige verzoeken om die gegevens sneller kunnen worden verwerkt. Dit geheugen wordt gebruikt door de kernel om schijfgegevens te cachen en de i / o-prestaties te verbeteren.

De Linux-kernel is zo gebouwd dat deze zoveel mogelijk RAM-geheugen gebruikt om informatie van uw lokale en externe bestandssystemen en schijven te cachen. Naarmate de tijd verstrijkt, worden verschillende lees- en schrijfbewerkingen uitgevoerd op het systeem. De kernel probeert gegevens in het geheugen te bewaren voor de verschillende processen die op het systeem worden uitgevoerd of de gegevens van relevante processen die in de nabije toekomst zouden worden gebruikt. De cache wordt niet teruggewonnen op het moment dat het proces wordt stop / exit, maar wanneer de andere processen meer geheugen vereisen dan het gratis beschikbare geheugen, zal kernel heuristieken uitvoeren om het geheugen terug te winnen door de cachegegevens op te slaan en dat geheugen toe te wijzen aan een nieuw proces.

Wanneer om welk soort bestand / gegevens dan ook wordt gevraagd, zal de kernel zoeken naar een kopie van het deel van het bestand waar de gebruiker op handelt, en als er geen dergelijke kopie bestaat, wijst het een nieuwe pagina cache-geheugen toe en vult het met de juiste inhoud die wordt uitgelezen van de schijf.

De gegevens die in een cache zijn opgeslagen, kunnen waarden zijn die eerder zijn berekend of duplicaten van oorspronkelijke waarden die elders op de schijf zijn opgeslagen. Wanneer om bepaalde gegevens wordt gevraagd, wordt de cache eerst gecontroleerd om te zien of deze die gegevens bevat. De gegevens kunnen sneller uit de cache worden opgehaald dan uit de bron afkomstig zijn.

SysV gedeelde geheugensegmenten worden ook als een cache aangemerkt, hoewel ze geen gegevens op de schijven vertegenwoordigen. Men kan de grootte van de gedeelde geheugensegmenten controleren door ipcs -m te gebruiken en de kolom bytes te controleren.

Buffers:

Buffers zijn de schijfblokrepresentatie van de gegevens die zijn opgeslagen onder de paginacaches. Buffers bevat de metadata van de bestanden / gegevens die zich onder de paginacache bevinden. Voorbeeld: wanneer er een verzoek is van gegevens die aanwezig zijn in de pagina-cache, controleert de kernel eerst de gegevens in de buffers die de metagegevens bevatten die naar de werkelijke bestanden / gegevens in de pagina-caches verwijzen. Eenmaal uit de metadata is het eigenlijke blokadres van het bestand bekend, het wordt door de kernel opgepakt voor verwerking.


2
2017-10-14 20:36