Memorizzazione nella cache / precaricamento dei file su Linux nella RAM


74

Ho un server piuttosto vecchio che ha 4 GB di RAM e serve praticamente gli stessi file tutto il giorno, ma lo fa dal disco rigido mentre 3 GB di RAM sono "liberi".

Chiunque abbia mai provato a guidare un ram-drive può vedere che è fantastico in termini di velocità. L'utilizzo della memoria di questo sistema di solito non è mai superiore a 1 GB / 4 GB, quindi voglio sapere se esiste un modo per utilizzare quella memoria aggiuntiva per qualcosa di buono.

  • È possibile dire al filesystem di servire sempre determinati file dalla RAM?
  • Esistono altri metodi che posso utilizzare per migliorare le capacità di lettura dei file utilizzando la RAM?

Più specificamente, non sto cercando un "hack" qui. Voglio che le chiamate al file system servano i file dalla RAM senza bisogno di creare un ram-drive e copiarli manualmente. O almeno una sceneggiatura che fa questo per me.

Le possibili applicazioni qui sono:

  • Server Web con file statici che vengono letti molto
  • Server applicazioni con librerie di grandi dimensioni
  • Computer desktop con troppa RAM

Qualche idea?

Modificare:

  • Ho trovato questo molto informativo: The Page Page Cache e pdflush di Linux
  • Come ha sottolineato Zan, la memoria non è in realtà libera. Quello che voglio dire è che non viene utilizzato dalle applicazioni e voglio controllare ciò che dovrebbe essere memorizzato nella cache.

1
Anch'io cerco qualcosa in questo senso. Non penso che la cache di blocco del disco del filesystem generale sia la risposta. Supponiamo che io voglia che il blocco disco X sia sempre memorizzato nella cache. Qualcosa vi accede e il kernel lo memorizza nella cache. Fin qui tutto bene, ma il prossimo processo vuole il blocco Y, quindi il kernel scarta il mio blocco X e memorizza nella cache Y invece. Il prossimo processo che vuole X dovrà aspettare che esca dal disco; questo è quello che voglio evitare. Quello che vorrei (e quello che penso sia anche il poster originale) è sovrapporre una cache write-through su un filesystem che garantirà che i file siano sempre

1
Dato che il consenso sembra essere che Linux dovrebbe già memorizzare nella cache i file usati di frequente, mi chiedo se tu sia effettivamente riuscito a fare qualche miglioramento usando i consigli che trovi qui. Mi sembra che provare a controllare manualmente la memorizzazione nella cache possa essere utile per riscaldare la cache, ma che con il modello di utilizzo che descrivi ("servire gli stessi file tutto il giorno"), non aiuterebbe un server già riscaldato molto, se non del tutto.
Nate CK,

Dici che non stai cercando un hack, ma Linux fa già quello che vuoi fare di default. La seguente equazione: "servire gli stessi file tutto il giorno" + "indica al filesystem di servire sempre determinati file fuori dalla RAM" equivale a "Hack" per definizione. Hai notato miglioramenti delle prestazioni? In base alla mia esperienza, la cache di Linux è il risultato del tuo filesystem.
Mike S,

2
Per chiarimenti, Linux esegue la cache dei file, ma i metadati sono convalidati per ciascun file per ogni richiesta. Su ruggine che gira, su un server Web occupato con molti file di piccole dimensioni, che può ancora causare conflitti di IO e logorare prematuramente le unità. Il contenuto e gli script statici possono essere sincronizzati in / dev / shm o in un montaggio tmpfs personalizzato all'avvio dell'app. L'ho fatto per un paio di decenni e le mie unità non si consumano prematuramente. Anche i miei siti resistono molto meglio a carichi di scoppio così. Questo aiuta su qualsiasi cosa, dall'hardware aziendale più costoso all'hardware delle materie prime.
Aaron,

Risposte:


57

vmtouch sembra un buon strumento per il lavoro.

Mette in risalto:

  • interrogare la quantità di una directory memorizzata nella cache
  • interroga la quantità di file memorizzata nella cache (anche quali pagine, rappresentazione grafica)
  • carica il file nella cache
  • rimuove il file dalla cache
  • blocca i file nella cache
  • esegui come demone

manuale di vmtouch

EDIT: L' uso come richiesto nella domanda è elencato nell'esempio 5 su vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Come notato nei commenti, ora è disponibile un repository git .


5
Per i futuri spettatori, prova a utilizzare il repository gm vuch toto invece di seguire le istruzioni sulla pagina collegata. In questo modo ottieni un makefile e puoi estrarre gli aggiornamenti.
casuale

Sembra che ci sia un limite alla dimensione del file (4 GB). C'è qualche altra alternativa?
Alix Axel,

Ok, ecco il mio caso d'uso reale: un RPi1 con una vecchia scheda SD, là fuori da qualche parte che fa cose. Prima di arrivare a fare un viaggio lì e sostituire la scheda (e possibilmente l'alimentatore), voglio che il sistema operativo tocchi la scheda con parsimonia, preferibilmente mai. La cache di FS è buona ma fuori dal mio controllo; / bin e / sbin sono già su tmpfs, anche ottenere / home / user ha altri svantaggi. vmtouchsi adatta bene a questa nicchia.
Piskvor,

come funziona vmtouch in modo diverso rispetto a tmpfs?
Edward Torvalds,

26

Questo è possibile anche utilizzando il vmtouch memoria Toucher virtuale utility .

Lo strumento consente di controllare la cache del filesystem su un sistema Linux. È possibile forzare o bloccare un file o una directory specifici nel sottosistema di cache della VM o utilizzarlo per verificare quali parti di un file / directory sono contenute nella VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

O...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
questa è una grande utilità e fa esattamente ciò che OP ha richiesto. Se solo lo accettasse come risposta.
laebshade

Sai se funziona con ZFS?
CMCDragonkai,

1
@CMCDragonkai Non credo sia necessario con ZFS ... Pensa: ARC e L2ARC .
ewwhite,

22

Il trucco di un uomo povero per ottenere roba nella cache del filesystem è semplicemente cat e reindirizzarlo su / dev / null.


1
Essere d'accordo. E se vuoi assicurarti che alcuni file siano memorizzati nella cache, fai un lavoro cron che catè il file su / dev / null periodicamente
Josh

18

Linux memorizzerà nella cache il maggior numero possibile di I / O su disco. Questo è ciò che sono le statistiche di memoria cache e buffer. Probabilmente farà un lavoro migliore di quello che farai per conservare le cose giuste.

Tuttavia, se si insiste nella memorizzazione dei dati in memoria, è possibile creare un'unità ram usando tmpfs o ramfs. La differenza è che ramfs assegnerà tutta la memoria richiesta, poiché tmpfs utilizzerà solo la memoria utilizzata dal dispositivo a blocchi. La mia memoria è un po 'arrugginita, ma dovresti essere in grado di fare:

 # mount -t ramfs ram /mnt/ram 

o

 # mount -t tmpfs tmp /mnt/tmp

e quindi copia i tuoi dati nella directory. Ovviamente, quando si spegne la macchina o si smonta quella partizione, i dati andranno persi.


1
Grazie per la tua risposta, ma questo è ovviamente ciò che voglio evitare. Altrimenti lo farei solo per copiarlo in modo che il computer crei il ramdrive, copi i file e si colleghi simbolicamente al ramdrive. Ma poi i miei dati sono incoerenti. Speravo in un filesystem in cui posso 'taggare' alcuni file per essere memorizzati nella cache. Ma forse sono un po 'troppo ottimista.
Andrioid,

3
"Tagga" i file da memorizzare nella cache accedendoli.
womble

9
Se solo ci fosse un modo per taggare automaticamente i file più comunemente usati.
David Pashley,

4
Blimey, il sarcasmo non viaggia bene lo fa :)
David Pashley,

2
Si Grazie. Comprendo il concetto di IO cache. L'ho anche spiegato nella mia risposta. Sembra che tu non abbia letto il sottile commento che si trattava di sarcasmo.
David Pashley,

18

Dopo alcune approfondite letture sulle funzionalità di scambio e cache della pagina 2.6 del kernel ho trovato 'fcoretools'. Che consiste di due strumenti;

  • fincore: rivelerà quante pagine l'applicazione ha archiviato nella memoria principale
  • fadvise: consente di manipolare la memoria principale (page-cache).

(Nel caso qualcun altro lo trovi interessante, lo sto pubblicando qui)


1
Ho pensato che ci fosse un programma per farlo da qualche parte. +1
Brad Gilbert,

7

Esistono due impostazioni del kernel che possono aiutare considerevolmente anche senza usare altri strumenti:

swappiness

dice al kernel linux quanto aggressivamente dovrebbe usare lo swap. Citando l'articolo di Wikipedia:

Swappiness è una proprietà per il kernel Linux che modifica l'equilibrio tra lo scambio della memoria di runtime, invece di eliminare le pagine dalla cache delle pagine di sistema. Lo swappiness può essere impostato su valori compresi tra 0 e 100 inclusi. Un valore basso indica che il kernel tenterà di evitare lo scambio il più possibile laddove un valore più elevato invece farà tentare in modo aggressivo dal kernel di utilizzare lo spazio di scambio. Il valore predefinito è 60 e, per la maggior parte dei sistemi desktop, impostarlo su 100 può influire sulle prestazioni complessive, mentre impostarlo su un valore più basso (anche 0) può migliorare l'interattività (diminuendo la latenza della risposta).

vfs_cache_pressure

Citando da vm.txt :

Controlla la tendenza del kernel a recuperare la memoria utilizzata per la memorizzazione nella cache degli oggetti directory e inode.

Al valore predefinito di vfs_cache_pressure = 100, il kernel tenterà di recuperare i dentisti e gli inode a un tasso "equo" rispetto a quelli di pagecache e swapcache. La riduzione di vfs_cache_pressure fa sì che il kernel preferisca conservare la cache dentaria e inode. ...


Impostando swappinesshigh (come 100), il kernel sposta tutto ciò che non è necessario scambiare, liberando RAM per i file di cache. E impostando un valore vfs_cache_pressurepiù basso (diciamo 50, non 0!), Favorirà la memorizzazione nella cache dei file invece di conservare i dati dell'applicazione nella RAM.

(Lavoro su un grande progetto Java e ogni volta che lo eseguo, ho impiegato molta RAM e scaricato la cache del disco, quindi la prossima volta che ho compilato il progetto tutto è stato letto di nuovo dal disco. Regolando queste due impostazioni, riesco per mantenere le fonti e l'output compilato nella cache nella RAM, il che accelera notevolmente il processo.)


3

Dubito fortemente che stia effettivamente servendo file dal disco con 3 GB di RAM liberi. La memorizzazione nella cache dei file Linux è molto buona.

Se vedi il disco IO, esaminerei le tue configurazioni di registrazione. Molti registri vengono impostati come non bufferizzati, al fine di garantire la disponibilità delle informazioni di registro più recenti in caso di arresto anomalo. Nei sistemi che devono essere veloci a prescindere, utilizzare IO di registro bufferizzato o utilizzare un server di registro remoto.


Giusto, voglio solo controllare ciò che viene memorizzato nella cache.
Andrioid,

3

Se hai molta memoria, puoi semplicemente leggere i file che vuoi memorizzare nella cache con cat o simili. Linux farà quindi un buon lavoro per mantenerlo in giro.


3

Potresti essere in grado di avere un programma che mmapesegue solo i tuoi file, quindi rimane in esecuzione.


3
Questo è praticamente ciò che fa "fadvise" (fcoretools), per quanto ne so.
Andrioid,

0

Esistono vari sistemi ramfs che è possibile utilizzare (ad es. Ramfs, tmpfs), ma in generale se i file vengono effettivamente letti spesso, si trovano nella cache del filesystem. Se il tuo set di file di lavoro è più grande della tua RAM libera, i file verranno cancellati da esso - ma se la tua serie di lavoro è più grande della tua RAM libera, non c'è modo di inserirla in un ramdisk.

Controlla l'output del comando "free" in una shell: il valore nell'ultima colonna, in "Cache", indica la quantità di RAM libera utilizzata per la cache del filesystem.


0

Per quanto riguarda la tua ultima domanda, assicurati che la tua RAM si trovi su canali di memoria diversi in modo che il processore possa recuperare i dati in parallelo.


0

Penso che questo potrebbe essere risolto meglio a livello di applicazione. Ad esempio, ci sono probabilmente server web specializzati per questo, oppure potresti prendere in considerazione mod_cache con Apache. Se hai un obiettivo specifico, come servire più velocemente i contenuti web, puoi ottenere miglioramenti da questo genere di cose che penso.

Ma la tua domanda è di natura generale, il sottosistema di memoria Linux è progettato per fornire il miglior uso generale della RAM. Se vuoi scegliere come target determinati tipi di prestazioni, considera di cercare tutto in / proc / sys / vm.

Il pacchetto fcoretools è interessante, sarei interessato a qualsiasi articolo sulla sua applicazione ... Questo link parla delle effettive chiamate di sistema utilizzate in un'applicazione.


1
find / var / lib / mysql | xargs fadvise -willneed (sporco, ma dovrebbe fornire un accesso più rapido ai file del database; ad esempio)
Andrioid

Ottimo hack, ma tale hack non disabilita molti fsync in attesa da mysql :( fsyncs sono necessari per garantire ACID (Atomicità, Coerenza, Isolamento, Durabilità).
Osgx

0

I computer desktop (ad es. Ubuntu) utilizzano già file di precaricamento (almeno, librerie condivise popolari) per la memoria all'avvio. Viene utilizzato per accelerare i tempi di avvio e avvio di diversi bloarware come FF, OO, KDE e GNOME (con evoluzione bloat-mailer).

Lo strumento si chiama readahead http://packages.ubuntu.com/dapper/admin/readahead

Esiste anche syscall corrispondente: readahead (2) http://linux.die.net/man/2/readahead

Esiste anche un progetto di daemon di precaricamento: http://linux.die.net/man/8/preload



0

ho appena provato dd if = / dev / yourrootpartition di = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

non mi dà il controllo che desideri ma almeno cerca di usare la memoria sprecata


0

io uso find / -name stringofrandomcharacter che aiuta molto


0

Non esattamente quello che è stato chiesto, ma io uso

trova BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

per attivare l'inizializzazione dei file in un volume AWS creato da un'istantanea. È più focalizzato rispetto alla raccomandazione ufficiale di usare dd se vuoi solo leggere alcuni file.


-1

A volte potrei voler memorizzare nella cache i file in una determinata cartella e nelle sue sottocartelle. Vado in questa cartella ed eseguo quanto segue:

trova . -exec cp {} / dev / null \;

E quei file sono memorizzati nella cache

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.