Linux Page Cache Basics

In Linux, la Page Cache accelera molti accessi ai file sulla memoria non volatile. Questo accade perché, quando legge o scrive per la prima volta su supporti di dati come i dischi rigidi, Linux memorizza anche i dati in aree inutilizzate della memoria, che agisce come una cache. Se questi dati vengono letti di nuovo in seguito, possono essere letti rapidamente da questa cache in memoria. Questo articolo fornirà preziose informazioni di base su questa cache di pagina.

Page Cache o Buffer Cache

Il termine, Buffer Cache, è spesso usato per la Page Cache. I kernel Linux fino alla versione 2.2 avevano sia una Page Cache che una Buffer Cache. A partire dal kernel 2.4, queste due cache sono state combinate. Oggi, c’è solo una cache, la Page Cache.

Approccio funzionale

Uso della memoria

In Linux, il numero di megabyte di memoria principale attualmente utilizzato per la cache della pagina è indicato nella colonna Cached del rapporto prodotto dal comando free -m.

# free -m total used free shared buffers cachedMem: 15976 15195 781 0 167 9153-/+ buffers/cache: 5874 10102Swap: 2000 0 1999# 

Scrittura

Se i dati vengono scritti, vengono prima scritti nella cache di pagina e gestiti come una delle sue pagine sporche. Sporca significa che i dati sono memorizzati nella Page Cache, ma devono essere scritti prima sul dispositivo di memorizzazione sottostante. Il contenuto di queste pagine sporche viene periodicamente trasferito (così come con le chiamate di sistema sync o fsync) al dispositivo di memorizzazione sottostante. Il sistema può essere, in quest’ultimo caso, un controller RAID o il disco rigido direttamente.

L’esempio seguente mostrerà la creazione di un file di 10 megabyte, che sarà prima scritto nella Page Cache. Il numero di pagine sporche sarà aumentato in questo modo, fino a quando non saranno state scritte sul sottostante disco a stato solido (SSD), in questo caso manualmente in risposta al comando 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

Fino alla versione 2.6.31 del kernel: pdflush

Fino alla versione 2.6.31 del kernel Linux, i thread pdflush assicuravano che le pagine sporche fossero periodicamente scritte sul dispositivo di memorizzazione sottostante.

A partire dalla versione 2.6.32: writeback basato su per-backing-device

Siccome pdflush aveva diversi svantaggi in termini di prestazioni, Jens Axboe ha sviluppato un nuovo e più efficace meccanismo di writeback per la versione 2.6.32 del Kernel Linux.

Questo approccio fornisce thread per ogni dispositivo, come mostra il seguente esempio di un computer con un SSD (/dev/sda) e un disco rigido (/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 

Lettura

I blocchi di file vengono scritti nella Page Cache non solo durante la scrittura, ma anche durante la lettura dei file. Per esempio, quando si legge un file di 100 megabyte due volte, una dopo l’altra, il secondo accesso sarà più veloce, perché i blocchi di file vengono direttamente dalla Page Cache in memoria e non devono essere letti di nuovo dal disco rigido. L’esempio seguente mostra che la dimensione della Page Cache è aumentata dopo la riproduzione di un buon video da 200 megabyte.

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:~$

Se Linux ha bisogno di più memoria per le normali applicazioni di quella attualmente disponibile, le aree della Page Cache che non sono più in uso verranno automaticamente cancellate.

Ottimizzare la Page Cache

Il salvataggio automatico di blocchi di file nella Page Cache è generalmente abbastanza vantaggioso. Alcuni dati, come i file di log o i file di dump MySQL, spesso non sono più necessari una volta che sono stati scritti. Pertanto, tali blocchi di file spesso usano inutilmente spazio nella cache della pagina. Altri blocchi di file, la cui memorizzazione sarebbe più vantaggiosa, potrebbero essere prematuramente cancellati dalla Page Cache da file di log più recenti o da MySQL.

L’esecuzione periodica di logrotate con compressione gzip può aiutare in qualche modo i file di log. Quando un file di log di 500 megabyte viene compresso in 10 megabyte da logrotate e gzip, il file di log originale diventa non valido insieme al suo spazio nella cache. 490 megabyte nella cache della pagina diventeranno quindi disponibili facendo così. Il pericolo di un file di log in continua crescita che sposta blocchi di file più utili dalla cache della pagina viene così ridotto.

Quindi, è del tutto ragionevole, se alcune applicazioni normalmente non memorizzano certi file e blocchi di file nella cache. C’è già una tale patch disponibile per rsync.

  1. La Buffer Cache (Sezione 15.3) pagina 348, Linux-Kernel Manual: Guidelines for the Design and Implementation of Kernel 2.6, Robert Love, Addison-Wesley, 2005
  2. Linux 2.6. – 32 Per-backing-device based writeback (kernelnewbies.org)
  3. Clearing The Linux Buffer Cache (blog.straylightrun.net, 03.12.2009)
  4. Migliorare le prestazioni di Linux preservando lo stato della cache del buffer (insights.oetiker.ch)

Informazioni aggiuntive

  • Page Cache, the Affair Between Memory and Files (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)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *