Иногда я видел в Интернете комментарии в духе «убедитесь, что вы установили« bs = », потому что значение по умолчанию займет слишком много времени», и мой собственный крайне ненаучный опыт «ну, похоже, это заняло больше времени, чем другие». время на прошлой неделе ", кажется, подтверждают это. Поэтому всякий раз, когда я использую 'dd' (обычно в диапазоне 1-2 ГБ), я обязательно указываю параметр bytes. Примерно половину времени я использую значение, указанное в любом онлайн-руководстве, с которого копирую; в остальное время я выберу какое-то число, которое имеет смысл из списка 'fdisk -l', поскольку я предполагаю, что это медленный носитель (например, SD-карта, на которую я пишу).
Существует ли способ определения «наилучшего» значения для конкретной ситуации (тип носителя, размеры шины или что-то еще)? Это легко определить? Если нет, есть ли простой способ пройти 90-95% пути? Или «просто выберите что-то большее, чем 512», даже правильный ответ?
Я думал о том, чтобы попробовать эксперимент самостоятельно, но (помимо большой работы) я не уверен, какие факторы влияют на ответ, поэтому я не знаю, как разработать хороший эксперимент.
источник
Ответы:
dd
восходит к тому времени, когда необходимо было перевести старые ленты мэйнфреймов IBM, и размер блока должен был соответствовать тому, который использовался для записи ленты, иначе блоки данных будут пропущены или усечены. (Ленты с 9 треками были привередливы. Радуйтесь, что они давно мертвы.) В наши дни размер блока должен быть кратным размеру сектора устройства (обычно 4 КБ, но на самых последних дисках может быть намного больше и на очень маленьком большом пальце). Диски могут быть меньше, но 4 КБ - разумное среднее положение независимо), и чем больше, тем лучше для производительности. Я часто использую блоки размером 1 МБ с жесткими дисками. (У нас гораздо больше памяти, чтобы разбрасываться и в эти дни.)источник
@Gilles
хотите ли вы, чтобы я был уведомлен о вашем ответе на комментарий, см. Как работает комментарий @replies? , Так как я проходил мимо: ядро все равно будет с этим разбираться. Ваше утверждение о том, что «эта дополнительная работа может значительно сократить время копирования», не согласуется с моими тестами, но разные системы могут работать по-разному, поэтому, пожалуйста, добавьте время!Есть только один способ определить оптимальный размер блока, и это эталонный тест. Я только что сделал быстрый тест. Тестовая машина - это ПК с Debian GNU / Linux с ядром 2.6.32 и coreutils 8.5. Обе файловые системы - ext3 на томах LVM в разделе жесткого диска. Исходный файл имеет размер 2 ГБ (2040000 КБ, если быть точным). Кеширование и буферизация включены. Перед каждым запуском я очищал кеш с
sync; echo 1 >|/proc/sys/vm/drop_caches
. Время выполнения не включает финалsync
для очистки буферов; финалsync
занимает порядка 1 секунды. Вsame
пробеги были копии на той же файловой системе; чтоdiff
пробеги были копии в файловой системе на другой жесткий диск. Для согласованности сообщенное время является временем настенных часов, полученным сtime
утилита, в считанные секунды. Я запускал каждую команду только один раз, поэтому я не знаю, насколько сильно различается время.Вывод: большой размер блока (несколько мегабайт) помогает, но не сильно (намного меньше, чем я ожидал для копий на одном диске). А
cat
иcp
не так плохо выступают. С этими числами я не считаюdd
нужным беспокоиться. Иди сcat
!источник
>|
- это то же самое,>
что и нижеset -o noclobber
, оболочка будет жаловаться, что файл существует, если вы используете>
.cat
. Почему вы ищете лучший путь? Что не так сcat
?cat
просто копирует свой ввод в свой вывод. Если вы хотите скопировать с ненадежного носителя и пропустить нечитаемые части или повторить попытку несколько раз, это другая проблема, котораяddrescue
прекрасно работает.lsof
. Мгновенная скорость не очень важна для копии диска, потому что она одинакова, так что вы можете разделить количество переданных байтов за прошедшее время; если вы хотите что-то лучше, вы можете использоватьpv
.Я согласен с geekosaur, что размер должен быть кратным размеру блока, который часто составляет 4K.
Если вы хотите найти размер блока,
stat -c "%o" filename
возможно, самый простой вариант.Но скажи, что да
dd bs=4K
, это значит, что это делаетread(4096); write(4096); read(4096); write(4096)
...Каждый системный вызов включает переключение контекста, что связано с некоторыми накладными расходами, и в зависимости от планировщика ввода-вывода чтение с перемежающимися записями может привести к тому, что диск выполнит много операций поиска. (Вероятно, не главная проблема с планировщиком Linux, но, тем не менее, есть над чем подумать.)
Поэтому, если вы это сделаете
bs=8K
, вы разрешите диску считывать два блока за раз, которые, вероятно, расположены близко друг к другу на диске, прежде чем искать что-то еще для выполнения записи (или для обслуживания ввода-вывода для другого процесса).По этой логике,
bs=16K
еще лучше и т. Д.Поэтому я хотел бы знать, есть ли верхний предел, где производительность начинает ухудшаться, или она ограничена только памятью.
источник
Как говорит Жиль, вы можете определить оптимальный параметр для опции bs для dd путем сравнительного анализа. Это, однако, вызывает вопрос: как вы можете удобно сравнить этот параметр?
Мой предварительный ответ на этот вопрос: используйте dd-opt , утилиту, над которой я недавно начал работать, чтобы решить именно эту проблему :)
источник
dd-opt
. Тем не менее, это бесплатное программное обеспечение, лицензируемое в соответствии с AGPLv3 . Так что не стесняйтесь улучшать его и оценивать его чувствительность / точность!Я оптимизировал для чтения SD-карт usb2.0, который, кажется, работает лучше всего
bs=10M
. Я пробовал 4k, до 16M, после 8-10M без улучшения. Вы можете видеть, как ухудшается измерение скорости передачи ... скорее всего, из-за загрузки буферов на устройстве и ожидания его передачи на реальный носитель.источник