20 июня 2015 г.

Как ускорить процесс работы "dd"?





ВНИМАНИЕ!
Эти примеры могут привести как сбою компьютера так и к потере данных, если ваши действия не будут выполняться с осторожностью



bs - аргумент

При использовании dd, bs является одним из наиболее важных аргументов командной строки. Это говорит о размере буфера, используемого для операций. Вы должны помнить, что:

  • Буфер будет влиять на производительность. Более большой буфер быстрее, но не делайте bs слишком большим если нет необходимости.
  • Место для буфера будет выделено из памяти, так что размер ограничен количеством оперативной памяти и доступного адресного пространства.
  • Аргументы count = и другие также можно использовать с bs



Вариант 1
Использование параметра bs (bufer size)

По моему опыту, я не думаю, что есть что-то быстрее чем dd. Регулировка параметра bs может увеличить скорость, например, у меня есть 2 HDD, я знаю, что есть скорость чтения/записи (более 100 МБ / с), так что, мы можем сделать так:

dd if=/dev/sda of=/dev/sdb bs=100M

Тут, мы также можем использовать pv (должен быть установлен первым), который показывает максимальную скорость обоих дисков, а затем переходит на клонирование. У вас должны быть права root:

pv < /dev/sda > /dev/sdb

С pv я получил 156 MB/s

Удобство работы с pv заключается в том, что он показывает прогресс, текущую скорость, время, и ETA.
С pv и очень оптимизированного параметра bs, вы можете записать диск 4 ТБ менее чем за 7 часов (6 часов 50 минут при текущей скорости 150 Мб / с).



Вариант 2
Запись образа с разбивкой + bs

У нас есть образ раздела на 100GB (HDD), нам нужно записать его на новый HDD диск.Вот совет, который может резко ускорить процесс: разделить файл на более мелкие части (чем больше файл, тем медленнее dd работает)

Пример

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

В итоге, получится (maindisk.img000, maindisk.img001 и так далее ...)

Затем

cat maindisk.img* | sudo dd of=/dev/sda1

Перед записью в новый раздел (partition) HDD - partition должны быть такого же размера, как и старый
Этот способ работает быстрее, чем обычный способ (без разбивки).



Тесты с использованием команды dd и параметра bs и параметра sync

В этих тестах я буду полностью стирать все что находится на USB, включая все разделы используя эту команду:

dd if=/dev/zero

Еще один пример стирания и записи в ноль, если жалко флэшку :)

dd if=/dev/urandom | pv | dd of=/dev/null



Каким должен быть "bs" для USB?

Для USB флэшки, я использую bs=1M

В наши дни, bs (block size) должен быть кратен размеру сектора устройства (обычно 4KB), но на самых последних дисках может быть гораздо больше, а на небольших флэшках может быть и меньше, но 4 КБ это разумная середина. Я часто использую 1MB bs с USB устройствами.

Параметр sync - очищает буфер и делает синхронизацию того, что поступило и того что вышло.



В этом приме я не использую bs, по умолчанию bs = 512 bytes

sudo dd if=/dev/zero | pv | sudo dd of=/dev/sdc && sync

Без bs
8179941376 bytes (8.2 GB) copied, 2519.81 s, 3.2 MB/s
7.62GB 0:41:59 [ 3.1MB/s] [ <=> ]



В этом приме я использую bs равный 1Mб

sudo dd if=/dev/zero | pv | sudo dd of=/dev/sdc bs=1M && sync

С bs=1M
8179941376 bytes (8.2 GB) copied, 1052.03 s, 7.8 MB/s
7.62GB 0:17:32 [7.42MB/s] [ <=>]



В этом приме я использую bs равный 4Mб

sudo dd if=/dev/zero | pv | sudo dd of=/dev/sdc bs=4M && sync

С bs=4M
8179941376 bytes (8.2 GB) copied, 1051.14 s, 7.8 MB/s
7.62GB 0:17:31 [7.42MB/s] [ <=> ]


Как видно из примеров выше без bs скорость записи значительно ниже.
bs = 1M и bs = 4M практически не отличаются.

На практике для флэшек рекомендуется использовать bs = 1M


Рекомендую для чтения:

Запись из образа .img или .iso на USB из Linux используя команду "dd"
Команда "dd" как швейцарский нож

Комментариев нет :

Отправить комментарий

Оставить отзыв