Чи є спосіб визначити оптимальне значення параметра bs до dd?


70

Іноді я бачив коментарі в Інтернеті за принципом "переконайтеся, що ви встановили" bs = ", тому що значення за замовчуванням займе занадто багато часу", і мій власний надзвичайно ненауковий досвід ", добре, що, здається, займе більше часу, ніж інший час минулого тижня ", здається, це несе. Тому щоразу, коли я використовую 'dd' (як правило, в діапазоні 1-2GB), я обов'язково вказую параметр байтів Близько половини часу я використовую значення, вказане в будь-якому інтернет-посібнику, з якого я копіюю; решту часу я виберу якусь цифру, яка має сенс із списку 'fdisk -l', оскільки я вважаю, що це більш повільний носій (наприклад, SD-карта, на яку я пишу).

Для даної ситуації (тип медіа, розмір шини або що-небудь інше важливо) чи існує спосіб визначити "найкраще" значення? Це легко визначити? Якщо ні, то чи є простий спосіб дістати 90-95% шляху? Або "просто вибрати щось більше, ніж 512", навіть правильна відповідь?

Я думав спробувати експеримент самостійно, але (крім того, що я багато працював), я не впевнений, які фактори впливають на відповідь, тому не знаю, як створити хороший експеримент.


запис у один і той же носій інформації відрізняється від запису на інший носій інформації та потребує різних оптимальних налаштувань. Є багато змінних, які будуть різними для всіх, залежно від типу пристрою, швидкості, кешу тощо. На моїй машині bs = 256M є оптимальним.

Відповіді:


27

ddдатується з тих пір, коли потрібно було перекласти старі стрічки мейнфрейму IBM, і розмір блоку повинен був відповідати розміру, який використовується для запису стрічки, або блоки даних будуть пропущені або усічені. (9-трекові стрічки були витонченими. Радійте, що вони давно мертві.) Цього дня розмір блоку повинен бути кратним розміру сектору пристрою (як правило, 4 КБ, але на останніх дисках може бути значно більше і на дуже маленькому пальці) накопичувачі можуть бути меншими, але 4 КБ є розумним середнім рівнем незалежно) і чим більший, тим краще для продуктивності. Я часто використовую розміри блоків розміром 1 Мб на жорстких дисках. (У нас є набагато більше пам’яті, щоб кинутись і в наші дні.)


Жорсткі диски або USB-накопичувачі - це 512 або 4096 (новіших) байт. Оптичний флеш-диск із прямим доступом - 2048 байт. Не можу помилитися з 4096 байтами.
LawrenceC

3
Чому розмір блоку програми копіювання повинен мати щось спільне з основними характеристиками пристрою (виключені стрічки)? Ядро все одно робить власне буферування (а іноді і попереднє завантаження).
Жиль

1
Звести до мінімуму дробові буфери; взагалі все йде швидше, коли ви використовуєте вирівняні буфери, тому що ядро ​​може запускати буфер читання / запису в секторі (або краще, трек або циліндр, але я думаю, що сучасні диски лежать саме про це) та межі буфера ядра, оскільки ядро ​​не має щоб пропустити матеріали або прочитати зайві матеріали або керувати частковими буферами. Безумовно, ви можете просто дозволити ядру впоратися з усім цим, але якщо ви копіюєте гігабайти даних, додаткова робота може значно скоротити час копіювання.
geekosaur

Вам (як правило) потрібно включити, @Gillesякщо ви хочете, щоб я отримав сповіщення про вашу відповідь на коментар, див. Як працюють коментарі @ відповіді? . Оскільки я випадково проходив повз: ядро ​​все одно з цим впорається. Твоя заява, що "ця додаткова робота може значно скоротити час копіювання", не узгоджується з моїми орієнтирами, але різні системи можуть мати різну поведінку, тому, будь ласка, введіть терміни!
Жиль

@Gilles: вибач, я помилився з тобою за оригінального запитувача.
geekosaur

60

Існує лише один спосіб визначити оптимальний розмір блоку, і це орієнтир. Я щойно зробив швидкий орієнтир. Тестова машина - це ПК, на якому працює 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корисність, за секунди. Я запускав кожну команду один раз, тож не знаю, скільки розбіжностей у часі.

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

Висновок: великий розмір блоку (кілька мегабайт) допомагає, але не кардинально (набагато менше, ніж я очікував для копій на одному диску). А catта cpне так погано виступають. З цими цифрами я не вважаю, що ddварто турбуватися. Іди з cat!


Я б порекомендував ОП зробити власний бенчмаркінг, але все одно, приємна відповідь!
ніндзя

5
@Nikhil >|те саме, >що, за винятком того, що під set -o noclobber, оболонка скаржиться, що файл існує, якщо ви використовуєте >.
Жиль

2
@Masi Так, якщо я хочу клонувати цілий диск, я буду використовувати cat. Чому ви шукаєте кращого способу? Що не так cat?
Жиль

5
@Masi catпросто копіює свої дані на свій вихід. Якщо ви хочете скопіювати з ненадійних носіїв інформації та пропустити нечитабельні деталі або повторно спробувати кілька разів, це вже інша проблема, для якої ddrescueпрацює дуже непогано.
Жиль

1
@sudo Ви можете отримати кількість даних, скопійованих lsof. Миттєва швидкість не дуже важлива для копії диска, оскільки вона є рівномірною, тому ви можете розділити байти, передані за минулий час; якщо хочете чогось кращого, можете скористатися pv.
Жиль

8

Я погоджуюся з geekosaur, що розмір повинен бути кратним розміру блоку, який часто становить 4K.

Якщо ви хочете знайти розмір блоку stat -c "%o" filename, мабуть, найпростіший варіант.

Але скажи, що ти це робиш dd bs=4K, це означає, що це робить read(4096); write(4096); read(4096); write(4096)...

Кожен системний виклик включає в себе контекстний перемикач, який передбачає деяку накладні витрати, і залежно від планувальника вводу-виводу, читання з перемежованим записом може спричинити диск робити багато пошукових запитів. (Можливо, це не головна проблема з планувальником Linux, але, тим не менш, над чим подумати.)

Отже, якщо ви це робите bs=8K, ви дозволяєте диску читати два блоки одночасно, які, ймовірно, близько на одному диску, перш ніж шукати де-небудь інше, щоб зробити запис (або подати сервіс вводу / виводу для іншого процесу).

За цією логікою bs=16Kще краще і т.д.

Тож, що я хотів би знати, чи є верхня межа, коли продуктивність починає погіршуватися, або якщо вона обмежена лише пам'яттю.


4
Профіль, не спекулюйте!
Жиль

1
Інтерфейс програмування Linux погоджується зі мною. Див. Розділ 13 - Буферування файлів вводу / виводу.
Мікель

4
Цікаво, що їхні орієнтири припускають, що користь вище 4K мало.
Мікель

4
Крім того, очевидно, що заздалегідь прочитане файл за замовчуванням становить 128 Кб, тому це значення може бути корисним.
Мікель

6
У мене тут доступ до 24-дискового RAID50, де bs = 8K отримує мені 197MB / s, але bs = 1M отримує мені 2,2 ГБ / с, що є близьким до теоретичної пропускної здатності RAID. Так що BS має значення АЛЬО. Однак, використовуючи bs = 10M, я отримую лише 1,7 Гб / с. Тому, схоже, стає гірше за якийсь поріг, але не впевнений, чому.
Джозеф Гарвін

5

Як каже Гілльз, ви можете визначити оптимальний параметр для варіанту bs до dd шляхом порівняльного аналізу. Це, однак, ставить питання: як можна зручно орієнтувати цей параметр?

Моя попередня відповідь на це питання: використовувати dd-opt , утиліту, над якою я нещодавно почав працювати над вирішенням цієї проблеми :)


1
Яка чутливість виходу? 90-95% чи> 95%? Я не знаю, що ви можете це змінити.
Лео Леопольд Герц 준영

1
@Masi, боюся, я над цим не працював dd-optдавно. Однак це вільне програмне забезпечення, ліцензоване згідно з AGPLv3 . Тож сміливо вдосконалюйте його та оцінюйте його чутливість / точність!
sampablokuper

0

Я оптимізований для зчитувача sdcard usb2.0, який, здається, працює найкраще bs=10M. Я спробував 4k, до 16M, після 8-10M покращення не було. Ви можете бачити, як вимірювання швидкості передачі погіршується ... швидше за все, через завантаження буферів на пристрої, потім очікування переходу пристрою на фактичний носій.

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.