Warum wird SLOW auf dem Raw-Gerät und FAST auf dem Dateisystem (USB-Stick) geschrieben?

7

Ich habe einen USB-Stick ( PQI U822V-Speedy 32G ), den ich unter Linux schnell und einfach testen möchte. Ich teste Schreibbandbreite.

dd auf roher Partition

Ich habe eine Partition ab Sektor 2048 erstellt und dann sequenziell 4 GB geschrieben:

dd if=/dev/zero of=/dev/sdb1 bs=1M count=4096

Ich bekomme ~ 22 MB / s.

Ich habe auch versucht, mehrere (4) ddparallel zu laufen, wie oben, aber mit count=1024und der seek=Option, in verschiedene Bereiche des Laufwerks zu schreiben. Gleiche Ergebnisse.

dd auf Dateisystem

Wenn ich die sdb1Partition jedoch mit entweder ext4oder formatiere NTFSund große Dateien (entweder real oder /dev/zero) darauf kopiere , wie folgt:

time dd if=/dev/zero of=/media/USBKEY/file.bin bs=1M count=4096 ; time sync

Ich erreiche> 66 MB / s, wie vom Hersteller angegeben. Natürlich habe ich die syncDauer kurz nach der Kopie berücksichtigt .

Warum gibt es so einen großen Leistungsunterschied?

Totor
quelle
1
Ihr Dateisystem speichert das wahrscheinlich zwischen - womit unterscheidet sich das o/iflag=nocache? Es gibt auch directund syncOptionen, die relevant sind - ich benutze immer syncmindestens mit USB, nur damit ich sicher sein kann, dass ich den Thumbdrive nicht zu früh ziehe. Und wenn Sie syncdann sehen, vielleicht, ob Sie die gleiche Geschwindigkeit roh mitnonblock
mikeserv
Das Dateisystem schreibt die Datei an einer anderen Stelle als am Anfang der Partition. Vielleicht stimmt etwas mit dem Gebiet in der Nähe des Starts nicht? Versuchen Sie es mit einem einzelnen, ddaber höheren Suchargument, um auf verschiedene Teile der Festplatte zu schreiben.
Psusi
Interessant. Könnten Sie das Experiment mit verschiedenen Blockgrößen (verschiedene Zweierpotenzen, z. B. 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K), aber identischen Gesamtdaten wiederholen? Ich bin sehr gespannt, ob das einen Unterschied machen wird.
Marcelm
Ich habe festgestellt, dass Linux selbst mit einem FAT32-Dateisystem nur langsam auf USB-Sticks schreibt. Ich habe festgestellt, dass die Verwendung rsync --bwlimitbeim Kopieren von Dateien tatsächlich helfen kann . Es scheint so etwas wie ein Stau zu sein: Wenn Linux versucht, zu viele Daten in den Hals des USB-Geräts zu rammen, wird es tatsächlich langsamer und bleibt langsam, bis ich die Kopie anhalte, während der Puffer geleert wird. (Dies ist mit billigen USB-Sticks).
Peter Cordes

Antworten:

1

Jetzt, wo ich noch einmal hinschaue, wurde mir klar, dass Sie sagten, dies sei ein USB-Stick (Flash-Laufwerk), keine Festplatte. Der Flash-Speicher kann nur in großen Blöcken gelöscht werden, und einzelne Sektoren können nicht geschrieben werden, ohne sie zuerst (und den gesamten Block, in dem sie sich befinden) zu löschen. Da die Software erwartet, jederzeit auf der Festplatte schreiben zu können, wo immer sie will, verfügt die Festplatte über eine Übersetzungslogik, um das Löschen transparent zu handhaben. Wie dies gemacht wird, hat einen dramatischen Einfluss auf die Schreibleistung. Viele Geräte verwenden einen Algorithmus für den größten Teil der Festplatte, der sequentielle Schreibvorgänge sehr gut verarbeitet, aber zufällige Schreibvorgänge verhindert. Der Bereich nahe dem Start der Festplatte wird normalerweise von der FAT in dem FAT-Dateisystem verwendet, mit dem sie vorformatiert sind, und dieser Bereich wird zufällig zufällig beschrieben, sodass sie in diesem Bereich einen anderen Algorithmus verwenden, der beim sequentiellen Schreiben langsamer ist.

Daher bin ich mir jetzt ziemlich sicher, dass meine anfängliche Vermutung, die ich als Kommentar hinzugefügt habe, richtig war. Was Sie sehen, wenn Sie in das Dateisystem schreiben, ist die Leistung des Restes der Festplatte, und wenn Sie bei Offset Null dd, schreiben Sie in den Fettbereich. Wenn Sie das dd-Ziel einige hundert MB in suchen, sollte es erheblich schneller werden.

psusi
quelle
1
Es ist eine kühne Behauptung, trotz fehlender Aktualisierung durch den Fragesteller und ohne zitierte Dokumentation und ohne Beweise für einen Ihrer eigenen Tests ein gewisses Maß an Sicherheit zu beanspruchen. Zu mutig, denke ich.
Mikesserv
Vielen Dank. Das könnte dir gefallen : bunniestudios.com/blog/?p=3554 Sie haben hier eine Stunde lang geredet: youtube.com/watch?feature=player_embedded&v=r3GDPwIuRKI Ich kann meine Stimme nicht rückgängig machen. Es ist zu lange her. Und das sollten Sie in Ihre Antwort aufnehmen - aber ich schulde Ihnen eine. Nein, ich nicht. Wir sind quitt.
Mikeserv
@psusi: Es wird also besser als ddbeim Raw-Block-Gerät und im durchgeführten Benchmark war die Verwendung eines Dateisystems der Wegbereiter dafür, nicht wahr?
Bananguin
1
@Bananguin, Ihr Argument ist gleichbedeutend mit einem Autounfall auf dem Weg zur Arbeit und der Behauptung, dass Arbeiten Autounfälle verursacht. Es mag sein, dass Sie, wenn Sie zu diesem Zeitpunkt nicht ins Auto gestiegen wären, um zur Arbeit zu gehen, nicht in diesen bestimmten Unfall verwickelt gewesen wären, aber Sie können nicht den Schluss ziehen, dass Arbeiten Autounfälle verursacht. Es ist einfach so, dass du dorthin gegangen bist, als du in einen gekommen bist. Hier kommt es einfach so vor, dass das Dateisystem die Daten in einen Teil der Festplatte legt, der schneller ist als der Ort, an den das OP gesendet hat. Das bedeutet nicht, dass das Dateisystem auf magische Weise schneller ist als dd im Allgemeinen.
Psusi
0

Ihre Messergebnisse können mit der Kernelarchitektur erklärt werden. Durch die Verwendung des Dateisystemzugriffs wird das volle Potenzial des Kernels mit allen Puffern und Optimierungen freigesetzt, die er ausführen kann. Insbesondere die Puffer beschleunigen Ihren Benchmark (b / c der Kernel ist 100% a_A_syncronous). dd auf einer Gerätedatei verwendet nichts davon.

Bananguin
quelle
3
Schreiben direkt an ein Blockgerät macht den Cache verwenden.
Psusi
@psusi - vielleicht. Aber wenn es kein Zieldateisystem gibt und ddsequentielle Blöcke gleicher Größe ausgeschrieben werden, welches Dateisystem speichert dann den Schreibvorgang zwischen?
Mikeserv
1
@mikeserv, die Blockgeräteschnittstelle speichert den direkten Zugriff auf Blockgeräte zwischen.
Psusi
@psusi also der physische Geräte-Cache dann oder gibt es auch eine In-Kernel-Caching-Schicht?
Mikesserv
2
@mikeserv Die Blockgeräteschnittstelle ist Teil des Kernels.
Chris Down
0

Versuchen Sie hdparmstattdessen, die Leistung eines Laufwerks mit und ohne Caching zu bewerten:

$ sudo hdparm -tT /dev/sda1

/dev/sda1:
 Timing cached reads:   6314 MB in  2.00 seconds = 3157.61 MB/sec
 Timing buffered disk reads: 244 MB in  3.04 seconds =  80.26 MB/sec
slm
quelle
Ich bin Benchmarking schreibt , siehe Fragentitel.
Totor
1
Wenn ich mich richtig erinnere, kann hdparm auch (destruktive) Schreibvorgänge ausführen.
Thorbjørn Ravn Andersen
-2

Dies geschieht aufgrund der Optimierung des Schreibens von Sparse-Dateien im Dateisystem.

Wenn Sie ein dd if=/dev/zeroRaw-Gerät verwenden, werden die Nullblöcke tatsächlich auf die Festplatte geschrieben.

Wenn Sie sie jedoch in eine Datei schreiben, ignoriert das Dateisystem das Schreiben der Daten und speichert nur die Metadaten. Dies führt dazu, dass nur sehr wenige Blöcke auf die Festplatte geschrieben werden. Die Datei kann als großes Loch angesehen werden, das nichts enthält.

Verwenden Sie / dev / urandom als Eingabedatei ( dd if=/dev/urandom), um die Leistung auf diese Weise zu testen . Dadurch wird das Dateisystem gezwungen, zufällige Daten auf die Festplatte zu schreiben.

PioneerAxon
quelle
2
Aus drei Gründen falsch. 1 / Ich sagte, ich habe mit echten Dateien getestet: "entweder real oder /dev/zero"; 2 / ist auf vielen Maschinen /dev/urandomviel langsamer als Speichergeräte; 3 / am häufigsten müssen Dateisystemoptimierungen wie spärliche Dateien explizit angefordert werden, siehe cp --sparseund andere ...
Totor