Ich benutze dd, um eine CF-Karte auf Null zu setzen
dd if=/dev/zero of=/dev/sdg
Wenn ich das System mithilfe von gkrellm oder iostat beobachte, sehe ich viele Lesevorgänge vom CF-Kartengerät, gefolgt von vielen Schreibvorgängen.
Mit diesem Beispiel:
# dd if=/dev/zero of=/dev/sdg count=200000
200000+0 records in
200000+0 records out
102400000 bytes (102 MB) copied, 46.1357 s, 2.2 MB/s
Iostat mit einem Intervall von 1 Sekunde erzeugt dies:
Linux 2.6.32-573.3.1.el6.x86_64
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 406.00 3248.00 0.00 3248 0
sdg 719.00 5752.00 0.00 5752 0
sdg 738.00 5904.00 0.00 5904 0
sdg 721.00 5768.00 0.00 5768 0
sdg 735.00 5880.00 0.00 5880 0
sdg 715.00 5720.00 0.00 5720 0
sdg 732.00 5856.00 0.00 5856 0
sdg 717.00 5736.00 0.00 5736 0
sdg 732.00 5856.00 0.00 5856 0
sdg 717.00 5736.00 0.00 5736 0
sdg 732.00 5856.00 0.00 5856 0
sdg 715.00 5720.00 0.00 5720 0
sdg 732.00 5856.00 0.00 5856 0
sdg 714.00 5712.00 0.00 5712 0
sdg 733.00 5864.00 0.00 5864 0
sdg 716.00 5728.00 0.00 5728 0
sdg 732.00 5856.00 0.00 5856 0
sdg 715.00 5720.00 0.00 5720 0
sdg 732.00 5856.00 0.00 5856 0
sdg 712.00 5696.00 0.00 5696 0
sdg 732.00 5856.00 0.00 5856 0
sdg 715.00 5720.00 0.00 5720 0
sdg 734.00 5872.00 0.00 5872 0
sdg 715.00 5720.00 0.00 5720 0
sdg 734.00 5872.00 0.00 5872 0
sdg 715.00 5720.00 0.00 5720 0
sdg 732.00 5856.00 0.00 5856 0
sdg 715.00 5720.00 0.00 5720 0
sdg 732.00 5856.00 0.00 5856 0
sdg 715.00 5720.00 0.00 5720 0
sdg 733.00 5864.00 0.00 5864 0
sdg 716.00 5728.00 0.00 5728 0
sdg 733.00 5864.00 0.00 5864 0
sdg 444.00 3320.00 6960.00 3320 6960
sdg 71.00 56.00 15360.00 56 15360
sdg 81.00 72.00 17280.00 72 17280
sdg 83.00 80.00 17520.00 80 17520
sdg 81.00 80.00 17040.00 80 17040
sdg 82.00 72.00 17520.00 72 17520
sdg 81.00 72.00 17280.00 72 17280
sdg 83.00 80.00 17520.00 80 17520
sdg 81.00 80.00 17040.00 80 17040
sdg 82.00 72.00 17520.00 72 17520
sdg 82.00 80.00 17280.00 80 17280
sdg 204.00 1152.00 14352.00 1152 14352
sdg 718.00 5744.00 0.00 5744 0
sdg 160.00 1024.00 7328.00 1024 7328
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
Laufen Strace auf dd enthüllt nichts Seltsames:
open("/dev/zero", O_RDONLY) = 3
dup2(3, 0) = 0
close(3) = 0
lseek(0, 0, SEEK_CUR) = 0
open("/dev/sdg", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
Das gleiche Verhalten wird jedoch bei Verwendung von nicht beobachtet
cat /dev/zero >/dev/sdg
iostat:
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
sdg 37.00 0.00 8880.00 0 8880
sdg 73.00 0.00 17520.00 0 17520
sdg 74.00 0.00 17528.00 0 17528
sdg 75.00 0.00 17304.00 0 17304
sdg 50.00 0.00 11768.00 0 11768
sdg 56.00 0.00 12976.00 0 12976
sdg 44.00 0.00 10328.00 0 10328
sdg 76.00 0.00 17544.00 0 17544
sdg 75.00 0.00 17536.00 0 17536
sdg 75.00 0.00 17536.00 0 17536
Was ist los?
Antworten:
Obwohl die CF-Karte 512-Byte-Blöcke aufweist, gilt Folgendes:
Die Verwendung einer Blockgröße von 4 KB für df entfernt den Messwert und erhöht daher die Leistung:
Ich vermute, dass der Kernel die Karte liest, um einen vollständigen Block zum Zurückschreiben zusammenzustellen, aber es scheint nicht das richtige Verhalten zu sein.
quelle
Ihr Gerät verfügt über einen kleinen Puffer, um die Geschwindigkeit zu erhöhen. Wenn Sie mit cat umleiten, wird die Pufferung stattdessen vom Betriebssystem durchgeführt. Sie können dd anweisen, direkt auf das Gerät zu schreiben, ohne es zu zwischenspeichern. Zum Beispiel:
Sehen
man 5 open
und lesen Sie darüberO_DIRECT
. Natürlich wird dies sehr langsam sein. Wenn Sie es beschleunigen möchten, aber dennoch die Funktionen von nutzen möchtendd
, können Sie Folgendes tun:quelle