Перемещение 2 ТБ (10 мил файлов + каталоги), в чем мое узкое место?

21

Задний план

Я выбежал из пространства на /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

СДЕЛАННЫЙ.

Тим
источник
Вы правы, он должен найти и перечислить каждый каталог, и 1 миллион каталогов будет болезненным.
Кибернард
2
Посмотрите на светлую сторону ... если бы это была Windows, у вас не было бы даже миллиона подкаталогов и все равно была бы работающая ОС. :)
Джек,
1
@ Тим, почему бы тебе просто mvснова? Теоретически mvисходный файл удаляется только в том случае, если конечный файл был полностью скопирован, поэтому он должен работать нормально. Кроме того, у вас есть физический доступ к машине или это делается через sshсоединение?
Тердон
5
Нет, это не может. mvне прощает, если вы продолжаете отключаться, вы можете потерять данные и даже не знать об этом. Как вы сказали, что вы делаете это ssh, я настоятельно рекомендую использовать screenи отсоединиться. Включите ведение журнала и следите за этим. Если вы используете многословно, это займет больше времени. Также попробуйтеiotop
только
2
@ JustBrowsing - Хорошо, звоните screen. Я задавался вопросом о многословии, но я думаю, что слишком поздно, чтобы перезапустить tarпрямо сейчас. И iotopбыла моей любимой утилитой в течение последних нескольких дней :)
Тим

Ответы:

6

Вы когда-нибудь слышали о разделении больших задач на более мелкие?

/ home / data / repo содержит 1 млн. каталогов, каждый из которых содержит 11 каталогов и 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-files, вы можете продолжить, удалив пустые каталоги. --remove-source-files удалит все файлы, но оставит каталоги там.

Просто убедитесь, что вы НЕ используете --remove-source-files с --delete для выполнения нескольких проходов.

Также для увеличения скорости вы можете использовать --inplace

Если вас выгнали из-за того, что вы пытаетесь сделать это удаленно на сервере, продолжайте и запустите это в «экранном» сеансе. По крайней мере, таким образом, вы можете позволить ему работать.

Angelo
источник