Gelegentlich habe ich Kommentare online gesehen, die lauten: "Stellen Sie sicher, dass Sie 'bs =' setzen, da der Standardwert zu lange dauert." Zeit letzte Woche "scheinen das zu belegen. Wenn ich 'dd' verwende (normalerweise im Bereich von 1-2 GB), muss der Parameter bytes angegeben werden. Ungefähr die Hälfte der Zeit verwende ich den Wert, der in dem Online-Handbuch angegeben ist, aus dem ich kopiere. den Rest der Zeit wähle ich eine Nummer aus der 'fdisk -l'-Liste, von der ich annehme, dass sie langsamer ist (z. B. die SD-Karte, auf die ich schreibe).
Gibt es für eine bestimmte Situation (Medientyp, Busgröße oder was auch immer wichtig ist) eine Möglichkeit, einen "besten" Wert zu ermitteln? Ist es leicht zu bestimmen? Wenn nicht, gibt es einen einfachen Weg, um 90-95% des Weges dorthin zu bekommen? Oder ist "nur etwas größer als 512 auswählen" sogar die richtige Antwort?
Ich habe darüber nachgedacht, das Experiment selbst auszuprobieren, bin mir aber nicht sicher, welche Faktoren die Antwort beeinflussen, und weiß daher nicht, wie ich ein gutes Experiment entwerfen soll.
quelle
Antworten:
dd
stammt aus der Zeit, als es für die Übersetzung alter IBM-Mainframe-Bänder erforderlich war, und die Blockgröße musste mit der übereinstimmen, die zum Schreiben des Bandes verwendet wurde, oder Datenblöcke wurden übersprungen oder abgeschnitten. (9-Spur-Bänder waren heikel. Seien Sie froh, dass sie lange tot sind.) Heutzutage sollte die Blockgröße ein Vielfaches der Größe des Gerätesektors sein (normalerweise 4 KB), aber auf neueren Festplatten können sie viel größer sein und einen sehr kleinen Daumen haben Laufwerke mögen kleiner sein, aber 4 KB sind ein vernünftiger Mittelweg, und je größer, desto besser für die Leistung. Ich verwende oft 1MB Blockgrößen mit Festplatten. (Wir haben heutzutage auch viel mehr Gedächtnis.)quelle
@Gilles
ob ich über Ihre Kommentarantwort benachrichtigt werden soll. Weitere Informationen finden Sie unter Wie funktioniert die Funktion von comment @replies ?. . Da ich zufällig vorbeikam: Der Kernel wird sich sowieso darum kümmern. Ihre Behauptung, dass "diese zusätzliche Arbeit die Kopierzeit erheblich verkürzen kann", stimmt nicht mit meinen Benchmarks überein, aber verschiedene Systeme können sich unterschiedlich verhalten, also tragen Sie bitte auch das Timing bei!Es gibt nur einen Weg, die optimale Blockgröße zu bestimmen, und das ist ein Maßstab. Ich habe gerade einen kurzen Benchmark gemacht. Die Testmaschine ist ein PC, auf dem Debian GNU / Linux mit Kernel 2.6.32 und Coreutils 8.5 ausgeführt wird. Beide beteiligten Dateisysteme sind ext3 auf LVM-Volumes auf einer Festplattenpartition. Die Quelldatei hat eine Größe von 2 GB (2040000 KB, um genau zu sein). Caching und Pufferung sind aktiviert. Vor jedem Lauf habe ich den Cache mit geleert
sync; echo 1 >|/proc/sys/vm/drop_caches
. Die Laufzeiten enthalten kein Finalesync
zum Leeren der Puffer. Das Finalesync
dauert in der Größenordnung von 1 Sekunde. Diesame
Läufe waren Kopien auf demselben Dateisystem; Diediff
Läufe waren Kopien in ein Dateisystem auf einer anderen Festplatte. Aus Gründen der Konsistenz sind die angegebenen Zeiten die mit der. Erhaltenen Wanduhrzeitentime
Nutzen, in Sekunden. Ich habe jeden Befehl nur einmal ausgeführt, daher weiß ich nicht, wie stark das Timing variiert.Fazit: Eine große Blockgröße (mehrere Megabyte) hilft, aber nicht dramatisch (viel weniger, als ich für Kopien mit demselben Laufwerk erwartet hatte). Und
cat
undcp
nicht so schlecht abschneiden. Mit diesen Zahlen finde ich es nichtdd
wert , mich damit zu beschäftigen. Geh mitcat
!quelle
>|
ist dasselbe wie,>
außer dass unterset -o noclobber
die Shell beschwert, dass die Datei existiert, wenn Sie verwenden>
.cat
. Warum suchst du einen besseren Weg? Was ist los mitcat
?cat
kopiert nur seine Eingabe in seine Ausgabe. Wenn Sie von unzuverlässigen Medien kopieren und nicht lesbare Teile überspringen oder mehrmals wiederholen möchten, ist dies ein anderes Problem, für das es sehr gutddrescue
funktioniert.lsof
. Die augenblickliche Geschwindigkeit ist bei einer Festplattenkopie nicht sehr relevant, da sie einheitlich ist, sodass Sie die übertragenen Bytes durch die verstrichene Zeit teilen können. Wenn Sie etwas besseres wollen, können Sie verwendenpv
.Ich stimme dem Geekosaurier zu, dass die Größe ein Vielfaches der Blockgröße sein sollte, die oft 4 KB beträgt.
Wenn Sie die Blockgröße finden möchten,
stat -c "%o" filename
ist dies wahrscheinlich die einfachste Option.Aber sagen Sie
dd bs=4K
, das heißt, es tutread(4096); write(4096); read(4096); write(4096)
...Jeder Systemaufruf ist mit einem Kontextwechsel verbunden, der mit einem gewissen Aufwand verbunden ist. Je nach E / A-Planer können Lesevorgänge mit dazwischenliegenden Schreibvorgängen dazu führen, dass die Festplatte viele Suchvorgänge ausführt. (Wahrscheinlich kein großes Problem mit dem Linux-Scheduler, aber dennoch ein Grund zum Nachdenken.)
Wenn Sie dies tun
bs=8K
, lassen Sie die Festplatte zwei Blöcke gleichzeitig lesen, die sich wahrscheinlich nahe beieinander auf der Festplatte befinden, bevor Sie den Schreibvorgang an einer anderen Stelle ausführen (oder die E / A für einen anderen Prozess warten).Nach dieser Logik
bs=16K
ist noch besser, etc.Ich würde also gerne wissen, ob es eine Obergrenze gibt, an der die Leistung schlechter wird, oder ob sie nur durch das Gedächtnis begrenzt ist.
quelle
Wie Gilles sagt, können Sie den optimalen Parameter für die Option bs to dd durch Benchmarking bestimmen. Dies wirft jedoch die Frage auf: Wie können Sie diesen Parameter bequem bewerten?
Meine vorläufige Antwort auf diese Frage lautet: benutze dd-opt , das Dienstprogramm, an dem ich kürzlich gearbeitet habe, um genau dieses Problem zu lösen :)
quelle
dd-opt
. Es handelt sich jedoch um freie Software, die unter der AGPLv3 lizenziert ist . Fühlen Sie sich also frei, es zu verbessern und seine Empfindlichkeit / Genauigkeit zu bewerten!Ich optimiert für SD-Kartenleser USB2.0, die am besten zu laufen scheint
bs=10M
. Ich habe versucht 4k, auf bis zu 16M, nach 8-10M keine Besserung. Sie können sehen, wie sich die Übertragungsrate verschlechtert. Dies liegt wahrscheinlich daran, dass die Puffer auf dem Gerät geladen werden und darauf gewartet wird, dass das Gerät auf das eigentliche Medium übertragen wird.quelle