我正在使用 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