В настоящее время я восстанавливаю usb-флешку с помощью образа dd, который я создал ранее. Однако замечена очень низкая скорость записи около ~7 МБ/с, хотя флешка обычно намного быстрее.
Немного осмотревшись, я заметил, что с USB-накопителя считывается много данных, что объясняет низкую производительность записи. В это время к устройству не обращается ничего, кроме dd.
Отредактированная atop
строка:
sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1
Я заметил похожее поведение при прямой записи в мой массив md с помощью dd. Однако при записи в смонтированную файловую систему с помощью dd этого не происходит.
Итак, мой вопрос: почему данные считываются с USB-накопителя при прямой записи на блочное устройство и можно ли это предотвратить, чтобы повысить производительность записи?
решение1
Итак, не совсем понятно, что происходит, но я подозреваю, что вы записываете небольшие блоки (по 512 байт) на USB, а затем dd проверяет, правильно ли записан байт, что приводит к ОГРОМНОМУ количеству операций чтения и записи, чтения и записи.
Настройка размера блока на «правильный» размер — нетривиальная задача, но есть несколько правил, как это сделать. В общем, я обнаружил, что размер блока в 64 КБ — это хороший компромисс по большинству направлений, но ваши файловые системы могут вносить изменения в этот размер, если вы используете что-то экзотическое (например zfs
, ).
Попробуйте что-то вроде этого:
lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k
Для более подробного обсуждения посетитеэта почта.
решение2
Для меня dd
по умолчанию используется кэш страниц. Я думаю, это нормально для систем с кэшем страниц. Однако кэш страниц требует чтения устройства хранения, что может привести к низкой скорости записи.
Для меня есть 3 способа обойти это и получить полную скорость:
- Установите
dd
размер блока 4096 или кратный ему. (без чтения) - Установите
dd
размер блока достаточно большим. Для меня это было около 1 миллиона и выше. Я получил полную скорость около 1 миллиона. (очень мало чтений) - Не используйте кэш страницы, указав
dd
параметрoflags=direct
. Установитеdd
размер блока достаточно большим, кратным 512. Для меня это было околоbs=120k
и выше. (без чтений)
Что следует отметить в моей системеразмер блокадля всех устройств хранения данных иразмер страницы4096 байт. Найдено с:
blockdev --getbsz /dev/sd?
getconf PAGESIZE
Такжеразмер секторасоставляет 512 байт.
fdisk
и, возможно, parted
сможет сказать вам размер сектора.