Як я можу сповільнити rsync?


35

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

У мене є стара резервна копія вмісту диска, тому очевидним способом отримання решти даних є використання rsyncдля оновлення резервної копії, але це працює в цілому "читання занадто швидко, накопичувач зникає , і мені потрібно почати спочатку "випуск. Чи є спосіб сказати rsyncлише читання X мегабайт даних за хвилину? Як варіант, чи можна сказати йому призупиняти операції, коли накопичувач зникає, і продовжувати роботу, коли він знову підключається?


24
Ви думали про охолодження накопичувача?
AEonAX

3
Наскільки повний накопичувач? Якщо накопичувач заповнений більше ніж на 50%, швидше за все, краще спочатку просто віддзеркалити несправний диск, а потім лише розпочати справу зі складнішими речами на дзеркалі.
kasperd

1
@AEonAX: Хоча прохолодна (sic!) Ідея нестандартної, я б не рекомендував цього: ви ставите додаткові термічні навантаження на пристрій, і це може повністю вийти з ладу.
Пісквор

Відповіді:


46

На відміну від досвіду DopeGhoti, --bwlimitпрапор обмежує передачу даних, моєю rsync (v3.1.2).

тест:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(зауважте: мій timeвихідний вигляд відрізняється від більшості timeвикликів ( zshфункція); ті часи мене не редагували)

Інше, можливо, щось, що відповідає дублю -execв find. Я вважаю, що rsync -Rслід створити та скопіювати батьківські папки, але якщо це не так, то cp --parentsслід.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Примітка : також перевірити ddrescue , це може бути правильно, що ви шукаєте :)


1
Так. Генеральний директор, можливо, заплутався у слові "пропускна здатність", але це стосується будь-якого каналу несучої інформації, а не лише мережі. Сторінка Man спеціально каже: --bwlimit=KBPS limit I/O bandwidth; KBytes per secondжодної згадки про мережу. Недбало переглядаючи код, це обмежує швидкість читання , незалежно від призначення. Крім того , анекдот: Я використовую цей варіант для років тепер обмежити швидкість локальної до локальної записи. linux.die.net/man/1/rsync
Piskvor

1
Добре, по-друге, він насправді підраховує кількість записаних байтів і спить протягом розрахункового часу. io.c, рядки 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);У будь-якому випадку це, ймовірно, буде працювати за призначенням, читаючи в коротких сплесках і сплячи між ними. Я б рекомендував починати з низького значення і обережно збільшуватись, або просто пускати повільну передачу протягом ночі.
Пісквор

25

Трохи рішення MacGyver, але в минулому я мав успіх у цьому:
поставте старий USB 1 концентратор між палицею та комп'ютером. Ні в якому разі не скопіюйте так швидко :-)

Інша можливість: Якщо у вас є інша флешка, поставте її на інший порт USB, підключений до того ж кореневого концентратора (щоб він розділяв пропускну здатність з вашою проблемною палкою).
Тепер почніть велику операцію запису на додаткову палицю, щоб обидві палички змагалися за пропускну здатність. Для подальшого контролю ви можете використовувати ionice, щоб ще більше знизити пріоритет проблемної палички.


1
Я впевнений, що повинен бути спосіб змусити порти працювати як USB 1.1 за допомогою програмного рішення, можливо, надавши параметри модулю USB ядра.
Андре Борі

@ AndréBorie: Є - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , але оскільки в SW є ефективні дроселі, це трохи жорстоке рішення.
Пісквор

@Piskvor він узгоджує більш низьку швидкість передачі даних з пристроєм, як і використання USB 1 концентратора. Я не бачу в цьому нічого "грубої сили".
Андре Борі

Гаразд, поганий вибір слова, визнаю. Але для конфігурування пристроїв IMHO потрібні спеціальні привілеї (root або принаймні% adm), тоді як керувати швидкістю читання за кожним процесом було б простіше. (Плюс, є пристрої, які взагалі не працюють за межами USB 2.0 - з порушенням специфікації)
Piskvor

13

Ви можете використовувати rsync --bwlimit=RATEдля придушення швидкості передачі файлів, яка, виходячи з коментарів нижче, насправді спеціально працює, зменшуючи швидкість читання даних, саме це і потрібно.



3
ionice просто дає пріоритет, якщо тоді читають дві речі, за замовчуванням вони отримують 50/50. ionice може це налаштувати, але якщо читається лише одне, то воно отримає 100%.
coteyr

@coteyr Ви маєте рацію, і тому вам потрібно поєднувати його з процесом їжі 2-ї пропускної здатності на тому самому кореневому концентраторі USB. Дивіться мою відповідь.
Тонні

2
На щастя, ваша відповідь неправильна: --bwlimitвстановлюється межа вводу / виводу, не обов'язково обмеження мережі . Тестували багато разів у різних сценаріях: ця опція обмежує rsync обмеженням на читання , незалежно від призначення. (Виявив це за аналогічним сценарієм, коли швидке записування на повільний локальний пристрій змусило їх вийти з ладу)
Piskvor

1
@piskvor - дякую за це! Ось що я люблю в цьому місці; Я продовжую вивчати нові речі (:
DopeGhoti

8

Більше рішень, на додаток до rsync --bwlimit=100100 Кбіт / с.

  1. Використовуйте ddrescueз --max-read-rateопцією для повного копіювання диска Це також дозволить вам перезапустити повну копію диска там, де вона відмовилася після помилки.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

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

  1. Використовуйте pv("переглядач труб") з --rate-limitопцією або throttleінструментом для обмеження обмеження кількості труб. pvможе також показати прогрес. Ви можете зробити цю роботу для будь-якого інструменту, який використовує трубу або може використовувати трубу:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    або

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

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


Тепер це корисний інструмент, не знав цього, дякую! pvmanpage має ще більше прикладів різних звичаїв.
Пісквор

Я pvзнову і знову добирався з тих пір, як виявив свої щедрі дні. Ще коли тар писав на магнітоли. :)
Dan Garthwaite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.