Фон
Я вибіг з простору на /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
була моєю улюбленою утилітою протягом останніх кількох днів :)