Die Verwendung von dd zum Schreiben von Nullen auf die CF-Karte auf dem USB-Kartenleser verursacht viel Lesen

2

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?

Neik
quelle
Versuchen Sie es mit einer vernünftigen Blockgröße (4K-64K)
qasdfdsaq

Antworten:

1

Obwohl die CF-Karte 512-Byte-Blöcke aufweist, gilt Folgendes:

kernel: sd 11:0:0:0: [sdk] 15662304 512-byte logical blocks

Die Verwendung einer Blockgröße von 4 KB für df entfernt den Messwert und erhöht daher die Leistung:

# dd if=/dev/zero of=/dev/sdk count=80000
80000+0 records in
80000+0 records out
40960000 bytes (41 MB) copied, 5.49363 s, 7.5 MB/s
# dd if=/dev/zero of=/dev/sdk count=10000 bs=4k
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 2.82353 s, 14.5 MB/s

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.

Neik
quelle
Neugierig, warum denkst du, ist das nicht das richtige Verhalten? Wie könnte es sonst funktionieren, wenn Sie nur einen Teil eines Blocks ausschreiben?
ChrisInEdmonton
Puffern Sie die Schreibvorgänge, bis ich die Datei schließe oder der Puffer
voll
Ich mag die Antwort. Nur neugierig, wie würden die Ergebnisse aussehen, wenn Sie eine Blockgröße von mehr als 4 KB, beispielsweise 8 KB oder 16 KB festlegen? Ich würde davon ausgehen, dass sie den Messwert entfernen und auch ungefähr 14,5 MB / s erhalten würden.
20.
Ja. Wenn Sie die Blockgröße auf die von Ihnen vorgeschlagenen Werte ändern, erhalten Sie dasselbe Ergebnis. Blockgrößen von 1k und 2k funktionieren genauso schlecht wie 512 Bytes.
Neik
0

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:

dd if=/dev/zero of=/dev/sdg oflag=direct

Sehen man 5 openund lesen Sie darüber O_DIRECT. Natürlich wird dies sehr langsam sein. Wenn Sie es beschleunigen möchten, aber dennoch die Funktionen von nutzen möchten dd, können Sie Folgendes tun:

dd if=/dev/zero | cat >/dev/sdg
Gogatoren
quelle
Ich verstehe nicht, warum dies das Lesen von der CF-Karte erfordert. Ich schreibe nur. Außerdem erleide ich einen massiven Leistungseinbruch, der durch all diese unnötigen Lesevorgänge verursacht wird.
Neik