dd записывает в CF с задержкой

У меня есть старая 64-мегабайтная CF-карта, которую я использую в своем ноутбуке (ядро 2.6.38) с адаптером CardBus. Если я пишу 64MB изображение на эту CF-карту, тогда скорость записи составляет более 200 Мбайт / с:

T42 ~ # fdisk -lu Disk /dev/sda: 40.0 GB, 40007761920 bytes 255 heads, 63 sectors/track, 4864 cylinders, total 78140160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00043afc Device Boot Start End Blocks Id System /dev/sda1 * 2048 73947135 36972544 83 Linux /dev/sda2 73949182 78139391 2095105 5 Extended /dev/sda5 73949184 78139391 2095104 82 Linux swap / Solaris Disk /dev/sdb: 64 MB, 64225280 bytes 8 heads, 32 sectors/track, 490 cylinders, total 125440 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 * 32 125300 62634+ 4 FAT16 <32M Partition 1 has different physical/logical endings: phys=(488, 7, 32) logical=(489, 3, 21) T42 ~ # mount | grep -i sdb T42 ~ # time dd if=64MB of=/dev/sdb bs=10M 6+1 records in 6+1 records out 64225280 bytes (64 MB) copied, 0.320419 s, 200 MB/s real 0m0.624s user 0m0.000s sys 0m0.304s T42 ~ # 

64 МБ в течение 0.32 секунд, очевидно, нереалистично в случае 10-летней CF-карты, и если я удалю карту из ноутбука сразу после dd if=64MB of=/dev/sdb bs=10M , я вижу много <timestamp> end_request: I/O error, dev sdb, sector <sector number> ошибки в выходе dmesg . Что может вызвать такое поведение?

  • Чтение только 1 ГБ с использованием команды dd
  • потерянный раздел dd
  • Как проверить прогресс при клонировании диска с помощью `dd`?
  • Может ли dd перезаписывать части файла?
  • Возобновление DD всего диска
  • Почему dd считывает с устройства вывода?
  • восстановить dd клонированную SD-карту (на устройстве не осталось места)
  • dd loop input Файл для вывода устройства?
  • 2 Solutions collect form web for “dd записывает в CF с задержкой”

    Ячейки блочных устройств буферизуются ядром. Это ясно видно, когда монтируется файловая система (при размонтировании буферы должны быть сброшены, что приводит к очень длительной задержке перед возвратом umount ). Эта задержка, похоже, ухудшается, поскольку доступная оперативная память становится все больше и больше. Вы можете написать половину ГБ сразу, прежде чем ядро ​​инициализирует передачу данных. Ядро может прозрачно записывать на устройство в течение нескольких минут после того, как вы увидите, что передача завершена.

    Эта функция очень хороша по многим причинам. Это позволяет значительно быстрее реагировать на чтение и запись на устройства, данные также могут быть прозрачно прочитаны из буфера после записи, пока фактическая физическая запись не будет завершена. Для жестких дисков, которые установлены в долгосрочной перспективе, ядро ​​планирует записывать, когда у него есть время, в то время как устройство реагирует быстрее с точки зрения пользователя. Специально для магнитных жестких дисков запись в больших кусках последовательно также выполняется быстрее, чем запись небольших фрагментов в нескольких местах по всему диску: куски можно сортировать и группировать до нажатия на физическое устройство (хотя жесткие диски также выполняют некоторую буферизацию и сортировку данных внутри оборудования). Короче говоря, вы не заметили медлительность устройства, и вы также не заметили начальных задержек (в случае подключенных к сети дисков или жестких дисков, которые должны переходить из спящего режима).

    Для прямого доступа к блочному устройству буферизация несколько неудачна, потому что вы не вызываете umount и вы действительно не замечаете, когда передача завершена. Вы должны вызвать sync в любом случае.

    ОС кэширует данные для dd (и других команд), вы должны выполнить sync перед удалением CF и дождитесь завершения синхронизации .

    Кэширование / буферизация важна по соображениям производительности, а также позволяет ядру / драйверам переставлять записи в базовое оборудование, чтобы, например, все записи на один трек на HD выполнялись в правильном порядке за один раз (меньше движения головы).

    Linux и Unix - лучшая ОС в мире.