79

Я хотел сделать резервную копию пути от компьютера в моей сети к другому компьютеру в той же сети по линии 100 Мбит / с. Для этого я сделал

dd if=/local/path of=/remote/path/in/local/network/backup.img

что дало мне очень низкую скорость передачи по сети, примерно 50-100 кБ / с, что заняло бы вечность. Поэтому я остановил его и решил попробовать распаковать его на лету, чтобы сделать его намного меньше, чтобы сумма перевода была меньше. Так я и сделал

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

Но теперь я получаю примерно 1 МБ / с скорости передачи по сети, так что в 10-20 раз быстрее. Заметив это, я проверил это на нескольких путях и файлах, и это всегда было одинаково.

Почему передача по каналу dd через gzip также увеличивает скорость передачи данных в значительной степени, а не только уменьшает длину байта потока в значительной степени? Вместо этого я ожидал даже небольшого снижения скорости передачи из-за более высокого потребления ЦП при сжатии, но теперь я получаю двойной плюс. Не то чтобы я не был счастлив, но мне просто интересно. ;)

4 ответа4

98

dd по умолчанию использует очень маленький размер блока - 512 байт (!!). То есть много маленьких читает и пишет. Кажется, что dd , использованный наивно в вашем первом примере, генерировал большое количество сетевых пакетов с очень маленькой полезной нагрузкой, таким образом уменьшая пропускную способность.

С другой стороны, gzip достаточно умен, чтобы выполнять ввод-вывод с большими буферами. То есть меньшее количество больших записей по сети.

Можете ли вы попробовать dd снова с большим параметром bs= и посмотреть, будет ли он работать лучше на этот раз?

4

Немного опоздал, но могу добавить ...

В одном из интервью меня как-то спросили, каким будет самый быстрый из возможных методов клонирования побитовых данных и грубых ответов с использованием dd или dc3dd (финансируется DoD). Интервьюер подтвердил, что передача dd к dd более эффективна, поскольку это просто допускает одновременное чтение / запись или, с точки зрения программиста, stdin/stdout , таким образом, ультимативно удваивая скорость записи и сокращая время передачи.

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb
0

Конг правильно. Вы транслируете блоки с диска без сжатия на удаленный хост. Ваш сетевой интерфейс, сеть и ваш удаленный сервер являются ограничением. Сначала вам нужно повысить производительность DD. Задание параметра bs =, который выравнивается с буферной памятью дисков, обеспечит максимальную производительность диска. Например, bs = 32M. Затем он заполнит буфер gzip на скорости линии sata или sas из буфера накопителей. Диск будет более склонен к последовательной передаче, дающей лучше через пут. Gzip сожмет данные в поток и отправит их в ваше местоположение. Если вы используете NFS, это позволит минимизировать передачу nfs. Если вы используете SSH, то вы подвергаетесь инкапсуляции SSH и накладным расходам шифрования. Если вы используете netcat, то у вас нет шифрования над головой.

0

Здесь я предполагаю, что dd сообщает о "скорости передачи", на которую вы ссылаетесь. Это действительно имеет смысл, потому что dd на самом деле передает в 10 раз больше данных в секунду ! Однако dd не передает по сети - это задание обрабатывается процессом gzip .

Некоторый контекст: gzip будет потреблять данные из своего входного канала так же быстро, как он может очистить свой внутренний буфер. Скорость, с которой буфер gzip очищается, зависит от нескольких факторов:

  • Пропускная способность записи ввода / вывода (которая является узким местом в сети и остается постоянной)
  • Пропускная способность чтения ввода-вывода (которая будет намного выше, чем 1 МБ / с чтения с локального диска на современной машине, поэтому вряд ли является узким местом)
  • Степень сжатия (которую я буду считать при 10-кратном ускорении около 10%, что означает, что вы сжимаете какой-то высокоповторный текст, такой как файл журнала или какой-то XML)

Таким образом, в этом случае сеть может обрабатывать 100 кБ / с, а gzip сжимает данные примерно в 10:1 (и не является узким местом ЦП). Это означает, что пока он выдает 100 кБ / с, gzip может потреблять 1 МБ / с, а скорость потребления - это то, что видит dd .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .