Tengo 1000000 archivos de 4-20 kb en un directorio. Necesito copiar ese directorio. Pero parece que tengo que buscar cada archivo, así que esto lleva bastante tiempo.
¿Hay alguna manera de acelerar esto?
Actualmente estoy pensando que si pudiera obtener los bloques de disco que ocupan estos archivos, podría ordenarlos, fusionar los bloques que estaban cerca (dado que la lectura secuencial a menudo es más rápida que la búsqueda) y leer estos bloques, de modo que estuvieran en la RAM caché (tengo 32 GB de RAM) antes de hacer la copia.
Pero para que eso funcione, necesito una forma de identificar en qué bloques están los archivos.
Estoy usando EXT4 en un dispositivo magnético (es decir, no SSD).
Editar:
Esto debería funcionar pero no:
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'
Al probarlo en un archivo grande, no almacena en caché el archivo.
Edit2:
Aquí hay algunos puntos de referencia. La memoria caché se enjuagó ( echo 3 >/proc/sys/vm/drop_caches
) entre cada ejecución. Mediciones realizadas 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
Entonces, ¿qué podemos aprender de eso?
Parece que ordenar por inodo es una buena idea. Pero parece que el paralelismo múltiple cp
aumenta aún más el rendimiento. Vale la pena enfatizar que la fuente foo/
es un disco magnético, por lo que esto ataca el mito de que la paralelización de E / S a un solo eje no acelerará la E / S: la paralelización acelera clara y consistentemente la copia aquí.
cp -r /mnt/dir1 /mnt/dirdest
o algo así cp /mnt/dir1/* /mnt/dirdest
?