Wie berechnet man die optimale Blockgröße beim Ausführen von a dd
? Ich habe ein bisschen recherchiert und nichts gefunden, was darauf hindeutet, wie dies erreicht werden könnte.
Ich habe den Eindruck, dass eine größere Blockgröße zu einer schnelleren führen würde dd
... ist das wahr?
Ich bin im Begriff, dd
zwei identische 500-GB-Hitachi-Festplatten zu verwenden, die mit 7200 U / min auf einer Box mit einem Intel Core i3 mit 4 GB DDR3-RAM mit 1333 MHz laufen, also versuche ich herauszufinden, welche Blockgröße verwendet werden soll. (Ich werde Ubuntu 10.10 x86 von einem Flash-Laufwerk booten und von dort aus ausführen.)
dd
, um die optimale Blockgröße beim Übertragen der Datei zu findenAntworten:
Die optimale Blockgröße hängt von verschiedenen Faktoren ab, einschließlich des Betriebssystems (und seiner Version) sowie der verschiedenen beteiligten Hardware-Busse und -Datenträger. Mehrere Unix-ähnliche Systeme (einschließlich Linux und zumindest einiger BSD-Varianten) definieren das
st_blksize
Mitglied in demstruct stat
, das angibt, was der Kernel für die optimale Blockgröße hält:Der beste Weg kann sein, zu experimentieren: Kopieren Sie ein Gigabyte mit verschiedenen Blockgrößen und Zeit, die. (Denken Sie daran, die Kernel-Puffer-Caches vor jedem Lauf zu löschen :)
echo 3 > /proc/sys/vm/drop_caches
.Als Faustregel habe ich jedoch festgestellt, dass eine ausreichend große Blockgröße
dd
gute Arbeit leisten kann und die Unterschiede zwischen beispielsweise 64 KiB und 1 MiB im Vergleich zu 4 KiB gegenüber 64 KiB gering sind. (Allerdings ist es zugegebenermaßen eine Weile her, seit ich das getan habe. Ich verwende jetzt standardmäßig einen Mebibyte oder lasse einfachdd
die Größe auswählen.)quelle
Wie andere gesagt haben, gibt es keine allgemein korrekte Blockgröße; Was für eine Situation oder eine Hardware optimal ist, kann für eine andere schrecklich ineffizient sein. Abhängig vom Zustand der Festplatten kann es auch vorzuziehen sein, eine andere Blockgröße als die "optimale" zu verwenden.
Eine Sache, die auf moderner Hardware ziemlich zuverlässig ist, ist, dass die Standardblockgröße von 512 Bytes fast eine Größenordnung langsamer ist als eine optimalere Alternative. Im Zweifelsfall habe ich festgestellt, dass 64K ein ziemlich solider moderner Standard ist. Obwohl 64K normalerweise nicht DIE optimale Blockgröße ist, ist es meiner Erfahrung nach viel effizienter als die Standardblockgröße. 64K hat auch eine ziemlich solide Geschichte der Zuverlässigkeit: Sie finden eine Nachricht aus der Eug-Lug-Mailingliste, circa 2002, in der eine Blockgröße von 64K empfohlen wird: http://www.mail-archive.com/eug- [email protected]/msg12073.html
Um die optimale Ausgabeblockgröße zu bestimmen, habe ich das folgende Skript geschrieben, das das Schreiben einer 128-MB-Testdatei mit dd in einem Bereich unterschiedlicher Blockgrößen testet, von standardmäßig 512 Byte bis maximal 64 MB. Seien Sie gewarnt, dieses Skript verwendet dd intern, verwenden Sie es daher mit Vorsicht.
dd_obs_test.sh:
Ansicht auf GitHub
Ich habe dieses Skript nur auf einem Debian-System (Ubuntu) und unter OSX Yosemite getestet, daher sind wahrscheinlich einige Anpassungen erforderlich, um mit anderen Unix-Varianten arbeiten zu können.
Standardmäßig erstellt der Befehl eine Testdatei mit dem Namen dd_obs_testfile im aktuellen Verzeichnis. Alternativ können Sie einen Pfad zu einer benutzerdefinierten Testdatei angeben, indem Sie einen Pfad nach dem Skriptnamen angeben:
Die Ausgabe des Skripts ist eine Liste der getesteten Blockgrößen und ihrer jeweiligen Übertragungsraten wie folgt:
(Hinweis: Die Einheit der Übertragungsraten variiert je nach Betriebssystem.)
Um die optimale Größe des Leseblocks zu testen, können Sie mehr oder weniger denselben Prozess verwenden. Statt jedoch aus / dev / zero zu lesen und auf die Festplatte zu schreiben, lesen Sie von der Festplatte und schreiben in / dev / null. Ein Skript dafür könnte folgendermaßen aussehen:
dd_ibs_test.sh:
Ansicht auf GitHub
Ein wichtiger Unterschied in diesem Fall ist, dass die Testdatei eine Datei ist, die vom Skript geschrieben wird. Richten Sie diesen Befehl nicht auf eine vorhandene Datei, da sonst die vorhandene Datei mit Nullen überschrieben wird!
Für meine spezielle Hardware stellte ich fest, dass 128 KB die optimalste Eingangsblockgröße auf einer Festplatte und 32 KB die optimalste auf einer SSD waren.
Obwohl diese Antwort die meisten meiner Ergebnisse abdeckt, bin ich so oft auf diese Situation gestoßen, dass ich einen Blog-Beitrag darüber geschrieben habe: http://blog.tdg5.com/tuning-dd-block-size/ Weitere Einzelheiten finden Sie hier auf die Tests, die ich dort durchgeführt habe.
quelle
dd_obs_test.sh
conv=fsync
funktioniert nicht unter macOS und kann entfernt werden.Ich habe festgestellt, dass meine optimale Blockgröße 8 MB beträgt (entspricht dem Festplatten-Cache?). Ich musste den leeren Speicherplatz auf einer Festplatte löschen (einige sagen: waschen), bevor ich ein komprimiertes Image davon erstellen konnte. Ich benutzte:
Ich habe mit Werten von 4K bis 100M experimentiert.
Nachdem ich dd eine Weile laufen ließ, tötete ich es (Ctlr + C) und las die Ausgabe:
Da dd die Eingabe- / Ausgaberate anzeigt (in diesem Fall 19,1 MB / s), ist es leicht zu erkennen, ob der von Ihnen ausgewählte Wert besser oder schlechter als der vorherige ist.
Meine Ergebnisse:
Hinweis: Um zu überprüfen, wie groß Ihr Festplatten-Cache / Puffer ist, können Sie verwenden
sudo hdparm -i /dev/sda
quelle
8M
es schwer zu schlagen ist.Dies ist völlig systemabhängig. Sie sollten experimentieren, um die optimale Lösung zu finden. Versuchen Sie es mit
bs=8388608
. (Da Hitachi-Festplatten 8 MB Cache zu haben scheinen.)quelle
bs=8M
auf GNU / Linux oderbs=8m
auf BSDbs=8388608
jeden Schritt einmal zu beginnen und zu dekrementieren"Quelle
quelle