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.
quelle
cp -r /mnt/dir1 /mnt/dirdest
oder so etwascp /mnt/dir1/* /mnt/dirdest
?Antworten:
Vorausgesetzt, dass
readdir
werden nicht nach Inode-Nummer sortiertSie können versuchen, das Kopieren zu beschleunigen, indem Sie Dateien in Inode-Reihenfolge kopieren.
Das bedeutet, so etwas zu verwenden:
quelle
ls -U
ist nicht genug, weil es nicht nach Inode-Nummern sortiert ... und warum sollte ich wollen-1
?-1
listet nur 'eine Datei pro Zeile' auf - es hilft nicht bei Zeilenumbrüchen in Dateinamen. Dafür können Sie verwendenfind -print0/xargs -O
.mkdir tmp; cd tmp; touch foo"<RETURN>"bar; ls
Gibt 'foo? Bar' aus. Als -1
druckt auch 'foo? Bar'. Als -1 | wc -l
druckt '2'. Afind -ls
druckt den Dateinamen als './foo\nbar'. Eincp -i
ls -1` x` schlägt mit 'cp fehl: Ziel' x 'ist kein Verzeichnis'.-q
macht was ich dachte-1
würde! Nochmals meine Entschuldigung - ganz zu schweigen von Dank.GNU
tar
- in derpax
Tradition - behandelt Hardlinks selbstständig.Auf diese Weise haben Sie nur die beiden
tar
Prozesse und müssen nicht immer wieder aufrufencp
.quelle
Ähnlich wie bei der Antwort von @ maxschlepzig können Sie die Ausgabe von analysieren
filefrag
, um Dateien in der Reihenfolge zu sortieren, in der ihre ersten Fragmente auf der Festplatte angezeigt werden:MMV mit dem obigen
sed
Skript, also stellen Sie sicher, dass Sie es gründlich testen.Andernfalls ist
filefrag
(ein Teil vone2fsprogs
) , was auch immer Sie tun, viel schneller zu verwenden, alshdparm
es mehrere Dateiargumente annehmen kann. Allein der Overhead,hdparm
1.000.000 Mal ausgeführt zu werden, wird viel Overhead verursachen.Außerdem wäre es wahrscheinlich nicht so schwierig, für jede Datei ein
perl
Skript (oder C-Programm) zu schreibenFIEMAP
ioctl
, ein sortiertes Array der zu kopierenden Blöcke und der dazugehörigen Dateien zu erstellen und dann alles in der richtigen Reihenfolge zu kopieren Lesen Sie die Größe jedes Blocks aus der entsprechenden Datei (achten Sie jedoch darauf, dass Ihnen nicht die Dateideskriptoren ausgehen).quelle
tar
für ihre Dateien zeigt.qtar
als Open Source veröffentlicht werden könnten . es ist jetzt bei github.com/chlunde/qtar