Задний план
Я выбежал из пространства на /home/data
и необходимости передачи /home/data/repo
в /home/data2
.
/home/data/repo
содержит 1М каталогов, каждый из которых содержит 11 каталогов и 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
была моей любимой утилитой в течение последних нескольких дней :)