Переміщення 2 ТБ (10 мільйонів файлів + бруди), яке моє вузьке місце?


21

Фон

Я вибіг з простору на /home/dataі необхідності передачі /home/data/repoв /home/data2.

/home/data/repoмістить 1M dirs, кожен з яких містить 11 dirs та 10 файлів. Він становить 2 ТБ.

/home/dataзнаходиться на ext3 із включеним dir_index. /home/data2знаходиться на ext4. Запуск CentOS 6.4.

Я припускаю, що ці підходи повільні через те, що repo/під ним розміщено 1 мільйон дрирів.


Спроба 1: mvшвидка, але переривається

Я міг би зробити, якби це закінчилося:

/home/data> mv repo ../data2

Але це було перервано після передачі 1,5 ТБ. Він писав зі швидкістю 1 Гб / хв.

Спроба 2: rsyncсканує через 8 годин складання списку файлів

/home/data> rsync --ignore-existing -rv repo ../data2

На створення додаткового списку файлів знадобилося кілька годин, а потім він передається зі швидкістю 100 Мб / хв.

Я скасовую це, щоб спробувати більш швидкий підхід.

Спроба 3а: mvскаржиться

Тестування його у підкаталозі:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

Я не впевнений, в чому це помилка, але, можливо, cpможе мене врятувати.

Спроба 3b: cpпотрапляє ніде через 8 годин

/home/data> cp -nr repo ../data2

Він читає диск протягом 8 годин, і я вирішу скасувати його і повернутися до rsync.

Спроба 4: rsyncсканує через 8 годин складання списку файлів

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

Я --remove-source-filesдумав, що це може зробити це швидше, якщо я зараз почну очищення.

Створення списку файлів займає щонайменше 6 годин, після чого він передається зі швидкістю 100-200 МБ / хв.

Але сервер був обтяжений протягом ночі, і мій зв’язок закрився.

Спроба 5: ТІЛЬКИ ТОЛЬКО 300 ГБ ЛІТИ ДУХАТИ ЧОМУ ЦЕ ТАКІ БОЛЬНО

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

Знову перервався. -WМайже , як зробити «посилати інкрементний список файлів» швидше, що в моєму розумінні не має сенсу. Незважаючи на те, передача жахливо повільна, і я відмовляюся від цього.

Спроба 6: tar

/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)

В основному намагаються перекопіювати все, окрім ігнорування існуючих файлів. Він має прошиватись до 1,7 ТБ існуючих файлів, але принаймні читає його зі швидкістю 1,2 Гб / хв.

Поки що це єдина команда, яка дає миттєве задоволення.

Оновлення: перервано знову, якось, навіть з nohup ..

Спроба 7: харакірі

Досі дебатуємо над цим

Спроба 8: сценарій "злиття" з mv

Дір призначення мав близько 120 тис. Пустих панів, тож я побіг

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

Рубі сценарій:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

Зроблено.


Ви маєте рацію, вона повинна знайти і перерахувати кожен каталог, і 1 мільйон дрін стане болісним.
cybernard

2
Подивіться на яскраву сторону ... якби це Windows, ви не могли б навіть мати мільйон підкаталогів і все ще мати ОС, яка працює. :)
Джек

1
@Tim, чому ти не просто mvзнову? Теоретично mvбуде видалено вихідний файл, лише якщо цільовий файл був повністю скопійований, тому він повинен працювати добре. Також у вас є фізичний доступ до машини або це робиться через sshз'єднання?
тердон

5
Ні, не може. mvне прощає, якщо ви постійно відключаєтесь, ви можете втратити дані і навіть не знати про них. Як ви сказали, що ви робите це над ssh, я настійно рекомендую використовувати screenта відсторонятись. Увімкніть ведення журналу та відстежуйте таким чином. Якщо ви використовуєте багатослівний, це займе більше часу. Також спробуйтеiotop
justbrowsing

2
@justbrowsing - Гарний дзвінок screen. Мені було цікаво багатослівне, але, мабуть, зараз уже пізно перезапустити tar. І iotopбула моєю улюбленою утилітою протягом останніх кількох днів :)
Тім

Відповіді:


6

Ви коли-небудь чули про розбиття великих завдань на менші завдання?

/ home / data / repo містить 1M dirs, кожен з яких містить 11 dirs та 10 файлів. Він становить 2 ТБ.

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

Час перерви на каву.


1
Перевага, яку я туманно підкреслюю, полягає в тому, що ви відстежуєте прогрес у невеликих частинах вручну, щоб відновлення завдання зайняло менше часу, якщо якась частина перервана (адже ви знаєте, які кроки були успішно виконані).
Ярослав Рахматуллін

Це в основному те, що я в кінцевому підсумку робив, окрім як mv. На жаль, немає інструментальної зустрічі mvі rsyncна півдорозі.
Тім

4

Ось що відбувається:

  • Спочатку rsync створить список файлів.
  • Створення цього списку відбувається дуже повільно, завдяки первинному сортуванню списку файлів.
  • Цього можна уникнути, використовуючи ls -f -1 та поєднуючи його з xargs для побудови набору файлів, які використовуватиме rsync, або перенаправлення виводу у файл із списком файлів.
  • Якщо передати цей список rsync замість папки, rsync почне працювати негайно.
  • Ця хитрість ls -f -1 над папками з мільйонами файлів чудово описана в цій статті: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
Чи можете ви навести приклад, як використовувати ls з rsync? У мене схожа, але не однакова ситуація. На машині AI працює rsyncd та велике дерево каталогів, яке я хочу перенести на машину B (насправді 90% каталогів вже знаходиться на B). Проблема полягає в тому, що я маю це робити за допомогою нестабільного мобільного зв'язку, який часто падає. Витрачати годину на створення списку файлів кожного разу, коли я перезавантажуюсь, є досить неефективним. Крім того, B позаду NAT, який я не контролюю, тому важко підключити A -> B, тоді як B -> A - легко.
дб

Погодьтеся з @db. Якщо можна навести приклад, це зробить цю відповідь набагато кориснішою.
redfox05

1

Навіть якщо rsync повільний (чому це повільно? Можливо -z допоможе), це здається, що ви багато перебрали його, так що ви можете просто намагатися:

Якщо ви використовували --remove-source-файли, ви зможете продовжити видалення порожніх каталогів. --remove-source-files видалить усі файли, але залишить там каталоги.

Просто переконайтесь, що НЕ використовуєте --remove-source-файли з --delete, щоб робити кілька проходів.

Також для збільшення швидкості можна використовувати --inplace

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.