Ho 1000000 file da 4-20 kb in una directory. Devo copiare quella cartella. Ma sembra che devo fare una ricerca per ogni file, quindi ci vuole un po 'di tempo.
C'è un modo in cui posso accelerarlo?
Attualmente sto pensando che se potessi ottenere i blocchi del disco che occupano questi file, potrei ordinarli, unire i blocchi che erano vicini (dato che la lettura sequenziale è spesso più veloce della ricerca) e leggere questi blocchi, in modo che fossero nella RAM cache (ho 32 GB di RAM) prima di fare la copia.
Ma affinché funzioni, ho bisogno di un modo per identificare su quali blocchi si trovano i file.
Sto usando EXT4 su un dispositivo magnetico (cioè non SSD).
Modificare:
Questo dovrebbe funzionare ma non:
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
Durante il test su un file di grandi dimensioni, non memorizza nella cache il file.
Edit2:
Ecco alcuni parametri di riferimento. La cache è stata svuotata ( echo 3 >/proc/sys/vm/drop_caches
) tra ogni esecuzione. Misure effettuate con iostats -dkx 5
.
rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s
Quindi cosa possiamo imparare da quello?
Sembra che l'ordinamento per inode sia una buona idea. Ma sembra che la parallelizzazione multipla cp
aumenti ulteriormente le prestazioni. Vale la pena sottolineare che la sorgente foo/
è un disco magnetico, quindi questo attacca il mito secondo cui parallelizzare l'I / O su un singolo mandrino non accelera l'I / O: parallelizzare in modo chiaro e coerente accelera la copia qui.
cp -r /mnt/dir1 /mnt/dirdest
o qualcosa di simile cp /mnt/dir1/* /mnt/dirdest
?