Linux alatt a Page Cache felgyorsítja a nem illékony tárolókon lévő fájlok elérését. Ez azért történik, mert amikor először olvas az adathordozókról, például a merevlemezekről, vagy ír azokra, a Linux a memória nem használt területein is tárolja az adatokat, ami gyorsítótárként működik. Ha ezt az adatot később újra beolvassák, akkor gyorsan kiolvasható ebből a memóriában lévő gyorsítótárból. Ez a cikk értékes háttérinformációkkal szolgál erről a lap gyorsítótárról.
Lap gyorsítótár vagy puffer gyorsítótár
A lap gyorsítótárra gyakran használják a Buffer Cache kifejezést. A Linux rendszermagok a 2.2-es verzióig rendelkeztek mind Page Cache, mind Buffer Cache gyorsítótárral. A 2.4-es kerneltől kezdve ezt a két gyorsítótárat egyesítették. Ma már csak egy gyorsítótár van, a Page Cache.
Funkcionális megközelítés
Memóriahasználat
Linux alatt a free -m
parancs által készített jelentés Cached oszlopában látható a Page Cache által jelenleg használt főmemória megabájtjainak száma.
# free -m total used free shared buffers cachedMem: 15976 15195 781 0 167 9153-/+ buffers/cache: 5874 10102Swap: 2000 0 1999#
Az írás
Ha adatot írunk, az először a Page Cache-be íródik, és a piszkos oldalak egyikeként kezeljük. A piszkos azt jelenti, hogy az adatok a Page Cache-ben tárolódnak, de először a mögöttes tárolóeszközre kell írni őket. Ezeknek a piszkos oldalaknak a tartalma periodikusan (valamint a sync vagy fsync rendszerhívásokkal) átkerül a mögöttes tárolóeszközre. Ez utóbbi esetben a rendszer lehet egy RAID-vezérlő vagy közvetlenül a merevlemez.
A következő példa egy 10 megabájtos fájl létrehozását mutatja be, amely először a Page Cache-be íródik. A szennyezett oldalak száma ezzel addig növekszik, amíg a mögöttes szilárdtest-meghajtóra (SSD) nem íródik, ebben az esetben manuálisan, a szinkronizálási parancsra válaszul.
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
A mag 2.6.31-es verziójáig: pdflush
A 2.6.31-es verzióig bezárólag.31-es verziójáig a Linux kernel pdflush szálai biztosították, hogy a piszkos lapok periodikusan kiíródjanak a mögöttes tárolóeszközre.
A 2.6.32-es verzió óta: háttértár-alapú visszaírás
Mivel a pdflush-nek számos teljesítménybeli hátránya volt, Jens Axboe a Linux Kernel 2.6.32-es verziójához egy új, hatékonyabb visszaírási mechanizmust fejlesztett ki.
Ez a megközelítés minden eszközhöz biztosít szálakat, ahogy az alábbi példa is mutatja egy SSD-vel (/dev/sda) és egy merevlemezzel (/dev/sdb) rendelkező számítógép esetében.
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
Reading
A fájlblokkok nem csak íráskor, hanem olvasáskor is íródnak a Page Cache-be. Ha például egy 100 megabájtos fájlt kétszer olvas be, egyszer egymás után, a második elérés gyorsabb lesz, mert a fájlblokkok közvetlenül a Page Cache memóriából érkeznek a memóriába, és nem kell újra beolvasni a merevlemezről. Az alábbi példa azt mutatja, hogy egy jó 200 megabájtos videó lejátszása után megnőtt a Page Cache mérete.
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:~$
Ha a Linuxnak a normál alkalmazásokhoz több memóriára van szüksége, mint amennyi jelenleg rendelkezésre áll, a Page Cache már nem használt területei automatikusan törlődnek.
A Page Cache optimalizálása
A fájlblokkok automatikus tárolása a Page Cache-ben általában igen előnyös. Egyes adatokra, például a naplófájlokra vagy a MySQL dump fájlokra gyakran már nincs szükség, miután megírták őket. Ezért az ilyen fájlblokkok gyakran feleslegesen foglalnak helyet a Page Cache-ben. Más fájlblokkok, amelyek tárolása előnyösebb lenne, idő előtt törlődhetnek a Page Cache-ből az újabb naplófájlok vagy a MySQL által.
A logrotate gzip tömörítéssel történő rendszeres futtatása némileg segíthet a naplófájlok esetében. Ha egy 500 megabájtos naplófájlt a logrotate és a gzip segítségével 10 megabájtosra tömörítünk, az eredeti naplófájl a gyorsítótárhelyével együtt érvénytelenné válik. A Page Cache-ben így 490 megabájt válik elérhetővé. Ezzel csökken annak a veszélye, hogy a folyamatosan növekvő naplófájl kiszorít hasznosabb fájlblokkokat a Page Cache-ből.
Ezért teljesen ésszerű, ha egyes alkalmazások általában nem tárolnak bizonyos fájlokat és fájlblokkokat a gyorsítótárban. Az rsync-hez már létezik ilyen javítás.
- A puffer gyorsítótár (15.3. szakasz) 348. oldal, Linux-Kernel Manual: 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)
- A Linux teljesítményének javítása a puffer gyorsítótár állapotának megőrzésével (insights.oetiker.ch)
Kiegészítő információk
- Page Cache, a memória és a fájlok viszonya (blog)
- Linux buffer cache állapota (blog)
- A Linux Page Cache és a 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)