Я обнуляю 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
Iostat с интервалом в 1 секунду производит это:
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
Запуск strace на dd ничего странного не показывает:
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
Что происходит?
Ответы:
Хотя сообщается, что CF-карта имеет блоки 512 байт:
Использование размера блока 4k на df удаляет чтение и, следовательно, увеличивает производительность:
Я предполагаю, что ядро может читать карту, чтобы собрать полный блок для обратной записи, но это не похоже на правильное поведение.
источник
Ваше устройство имеет небольшой буфер для ускорения работы. Когда вы перенаправляете с помощью cat, буферизация выполняется операционной системой. Вы можете указать dd писать прямо на устройство без кеширования. Например:
Смотрите
man 5 open
и читайте оO_DIRECT
. Конечно, это будет очень медленно. Если вы хотите ускорить его, но при этом использовать возможностиdd
, вы можете сделать что-то вроде этого:источник