Фон
Я вибіг з простору на /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
Зроблено.
mvзнову? Теоретично mvбуде видалено вихідний файл, лише якщо цільовий файл був повністю скопійований, тому він повинен працювати добре. Також у вас є фізичний доступ до машини або це робиться через sshз'єднання?
mvне прощає, якщо ви постійно відключаєтесь, ви можете втратити дані і навіть не знати про них. Як ви сказали, що ви робите це над ssh, я настійно рекомендую використовувати screenта відсторонятись. Увімкніть ведення журналу та відстежуйте таким чином. Якщо ви використовуєте багатослівний, це займе більше часу. Також спробуйтеiotop
screen. Мені було цікаво багатослівне, але, мабуть, зараз уже пізно перезапустити tar. І iotopбула моєю улюбленою утилітою протягом останніх кількох днів :)