Hallo,
ich bin am WE auf der Suche nach der optimalen Blocksize um via dd ein Raspbian-Image auf SDCard zu bekommen über folgenden Beitrag gestolpert:
http://blogofterje.wordpress.com/2012/01/14/optimizing-fs-on-sd-card/
Nachdem ich heute den Thread hier gelesen habe, musste ich das mal ausprobieren - zum Testen habe ich eine betagtere 2GB µSD-Karte, vorher einmal komplett mit zufälligen Daten beschrieben, verwendet ...
... für "systematisch" müsste man mal jede Mountoption in Zusammenhang mit den Optionen von mkfs.ext4 durchprobieren - ich habe jetzt aus Zeitgründen Tests ausgelassen bzw. aufgrund der Dauer abgebrochen ...
...das Ergebnis ist aber dann doch imo recht interessant ...
... die Option sync von mount hat hier wohl direkt negative Auswirkungen ...
für meine Karte:
mkfs.ext4 -O ^has_journal -E stride=2,stripe-width=512 -b 4096 /dev/mmcblk0p1
Ergebnis mount ohne Optionen für eine große Datei:
time ( mount /dev/mmcblk0p1 /media/flash && cd flash && sync; rm testing; sync; ( dd if=/dev/zero of=testing bs=16k count=10000; sync); cd .. && umount flash )
10000+0 Datensätze ein 10000+0 Datensätze aus 163840000 Bytes (164 MB) kopiert, 0,271188 s, 604 MB/s
real 0m21.280s user 0m0.016s sys 0m0.376s
Ergebnis mount -o sync,noatime
time ( mount -o sync,noatime /dev/mmcblk0p1 /media/flash && cd flash && sync; rm testing; sync; ( dd if=/dev/zero of=testing bs=16k count=10000; sync); cd .. && umount flash )
10000+0 Datensätze ein 10000+0 Datensätze aus 163840000 Bytes (164 MB) kopiert, 93,7794 s, 1,7 MB/s
real 1m34.320s user 0m0.016s sys 0m3.520s
... etwas mehr dazu (auch zu vielen kleinen Dateien) in dieser PDF, Seite 1-4 (5-7 sind meine 16GB SDCard - damit bin ich noch nicht durch, aber der Effekt scheint da nicht besonders groß zu sein) ...
http://www.file-upload.net/download-6781170/sdcard-bench.pdf.html
Alex
Am 05.11.2012 12:42, schrieb Heiko Schlittermann:
Hallo,
vielen Dank für die vielen Antworten. Ich habe jetzt mal systematisch gearbeitet.
Erstmal habe ich die Blocksize für das Schreiben auf den Stick ermittelt. Dafür habe ich „dd oflag=direct bs=<blocksize>“ verwendet und immer 512MB geschrieben. Ich hoffe, daß ich mit diesem „direct“. (Was mir gerade auffällt: ich habe das nicht mit Root-Rechten gemacht. Darf „luser“ auch Direct I/O machen?)
http://www.schlittermann.de/misc/stick-blocksize.png
64k *scheint* eine gute Blockgröße zu sein.
[dd oflag=direct if=/dev/zero of=/dev/sdb bs=64k count=8192] => 3.8 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=256k count=2048] => 3.7 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=32k count=16384] => 3.5 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=128k count=4096] => 3.5 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=16k count=32768] => 2.8 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=8k count=65536] => 2.1 MB/s [dd oflag=direct if=/dev/zero of=/dev/sdb bs=4k count=131072] => 1.3 MB/s
Für die folgenden Versuche hatte ich trotzdem mit 128k gearbeitet, weil ... ich hatte mich verguckt.
Nun die Geschwindigkeiten im Einzelnen, einmal über der Zeit, und einmal über die Menge der geschriebenen Daten.
http://www.schlittermann.de/misc/speed-size.png http://www.schlittermann.de/misc/speed-time.png
Gearbeitet wurde immer mit „dd bs=128k“, manchmal direkt auf den Stick, manchmal in ein Filesystem, welches auf dem Stick war. Wenn es in ein Filesystem ging, dann war es ohne irgendwelche Besonderheiten gemountet.
Die 128k Blockgröße hatte ich vorher als die ermittelt, bei der ein „dd“ auf den Stick am schnellsten war.
Ca. 3MB/s scheint dann immer die „Dauerleistung“ zu sein beim 8GB Stick. Hätte ich mir besser vorgestellt.
Bei einem baugleichen Stick mit 16 GB (statt 8GB) erreiche ich grob das doppelte. Das deutet auf interne Parallelisierung. Aber da kenne ich mich nicht wirklich aus.
Warum das rsync so langsam wird, muß ich noch ermitteln.
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd