V Linuxu urychluje mezipaměť stránek mnoho přístupů k souborům na nevolatilním úložišti. Děje se tak proto, že Linux při prvním čtení z datových médií, jako jsou pevné disky, nebo při zápisu na ně ukládá data také do nepoužívaných oblastí paměti, které fungují jako mezipaměť. Pokud jsou tato data později znovu čtena, lze je rychle načíst z této mezipaměti v paměti. Tento článek poskytne cenné základní informace o této mezipaměti stránek.
Page Cache nebo Buffer Cache
Pro mezipaměť stránek se často používá termín vyrovnávací paměť. Jádra Linuxu až do verze 2.2 měla jak Page Cache, tak i Buffer Cache. Od jádra verze 2.4 byly tyto dvě mezipaměti sloučeny. Dnes existuje pouze jedna mezipaměť, mezipaměť stránky.
Funkční přístup
Využití paměti
V systému Linux je počet megabajtů operační paměti aktuálně využívaných pro mezipaměť stránky uveden ve sloupci Cached v sestavě vytvořené příkazem free -m
.
# free -m total used free shared buffers cachedMem: 15976 15195 781 0 167 9153-/+ buffers/cache: 5874 10102Swap: 2000 0 1999#
Zápis
Pokud jsou data zapisována, jsou nejprve zapsána do mezipaměti stránek a spravována jako jedna z jejích špinavých stránek. Dirty znamená, že data jsou uložena v mezipaměti Page Cache, ale musí být nejprve zapsána na podkladové úložné zařízení. Obsah těchto špinavých stránek je pravidelně přenášen (stejně jako pomocí systémových volání sync nebo fsync) na podkladové úložné zařízení. Tímto systémem může být v posledním případě řadič RAID nebo přímo pevný disk.
Následující příklad ukáže vytvoření 10megabajtového souboru, který bude nejprve zapsán do mezipaměti Page Cache. Počet znečištěných stránek se tím bude zvyšovat, dokud nebudou zapsány na podkladový pevný disk (SSD), v tomto případě ručně v reakci na příkaz sync.
wfischer@pc:~$ dd if=/dev/zero of=testfile.txt bs=1M count=1010+0 records in10+0 records out10485760 bytes (10 MB) copied, 0,0121043 s, 866 MB/swfischer@pc:~$ cat /proc/meminfo | grep DirtyDirty: 10260 kBwfischer@pc:~$ syncwfischer@pc:~$ cat /proc/meminfo | grep DirtyDirty: 0 kB
Do verze 2.6.31 jádra: pdflush
Do verze 2.6.31 jádra: pdflush včetně.31 linuxového jádra zajišťovala vlákna pdflush pravidelný zápis špinavých stránek na podkladové úložné zařízení.
Od verze 2.6.32: zpětný zápis na základě zálohovacího zařízení
Protože pdflush mělo několik výkonnostních nevýhod, vyvinul Jens Axboe pro verzi 2.6.32 linuxového jádra nový, efektivnější mechanismus zpětného zápisu.
Tento přístup poskytuje vlákna pro každé zařízení, jak ukazuje následující příklad počítače s jednotkou SSD (/dev/sda) a pevným diskem (/dev/sdb).
root@pc:~# ls -l /dev/sdabrw-rw---- 1 root disk 8, 0 2011-09-01 10:36 /dev/sdaroot@pc:~# ls -l /dev/sdbbrw-rw---- 1 root disk 8, 16 2011-09-01 10:36 /dev/sdbroot@pc:~# ps -eaf | grep -i flushroot 935 2 0 10:36 ? 00:00:00 root 936 2 0 10:36 ? 00:00:00
Čtení
Bloky souborů se zapisují do mezipaměti stránek nejen při zápisu, ale také při čtení souborů. Například při čtení 100megabajtového souboru dvakrát, jednou za sebou, bude druhý přístup rychlejší, protože bloky souboru pocházejí přímo z paměti Page Cache a nemusí se znovu číst z pevného disku. Následující příklad ukazuje, že velikost mezipaměti Page Cache se po přehrání kvalitního 200megabajtového videa zvětšila.
user@adminpc:~$ free -m total used free shared buffers cachedMem: 3884 1812 2071 0 60 1328-/+ buffers/cache: 424 3459Swap: 1956 0 1956user@adminpc:~$ vlc video.aviuser@adminpc:~$ free -m total used free shared buffers cachedMem: 3884 2056 1827 0 60 1566-/+ buffers/cache: 429 3454Swap: 1956 0 1956user@adminpc:~$
Potřebuje-li Linux pro běžné aplikace více paměti, než je aktuálně k dispozici, oblasti mezipaměti Page Cache, které se již nepoužívají, se automaticky odstraní.
Optimalizace mezipaměti Page Cache
Automatické ukládání bloků souborů do mezipaměti Page Cache je obecně poměrně výhodné. Některá data, například soubory protokolu nebo výpisové soubory MySQL, již často nejsou po zapsání potřeba. Proto takové bloky souborů často zbytečně zabírají místo ve vyrovnávací paměti stránek. Jiné bloky souborů, jejichž uložení by bylo výhodnější, mohou být z mezipaměti stránek předčasně odstraněny novějšími soubory protokolu nebo MySQL.
Periodické provádění logrotate s kompresí gzip může u souborů protokolu poněkud pomoci. Když se 500megabajtový soubor protokolu zkomprimuje pomocí logrotate a gzip na 10 megabajtů, původní soubor protokolu se stane neplatným spolu s místem v mezipaměti. Ve vyrovnávací paměti stránek se tak uvolní 490 megabajtů. Nebezpečí, že neustále rostoucí soubor protokolu vytlačí užitečnější bloky souborů z mezipaměti Page Cache, se tím sníží.
Proto je zcela rozumné, pokud by některé aplikace běžně neukládaly určité soubory a bloky souborů do mezipaměti. Pro rsync již takový patch existuje.
- Vyrovnávací paměť (kapitola 15.3) strana 348, Příručka k linuxovému jádru: Guidelines for the Design and Implementation of Kernel 2.6, Robert Love, Addison-Wesley, 2005
- Linux 2.6. – 32 Per-backing-device based writeback (kernelnewbies.org)
- Clearing The Linux Buffer Cache (blog.straylightrun.net, 03.12.2009)
- Zlepšení výkonu Linuxu zachováním stavu vyrovnávací paměti (insights.oetiker.ch)
Další informace
- Page Cache, záležitost mezi pamětí a soubory (blog)
- Linux buffer cache state (blog)
- The Linux Page Cache and pdflush: Theory of Operation and Tuning for Write-Heavy Loads (Last update 8/08/2007)
- drop_caches (linuxinsight.com)
- Examining Linux 2.6 Page-Cache Performance (linuxinsight.com)
- Page cache (en.wikipedia.org)