Как скопировать файлы как можно быстрее?

Я запускаю свою оболочку 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).