- Jaký je rozdíl mezi „buffery“ a jiným typem mezipaměti?
- Proč je tento rozdíl tak výrazný? Proč někteří lidé říkají „vyrovnávací paměť“, když mluví o obsahu souborů v mezipaměti?
- Co jsou
Buffers
používá se pro? - Proč bychom mohli očekávat
Buffers
konkrétně být větší nebo menší?
1. Jaký je rozdíl mezi „buffery“ a jiným typem mezipaměti?
Buffers
zobrazuje velikost mezipaměti stránky používanou pro bloková zařízení. „Blokovat zařízení“ jsou nejběžnějším typem zařízení pro ukládání dat.
Když jádro hlásí Cached
, musí jádro záměrně odečíst tuto částku ze zbytku mezipaměti stránky . Viz 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. Proč je tento rozdíl tak výrazný? Proč někteří lidé říkají „vyrovnávací paměť“, když mluví o obsahu souborů v mezipaměti?
Mezipaměť stránek pracuje v jednotkách velikosti stránky MMU, obvykle minimálně 4096 bajtů. To je nezbytné pro mmap()
, tedy přístup k souborům mapovaným v paměti.[1][2] Je navržen pro sdílení stránek načteného kódu programu / knihovny mezi samostatnými procesy a umožňuje načítání jednotlivých stránek na vyžádání. (Také pro uvolnění stránek, když něco potřebuje místo a nebyly nedávno použity).
[1] I/O mapované v paměti – příručka GNU C Library.
[2] mmap
- Wikipedie.
Starší UNIX měl "vyrovnávací paměť" diskových bloků a neměl mmap(). Zdá se, že když byla mmap() poprvé přidána, přidali mezipaměť stránek jako novou vrstvu navrch. Je to tak chaotické, jak to zní. Nakonec se OS založené na UNIXu zbavily samostatné mezipaměti. Nyní je tedy veškerá mezipaměť souborů v jednotkách stránek. Stránky se vyhledávají podle (soubor, posun), nikoli podle umístění na disku. Říkalo se tomu „unified buffer cache“, možná proto, že lidé byli více obeznámeni s „buffer cache“.[3]
[3] UBC:Efektivní Unified I/O and Memory Caching Subsystem for NetBSD
(„Jedna zajímavá změna, kterou Linux přidává, je, že čísla bloků zařízení, kde je stránka uložena na disku, se ukládají do mezipaměti stránky ve formě seznamu buffer_head
struktur. Když má být upravená stránka zapsána zpět na disk, mohou být I/O požadavky odeslány ovladači zařízení ihned, aniž by bylo nutné číst jakékoli nepřímé bloky, aby bylo možné určit, kam mají být data stránky zapsána."[3])
V Linuxu 2.2 byla samostatná "vyrovnávací paměť" používaná pro zápis, ale ne pro čtení. "Stránková mezipaměť používala vyrovnávací paměť k zapsání svých dat, potřebovala extra kopii dat a zdvojnásobila požadavky na paměť pro některá zatížení zápisu."[4] Nestarejme se příliš o detaily, ale tato historie by byla jedním z důvodů, proč Linux hlásí Buffers
použití samostatně.
[4] Výměna stránky ve správě paměti Linux 2.4, Rik van Riel.
Naproti tomu v Linuxu 2.4 a vyšším dodatečná kopie neexistuje. "Systém provádí vstup a výstup disku přímo do a ze stránky mezipaměti stránky."[4] Linux 2.4 byl vydán v roce 2001.
3. Co jsou Buffers
používá se pro?
Bloková zařízení jsou považována za soubory, stejně jako mezipaměť stránek. To se používá "pro metadata souborového systému a ukládání do mezipaměti zařízení s nezpracovanými bloky".[4] Ale v současných verzích Linuxu souborové systémy nekopírují obsah souborů přes něj, takže neexistuje žádné "dvojité ukládání do mezipaměti".
Myslím na Buffers
část mezipaměti stránky jako mezipaměť vyrovnávací paměti Linuxu. Některé zdroje mohou s touto terminologií nesouhlasit.
Kolik vyrovnávací paměti používá souborový systém, pokud existuje, závisí na typu souborového systému. Systém v otázce používá ext4. ext3/ext4 používají linuxovou vyrovnávací paměť pro žurnál, obsah adresáře a některá další metadata.
Některé systémy souborů, včetně ext3, ext4 a ocfs2, používají vrstvu jbd orjbd2 ke zpracování jejich fyzického žurnálování bloků a tato vrstva v zásadě používá mezipaměť.
-- E-mailový článek od Teda Tso, 2013
Před linuxovým jádrem verze 2.4 měl Linux samostatnou mezipaměť stránek a vyrovnávací paměti. Od verze 2.4 jsou mezipaměť stránek a vyrovnávací paměti sjednoceny a
Buffers
jsou nezpracované diskové bloky, které nejsou zastoupeny v mezipaměti stránky – tj. nejsou to data souboru....
Vyrovnávací paměť však zůstává, protože jádro stále potřebuje provádět blokové I/O z hlediska bloků, nikoli stránek. Protože většina bloků představuje data souboru, většinu mezipaměti představuje mezipaměť stránek. Ale malé množství blokových dat není zálohováno souborem – například metadata a nezpracované blokové I/O – a je tedy reprezentováno pouze vyrovnávací pamětí.
-- Dvojice odpovědí Quora od Roberta Love, poslední aktualizace 2013.
Oba autoři jsou vývojáři Linuxu, kteří pracovali se správou paměti jádra Linuxu. První zdroj je konkrétnější ohledně technických detailů. Druhým zdrojem je obecnější shrnutí, které může být v některých specifikách rozporuplné a zastaralé.
Je pravda, že souborové systémy mohou provádět zápisy metadat na částečnou stránku, i když je mezipaměť indexována ve stránkách. Dokonce i uživatelské procesy mohou provádět zápisy na částečnou stránku, když používají write()
(na rozdíl od mmap()
), alespoň přímo do blokového zařízení. To platí pouze pro zápis, ne pro čtení. Když čtete mezipaměť stránek, mezipaměť stránek vždy čte celé stránky.
Linus s oblibou prohlašoval, že k zápisu o velikosti bloku není vyžadována mezipaměť vyrovnávací paměti a že souborové systémy mohou zapisovat metadata na částečnou stránku i s mezipamětí stránky připojenou k jejich vlastním souborům namísto blokového zařízení. Jsem si jistý, že má pravdu, když říká, že ext2 to dělá. ext3/ext4 se systémem žurnálování nikoli. Méně jasné je, jaké problémy vedly k tomuto návrhu. Lidé, na které křičel, už byli unavení z vysvětlování.
ext4_readdir() nebylo změněno, aby uspokojilo Linusovo chvástání. Nevidím ani jeho požadovaný přístup používaný v readdir() jiných souborových systémů. Myslím, že XFS používá buffer cache i pro adresáře. bcachefs vůbec nepoužívá mezipaměť stránek pro readdir(); používá vlastní mezipaměť pro bstromy. U btrfs si nejsem jistý.
4. Proč bychom mohli očekávat Buffers
konkrétně být větší nebo menší?
V tomto případě se ukázalo, že velikost žurnálu ext4 pro můj souborový systém je 128M. Takže to vysvětluje, proč 1) moje mezipaměť se může stabilizovat na mírně nad 128M; 2) mezipaměť se neškáluje úměrně s větším množstvím paměti RAM na mém notebooku.
Některé další možné příčiny najdete v tématu Co je sloupec vyrovnávacích pamětí ve výstupu z free? Všimněte si, že "vyrovnávací paměti" hlášeny free
je ve skutečnosti kombinací Buffers
a obnovitelnou paměť jádra.
Abych ověřil, že zápisy do žurnálu používají mezipaměť vyrovnávací paměti, simuloval jsem souborový systém v pěkně rychlé RAM (tmpfs) a porovnal maximální využití vyrovnávací paměti pro různé velikosti žurnálu.
# 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
Historie této odpovědi:Jak jsem se dostal k nahlédnutí do deníku
Jako první jsem našel e-mail Teda Tso a zaujalo mě, že zdůrazňoval psát ukládání do mezipaměti. Překvapilo by mě, kdyby „špinavé“, nepsané data byla schopna dosáhnout 30 % RAM v mém systému. sudo atop
ukazuje, že v intervalu 10 sekund dotyčný systém trvale zapíše pouze 1 MB. Dotyčný souborový systém by byl schopen držet krok s více než 100násobkem této rychlosti. (Je na pevném disku USB2, maximální propustnost ~20 MB/s).
Pomocí blktrace (btrace -w 10 /dev/sda
) potvrzuje, že vstupy do mezipaměti, které jsou ukládány do mezipaměti, musí být zapisovány, protože se nečtou téměř žádná data. Také, že mysqld
je jediným uživatelským prostorem proces provádějící IO.
Zastavil jsem službu odpovědnou za zápisy (zápis icinga2 do mysql) a znovu zkontroloval. Viděl jsem, jak "nárazníky" klesly pod 20 milionů - nemám pro to vysvětlení - a zůstaly tam. Opětovné restartování zapisovače ukazuje, že "vyrovnávací paměti" rostou o ~0,1 milionu za každých 10 sekund. Pozoroval jsem, že si tuto rychlost neustále udržuje a šplhá zpět na 70 milionů a výše.
Spuštěn echo 3 | sudo tee /proc/sys/vm/drop_caches
stačilo opět snížit "nárazníky" na 4,5M. To dokazuje, že moje akumulace vyrovnávacích pamětí je „čistá“ mezipaměť, kterou Linux může v případě potřeby okamžitě zahodit. Tento systém se nehromadí nepsaný data. (drop_caches
neprovádí žádný zpětný zápis, a proto nemůže zahodit špinavé stránky. Pokud byste chtěli spustit test, který nejprve vyčistí mezipaměť, použijete sync
příkaz).
Celý adresář mysql má pouze 150 milionů. Akumulující se vyrovnávací paměti musí představovat bloky metadat ze zápisů mysql, ale překvapilo mě, že pro tato data existuje tolik bloků metadat.
Vaše verze free
má správný nápad. Ve výchozím nastavení kombinuje vyrovnávací paměti a mezipaměť ve své zprávě. Je to proto, že jsou v podstatě totéž. Oba jsou počítačem, který si pamatuje v RAM (rychlejší sekundární úložiště:Disky a SSD), to, co již viděl při čtení disku a SSD.
Pokud má operační systém pocit, že paměť lépe využívá něco jiného, může ji uvolnit. Proto si nedělejte starosti s vyrovnávací pamětí a mezipamětí.
Sledování DVD však může způsobit zvýšení vyrovnávací paměti a vymazání dalšího obsahu vyrovnávací paměti/mezipaměti. Proto můžete ke spuštění DVD přehrávače použít nocache (pokud to způsobuje problém ).