Ich habe 1000000 4-20 kb Dateien in einem Verzeichnis. Ich muss dieses Verzeichnis kopieren. Aber es scheint, dass ich nach jeder Datei suchen muss, so dass dies eine ganze Weile dauert.
Gibt es eine Möglichkeit, dies zu beschleunigen?
Ich denke derzeit, wenn ich die Plattenblöcke, die diese Dateien belegen, erhalten könnte, könnte ich diese sortieren, die geschlossenen Blöcke zusammenführen (da sequentielles Lesen oft schneller ist als Suchen) und diese Blöcke lesen, so dass sie sich im RAM befinden Cache (ich habe 32 GB RAM) vor dem Kopieren.
Damit dies funktioniert, muss ich herausfinden, auf welchen Blöcken sich die Dateien befinden.
Ich verwende EXT4 auf einem magnetischen Gerät (dh nicht SSD).
Bearbeiten:
Das sollte funktionieren, aber es funktioniert nicht:
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'
Beim Testen einer großen Datei wird die Datei nicht zwischengespeichert.
Edit2:
Hier sind einige Benchmarks. Der Cache wurde echo 3 >/proc/sys/vm/drop_caches
zwischen jedem Lauf geleert ( ). Messungen durchgeführt mit 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
Was können wir daraus lernen?
Es scheint eine gute Idee zu sein, nach Inode zu sortieren. Die Parallelisierung mehrerer cp
Leistungssteigerungen scheint jedoch noch weiter zu gehen. Es ist hervorzuheben, dass es sich bei der Quelle foo/
um eine Magnetplatte handelt. Dies greift den Mythos an, dass das Parallelisieren von E / A zu einer einzelnen Spindel die E / A nicht beschleunigt: Das Parallelisieren beschleunigt und konsistent das Kopieren hier.
cp -r /mnt/dir1 /mnt/dirdest
oder so etwas cp /mnt/dir1/* /mnt/dirdest
?