使用 dd 将零写入 USB 读卡器上的 CF 卡会导致读取量过大

使用 dd 将零写入 USB 读卡器上的 CF 卡会导致读取量过大

我正在使用 dd 将 CF 卡归零

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

使用 gkrellm 或 iostat 观察系统,我看到 CF 卡设备进行大量读取,然后进行大量写入。

以此示例为例:

# 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

间隔 1 秒的 Iostat 产生以下结果:

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

在 dd 上运行 strace 没有发现任何异常:

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

然而,使用

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

到底是怎么回事?

答案1

尽管报告称 CF 卡具有 512 字节块:

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

在 df 上使用 4k 块大小确实会删除读取,从而提高性能:

# 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

我猜测内核可能正在读取卡以组装一个完整的块来写回,但这似乎不是正确的行为。

答案2

您的设备上有一个小缓冲区,可帮助加快速度。当您使用 cat 重定向时,缓冲由操作系统完成。您可以告诉 dd 直接写入设备而不进行缓存。例如:

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

请参阅man 5 open并阅读O_DIRECT。当然,这会非常慢。如果您想加快速度,但仍想享受 的功能dd,您可以执行以下操作:

dd if=/dev/zero | cat >/dev/sdg

相关内容