Posso copiare file di grandi dimensioni più velocemente senza utilizzare la cache dei file?


19

Dopo aver aggiunto il preloadpacchetto, le mie applicazioni sembrano accelerare ma se copio un file di grandi dimensioni, la cache del file aumenta di oltre il doppio della dimensione del file.

Trasferendo una singola immagine o file video virtualbox da 3-4 GB su un'unità esterna, questa enorme cache sembra rimuovere tutte le applicazioni precaricate dalla memoria, portando ad un aumento dei tempi di caricamento e al calo generale delle prestazioni.

Esiste un modo per copiare file di grandi dimensioni da più gigabyte senza memorizzarli nella cache (ovvero ignorare la cache dei file)? O un modo per inserire nella whitelist o nella blacklist cartelle specifiche dalla cache?

Risposte:


19

C'è l' nocacheutilità, che può anteporre a un comando come ionicee nice. Funziona precaricando una libreria che si aggiunge posix_fadvisecon il POSIX_FADV_DONTNEEDflag a tutte le chiamate aperte.

In termini semplici, avvisa il kernel che la memorizzazione nella cache non è necessaria per quel particolare file; il kernel quindi normalmente non memorizzerà nella cache il file. Vedi qui per i dettagli tecnici.

Fa miracoli per qualsiasi enorme lavoro di copia, ad esempio se si desidera eseguire il backup di un disco multi terabyte in background con il minor impatto possibile sul sistema in esecuzione, è possibile fare qualcosa insieme nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Un pacchetto sarà disponibile in Ubuntu 13.10 e versioni successive. Se si utilizza una versione precedente, è possibile installare il pacchetto 13.10 o optare per questo backport 12.04 di François Marier.


Speravo in qualcosa che potesse essere fatto tramite la GUI, oltre a un modo per inserire nella blacklist semplicemente le cartelle "no cache", ma per ora dovrò farlo.
Veazer,

12

Per file di grandi dimensioni, utilizzare ddcon l' I / O diretto per ignorare la cache dei file:

Se vuoi trasferire uno (o pochi) file multi-gigabyte di grandi dimensioni, è facile fare con dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • I directflag indicano dddi usare l'opzione I / O diretta del kernel ( O_DIRECT) durante la lettura e la scrittura, bypassando così completamente la cache dei file.
  • L' bsopzione blockize deve essere impostata su un valore ragionevolmente elevato poiché per ridurre al minimo il numero di operazioni del disco fisico che dddevono essere eseguite, poiché le letture / scritture non sono più memorizzate nella cache e troppe piccole operazioni dirette possono causare un grave rallentamento.
    • Sentiti libero di sperimentare valori da 1 a 32 MB; l'impostazione sopra è 4 MB ( 4M).

Sfortunatamente, per le copie di directory multiple / ricorsive non ci sono strumenti facilmente disponibili; il solito cp, ecc . non supporta l'I / O diretto.

/ e iflags & oflags sono stati cambiati nel iflag & oflag corretto


1
Ricorsivo potrebbe essere fatto con zshl' **operatore. zshdeve essere installato manualmente dai repository.
Ripristina Monica - ζ--

1
In realtà no. ddLa strana sintassi fa impazzire il ** oprtator. Si potrebbe ancora utilizzare uno script di shell che ha ottenuto argomenti normalmente ( dd.sh in.file out.filecon ** nei nomi dei file) e ha dato i nomi dei file per ddutilizzare $1, $2ecc, che non deve essere sporcato dalla sintassi strano di dd.
Ripristina Monica - ζ--

1
La produzione diretta è molto lenta, poiché AFAIK disabilita anche le cache di readahead, che probabilmente non è quello che desideri e non è realistico nemmeno in uno scenario di benchmarking. Utilizzare invece "iflag = nocache oflag = nocache", che dice esattamente al sistema operativo che non è necessario il file in-cache o il file di output in cache.
stolsvik,

1

È possibile copiare una directory in modo ricorsivo ddutilizzando findemkdir

Dobbiamo risolvere due problemi:

  1. dd non sa cosa fare con le directory
  2. dd può copiare solo un file alla volta

Per prima cosa definiamo le directory di input e output:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Ora entriamo cdnella directory dei sorgenti in modo findda riportare le relative directory che possiamo facilmente manipolare:

cd "$SOURCE"

Duplica l'albero delle directory da $SOURCEa$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

I file duplicati dal $SOURCEal $TARGETomettendo cache di scrittura (ma utilizzando cache di lettura!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Si noti che ciò non preserverà i tempi di modifica dei file, la proprietà e altri attributi.

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.