Как скопировать файлы как можно быстрее?
Я запускаю свою оболочку script на machineA
, которая копирует файлы из machineB
и machineC
в machineA
.
Если файл отсутствует в machineB
, то он должен быть в machineC
для уверенности. Поэтому сначала я попытаюсь скопировать из machineB
, если его нет в machineB
, тогда я перейду к machineC
, чтобы скопировать те же файлы.
В machineB
и machineC
в этой папке будет такая папка YYYYMMDD
-
/data/pe_t1_snapshot
Итак, какая бы дата не была последней датой в этом формате YYYYMMDD
внутри указанной выше папки - я выберу эту папку в качестве полного пути, откуда мне нужно начать копирование файлов -
так что предположим, что это последняя папка даты 20140317
внутри /data/pe_t1_snapshot
, тогда это будет полный путь для меня -
/data/pe_t1_snapshot/20140317
откуда мне нужно начать копирование файлов в machineB
и machineC
. Мне нужно скопировать файлы 400
в machineA
из machineB
и machineC
, и каждый размер файла 1.5 GB
.
В настоящее время у меня есть моя ниже оболочка script, которая отлично работает, когда я использую scp
, но почему-то требуется ~ 2 hours
, чтобы скопировать файлы 400
в machineA, который слишком длинный для меня, я думаю.: (
Ниже моя оболочка script -
#!/bin/bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 3 5 7 9) # this will have more file numbers around 200
SECONDARY_PARTITION=(1 2 4 6 8) # this will have more file numbers around 200
dir1=$(ssh -o "StrictHostKeyChecking no" [email protected]${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" [email protected]${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
echo $dir1
echo $dir2
if [ "$dir1" = "$dir2" ]
then
# delete all the files first
find "$PRIMARY" -mindepth 1 -delete
for el in "${PRIMARY_PARTITION[@]}"
do
scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
# delete all the files first
find "$SECONDARY" -mindepth 1 -delete
for sl in "${SECONDARY_PARTITION[@]}"
do
scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Я копирую файлы PRIMARY_PARTITION
в папку PRIMARY
и SECONDARY_PARTITION
в папку SECONDARY
в machineA
.
Есть ли способ переместить файлы быстрее в machineA
. Могу ли я копировать 10 файлов за раз или 5 файлов одновременно, чтобы ускорить этот процесс или любой другой подход?
ПРИМЕЧАНИЕ: machineA
работает на SSD
UPDATE: -
Параллельная оболочка script, которую я пробовал, верхняя часть оболочки script такая же, как показано выше.
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
find "$PRIMARY" -mindepth 1 -delete
for el in "${PRIMARY_PARTITION[@]}"
do
(scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.) &
WAITPID="$WAITPID $!"
done
find "$SECONDARY" -mindepth 1 -delete
for sl in "${SECONDARY_PARTITION[@]}"
do
(scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.) &
WAITPID="$WAITPID $!"
done
wait $WAITPID
echo "All files done copying."
fi
Ошибки, которые я получил с параллельной оболочкой script -
channel 24: open failed: administratively prohibited: open failed
channel 25: open failed: administratively prohibited: open failed
channel 26: open failed: administratively prohibited: open failed
channel 28: open failed: administratively prohibited: open failed
channel 30: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 32: open failed: administratively prohibited: open failed
channel 36: open failed: administratively prohibited: open failed
channel 37: open failed: administratively prohibited: open failed
channel 38: open failed: administratively prohibited: open failed
channel 40: open failed: administratively prohibited: open failed
channel 46: open failed: administratively prohibited: open failed
channel 47: open failed: administratively prohibited: open failed
channel 49: open failed: administratively prohibited: open failed
channel 52: open failed: administratively prohibited: open failed
channel 54: open failed: administratively prohibited: open failed
channel 55: open failed: administratively prohibited: open failed
channel 56: open failed: administratively prohibited: open failed
channel 57: open failed: administratively prohibited: open failed
channel 59: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 61: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 64: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 68: open failed: administratively prohibited: open failed
channel 72: open failed: administratively prohibited: open failed
channel 74: open failed: administratively prohibited: open failed
channel 76: open failed: administratively prohibited: open failed
channel 78: open failed: administratively prohibited: open failed
Ответы
Ответ 1
вы можете попробовать эту команду
rsync
из
man rsync
вы увидите, что: Протокол удаленного обновления rsync позволяет rsync передавать только различия между двумя наборами файлов по сетевому соединению, используя эффективный алгоритм поиска контрольной суммы, описанный в техническом отчете, прилагаемом к этому пакету.
Ответ 2
Вы можете попробовать HPN-SSH (высокопроизводительный SSH/SCP) - http://www.psc.edu/index.php/hpn-ssh или http://hpnssh.sourceforge.net/
Проект HPN-SSH представляет собой набор исправлений для OpenSSH (scp является его частью), чтобы лучше настраивать различные tcp и внутренние буферы. Существует также "нет" шифр ( "None Cipher Switching" ), который отключает шифрование, и это тоже может вам помочь (если вы не используете общедоступные сети для отправки данных).
Оба сжатия и шифрования потребляют процессорное время; и 10 Гбит Ethernet иногда может быть быстрее для переноса несжатого файла, а затем ожидания процессора для сжатия и шифрования.
Вы можете настроить свою настройку:
- Измерьте пропускную способность сети между машинами с помощью
iperf
или netperf
. Сравните с реальной сетью (возможности сетевых карт, переключатели). При хорошей настройке вы должны получить более 80-90 процентов заявленной скорости.
- Рассчитайте объем данных и время, необходимое для передачи большого количества данных в вашей сети с использованием скорости от
iperf
или netperf
. Сравните с фактическим временем передачи, есть ли огромная разница?
- Если ваш процессор работает быстро, данные сжимаются, а сеть работает медленно, сжатие поможет вам.
- Взгляните на
top
, vmstat
, iostat
.
- Есть ли 100% загруженные ядра процессора (запустите
top
и нажмите 1
, чтобы увидеть ядра)?
- Есть ли слишком много прерываний (
in
) в vmstat 1
? Что относительно переключателей контекста (cs
)?
- Что такое скорость чтения файлов в
iostat 1
? Ваши жесткие диски достаточно быстры, чтобы читать данные; для записи данных на приемник?
- Вы можете попробовать выполнить полнопрофильное профилирование с помощью
perf top
или perf record -a
. Много ли вычислений scp или сетевого стека в Linux? Если вы можете установить dtrace
или ktap
, попробуйте сделать также профилирование off-cpu
Ответ 3
У вас есть 1,5 ГБ * 400 = 600 ГБ данных. Не связанный с ответом, я полагаю, что настроенная машина выглядит некорректной, если вам нужно передать этот объем данных. Вероятно, вам необходимо было сгенерировать эти данные на машине A. В первую очередь.
Передача данных объемом 600 Гбайт за 2 часа, то есть скорость передачи ~ 85 МБ/с, что означает, что вы, вероятно, достигли пределов передачи ваших дисков или (почти) сети. Я считаю, что вы не сможете быстрее передавать любую другую команду.
Если машины близки друг к другу, метод копирования, который, по моему мнению, является самым быстрым, заключается в том, чтобы физически удалить хранилище с машин B и C, поместить их в машину A, а затем локально скопировать их без передачи по сети. Время для этого - время для перемещения по памяти, плюс время передачи диска. Боюсь, однако, что копия будет не намного быстрее, чем 85 МБ/с.
Команда передачи сети, которая, по моему мнению, будет самой быстрой, - netcat, поскольку она не имеет накладных расходов, связанных с шифрованием. Кроме того, если файлы не являются медиафайлами, вам необходимо сжать их с помощью компрессора, который сжимает более 85 МБ/с. Я знаю lzop и lz4, которые предоставляются быстрее, чем этот показатель. Таким образом, моя командная строка для передачи одного каталога будет (синтаксис BSD netcat):
машина A:
$ nc -l 2000 | lzop -d | tar x
машина B или C (может выполняться с машины A с помощью ssh):
$ tar c directory | lzop | nc machineA 2000
Извлеките компрессор, если переносите медиафайлы, которые уже сжаты.
Команды упорядочения структуры каталогов не имеют отношения к скорости, поэтому я не стал писать их здесь, но вы можете повторно использовать свой собственный код.
Это самый быстрый способ, о котором я могу думать, но, опять же, я не верю, что эта команда будет намного быстрее того, что у вас уже есть.
Ответ 4
rsync произвольно сжимает свои данные. Это обычно делает передачу намного быстрее.
Вы не упомянули SCP, но SCP-C также сжимает.
Обратите внимание, что сжатие может привести к тому, что передача будет выполняться быстрее или медленнее, в зависимости от скорости вашего процессора и вашей сетевой ссылки.
Более медленные ссылки и более быстрый процессор делают сжатие хорошей идеей; более быстрые ссылки и более медленный процессор делают сжатие плохим.
Как и при любой оптимизации, измерьте результаты в своей собственной среде.
Также я думаю, что ftp - это еще один вариант для вас, так как мой тест скорости передачи для больших файлов ( > 10M) FTP работает быстрее, чем SCP и даже rsync (зависит от формата файла и степени сжатия).
Ответ 5
rsync
- хороший ответ, но если вы заботитесь о безопасности, вам следует рассмотреть возможность использования:
rdist
Некоторые сведения о различиях между rsync и rdist можно найти здесь:
rdist vs rsync
и блог о том, как настроить его с помощью ssh, можно найти здесь: не root-удаленное обновление
Наконец, вы можете использовать печально известный шаблон tar tar tar с посыпанием ssh.
tar zcvf - /wwwdata | ssh [email protected] "cat > /backup/wwwdata.tar.gz"
В этом примере говорится: tar копировать по защищенной сети
Ответ 6
Пульт не поддерживает мультиплексирование ssh.
Чтобы замолчать сообщение:
mux_client_request_session: session request failed: Session open refused by peer
Измените файл ~/.ssh/config
:
Host destination.hostname.com
ControlMaster no
Host *
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%[email protected]%h:%p
Более подробную информацию и заметки можно найти здесь.
Ответ 7
Вы определенно хотите попробовать rclone. Эта вещь сумасшедшая быстро:
синхронизация sudo rclone/usr/home/fred/temp -P -L --transfers 64
Передано: 17,929G/17,929 ГБайт, 100%, 165,692 МБ/с, ETA 0s Ошибки: 75 (повторная попытка может помочь) Проверок: 691078/691078, 100% Передано: 345539/345539, 100% Истекшее время: 1m50.8s
Это локальная копия с и на твердотельный накопитель LITEONIT LCS-256 (256GB).