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

17

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

Trasferendo un singolo file video o video da 3-4 GB su un disco esterno, questa enorme cache sembra rimuovere dalla memoria tutte le applicazioni precaricate, con conseguente aumento dei tempi di caricamento e calo generale delle prestazioni.

Esiste un modo per copiare file grandi, multi-gigabyte senza memorizzandoli nella cache (ad esempio ignorando la cache dei file)? O un modo per autorizzare o mettere in blacklist cartelle specifiche dalla cache?

    
posta Veazer 17.04.2012 - 16:37

3 risposte

17

Esiste l'utilità nocache , che può essere anteposta a un comando come ionice e nice . Funziona precaricando una libreria che aggiunge posix_fadvise con il flag POSIX_FADV_DONTNEED a tutte le chiamate aperte.

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

Fa meraviglie per qualsiasi enorme lavoro di copia, e. g. se vuoi eseguire il backup di un disco multi terabyte in background con il minor impatto possibile sul tuo sistema in esecuzione, puoi fare qualcosa lungo nice -n19 ionice -c3 nocache cp -a /vol /vol2 .

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

    
risposta data Gunther Piez 03.07.2012 - 10:55
10

Per singoli file di grandi dimensioni, usa dd con direct I / O per bypassare la cache dei file:

Se vuoi trasferire uno (o alcuni) file da un gigabyte di grandi dimensioni, è facile farlo con dd :

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • I flag direct indicano dd per utilizzare l'opzione I / O diretto del kernel ( O_DIRECT ) durante la lettura e la scrittura, ignorando completamente la cache dei file.
  • L'opzione bs blocksize deve essere impostata su un valore abbastanza grande poiché per ridurre al minimo il numero di operazioni del disco fisico dd deve eseguire, poiché le letture / scritture non vengono più memorizzate nella cache e troppe piccole operazioni dirette possono comportare un grave rallentamento.
    • Sentiti libero di sperimentare valori da 1 a 32 MB; l'impostazione precedente è 4 MB ( 4M ).

Per copie di directory multiple / ricorsive , sfortunatamente, non esistono strumenti facilmente disponibili; il solito cp , ecc non supporto diretto I / O.

/ e iflags & amp; oflags cambiato in iflag & amp; corretto Oflag

    
risposta data ish 26.06.2012 - 02:45
0

Puoi copiare una directory in modo ricorsivo con dd usando find e mkdir

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 inseriamo cd nella directory sorgente in modo che find indichi le directory relative che possiamo facilmente manipolare:

cd "$SOURCE"

Duplica l'albero delle directory da $SOURCE a $TARGET

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

Duplicare file da $SOURCE a $TARGET omettendo la cache di scrittura (ma utilizzando la cache di lettura!)

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

Tieni presente che questo non preserverà i tempi di modifica dei file, la proprietà e altri attributi.

    
risposta data unfa 26.04.2017 - 16:00

Leggi altre domande sui tag