sviluppo-web-qa.it

Memorizzazione nella cache / precaricamento dei file su Linux in RAM

Ho un server piuttosto vecchio che ha 4 GB di RAM ed è praticamente al servizio degli stessi file tutto il giorno, ma lo sta facendo dal disco rigido mentre 3 GB di RAM sono "gratuiti".

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 usare per migliorare le capacità di lettura dei file usando la RAM?

Più specificamente, non sto cercando un "hack" qui. Voglio che le chiamate al file system servano i file da RAM senza la necessità di creare un ram-drive e copiare i file lì manualmente. O almeno uno script 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 istruttivo: The Linux Page Cache e pdflush
  • 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.
76
Andrioid

vmtouch sembra un buon strumento per il lavoro.

Punti salienti:

  • 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'utilizzo 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 annotato nei commenti, ora è disponibile un repository git disponibile.

60
seeker

Questo è anche possibile usando l'utilità vmtouch Virtual Memory Toucher .

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 cache VM cache 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
26
ewwhite

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

23
cagenut

Linux memorizzerà nella cache quanto più disco IO nella memoria che può. Questo è ciò che sono le statistiche di memoria cache e buffer. Probabilmente farà un lavoro migliore di quello che farai per archiviare 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.

18
David Pashley

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)

18
Andrioid

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 di 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 swappiness high (come 100), il kernel sposta tutto ciò che non ha bisogno di scambiare, liberando RAM per i file di cache. E impostando vfs_cache_pressure inferiore (diciamo 50, non 0!), favorirà la memorizzazione nella cache dei file invece di conservare i dati dell'applicazione nella RAM.

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

7
Petr Pudlák

Dubito fortemente che stia effettivamente servendo file dal disco con 3 GB RAM gratis. 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 che le ultime informazioni sul registro siano disponibili in caso di arresto anomalo. Nei sistemi che devono essere veloci a prescindere, utilizzare il registro buffer IO o utilizzare un server di registro remoto.

3
Zan Lynx

Potresti essere in grado di avere un programma che solo mmaps i tuoi file rimarranno in esecuzione.

3
Brad Gilbert

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

http://www.coker.com.au/memlockd/ fa questo

anche se non ne hai davvero bisogno, Linux farà un ottimo lavoro di memorizzazione nella cache dei file che stai usando da solo.

0
Justin

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
Daniel Lawson

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.

0
Federico

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

0
sybreon

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 tutti gli articoli sulla sua applicazione ... Questo link parla delle effettive chiamate di sistema utilizzate in un'applicazione.

0
Kyle Brandt

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
Bogus Name

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 è chiamato readahead http://packages.ubuntu.com/dapper/admin/readahead

Esiste anche il 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
osgx

io uso find/-name stringofrandomcharacter che aiuta molto

0
user50472