web-dev-qa-db-ja.com

ファイルをできるだけ速くコピーする方法は?

machineAmachineBからmachineCにファイルをコピーするmachineAでシェルスクリプトを実行しています。

ファイルがmachineBにない場合は、確かにmachineCにあるはずです。したがって、最初にmachineBからコピーしようとします。machineBにない場合は、machineCに移動して同じファイルをコピーします。

machineBmachineCでは、このフォルダーの中にこのようなYYYYMMDDのようなフォルダーがあります-

/data/pe_t1_snapshot

したがって、上記のフォルダ内のこの形式YYYYMMDDの最新の日付は何であっても-ファイルのコピーを開始する必要がある場所からのフルパスとしてそのフォルダを選択します-

これが最新の日付フォルダであると仮定します20140317内部/data/pe_t1_snapshot次に、これが私にとっての絶対パスになります-

/data/pe_t1_snapshot/20140317

machineBおよびmachineCのファイルのコピーを開始する必要がある場所から。コピーする必要があります400machineAおよびmachineBからのmachineC内のファイル。各ファイルサイズは1.5 GB

現在、私はscpを使用しているため正常に動作する以下のシェルスクリプトを持っていますが、どういうわけか〜2 hoursをコピーして400 machineA内のファイルは長すぎると思います。 :(

以下は私のシェルスクリプトです-

#!/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" david@${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" david@${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-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@${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-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
    done
fi

コピーしていますPRIMARY_PARTITIONPRIMARYフォルダー内のファイルとSECONDARY_PARTITIONSECONDARY内のmachineAフォルダー内の_ファイル。

machineAでファイルをより速く移動する方法はありますか?このプロセスまたは他のアプローチを高速化するために、一度に10ファイルまたは同時に5ファイルをコピーできますか?

注:machineASSDで実行されています

更新:-

私が試した並列シェルスクリプト、シェルスクリプトの上部は上記と同じです。

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-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@${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-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.) &
          WAITPID="$WAITPID $!"        
    done
     wait $WAITPID
     echo "All files done copying."
fi

並列シェルスクリプトで取得したエラー-

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
17
john

あなたはこのコマンドを試すことができます

rsync

から

man rsync

rsyncリモート更新プロトコルを使用すると、rsyncは、このパッケージに付属するテクニカルレポートに記載されている効率的なチェックサム検索アルゴリズムを使用して、2つのファイルセットの違いだけをネットワーク接続経由​​で転送できます。

21
oohcode

HPN-SSH(High Performance SSH/SCP)- http://www.psc.edu/index.php/hpn-ssh または http:// hpnssh。 sourceforge.net/

HPN-SSHプロジェクトは、OpenSSH(scpはその一部)用のパッチのセットであり、さまざまなtcpおよび内部バッファーをより適切に調整します。また、暗号化を無効にする「none」暗号(「None Cipher Switching」)もあり、これも役立ちます(データを送信するためにパブリックネットワークを使用しない場合)。

圧縮と暗号化はどちらもCPU時間を消費します。また、10ギガビットイーサネットの方が、非圧縮ファイルを転送してから、CPUがファイルを圧縮して暗号化するのを待つ方が速い場合があります。

セットアップのプロファイルを作成できます。

  • iperfまたはnetperfを使用して、マシン間のネットワーク帯域幅を測定します。実際のネットワーク(ネットワークカード機能、スイッチ)と比較してください。適切な設定を行うと、宣言された速度の80〜90%を超えるはずです。
  • iperfまたはnetperfの速度を使用して、ネットワークで大量のデータを転送するために必要なデータ量と時間を計算します。実際の転送時間と比較して、大きな違いはありますか?
    • CPUが高速で、データが圧縮可能でネットワークが遅い場合、圧縮が役立ちます。
  • topvmstatiostat。を見てください。
    • CPUコアが100%読み込まれていますか(topを実行し、1を押してコアを表示します)?
    • vmstat 1に割り込み(in)が多すぎませんか?コンテキストスイッチ(cs)はどうですか?
    • iostat 1のファイル読み取り速度はどのくらいですか? HDDはデータを読み取るのに十分な速度ですか?受信機にデータを書き込むには?
  • perf topまたはperf record -aを使用して、フルシステムプロファイリングを試すことができます。 Linuxのscpまたはネットワークスタックによるコンピューティングはたくさんありますか? dtraceまたはktapをインストールできる場合は、 off-cpu profiling も作成してみてください
7
osgx

1.5 GB * 400 = 600 GBのデータがあります。答えとは無関係ですが、この量のデータを転送する必要がある場合、マシンのセットアップが正しくないように見えることをお勧めします。おそらく、最初にマシンAでこのデータを生成する必要がありました。

600 GBのデータが2時間で転送されます。つまり、転送速度は最大85 MB/sです。これは、ディスクドライブまたは(ほぼ)ネットワークのいずれかの転送制限におそらく達したことを意味します。他のコマンドを使って高速に転送することはできないと思います。

マシンが互いに近い場合、私が最速だと思うコピー方法は、ストレージをマシンBとCから物理的に取り外し、マシンAに配置してから、ネットワーク経由で転送せずにローカルにコピーすることです。この時間は、ストレージを移動する時間と、ディスク転送時間です。申し訳ありませんが、コピーは85 MB /秒よりもはるかに高速ではありません。

暗号化に関連するオーバーヘッドがないため、私が最速だと思うネットワーク転送コマンドはnetcatです。さらに、ファイルがメディアファイルでない場合は、85 MB /秒よりも高速に圧縮するコンプレッサーを使用して圧縮する必要があります。この速度よりも高速であることが認められているlzopとlz4を知っています。したがって、単一のディレクトリを転送するためのコマンドラインは(BSD netcat構文)になります。

マシンA:

$ nc -l 2000 | lzop -d | tar x

マシンBまたはC(マシンAからsshを使用して実行できます):

$ tar c directory | lzop | nc machineA 2000

すでに圧縮されているメディアファイルを転送する場合は、コンプレッサーを削除します。

ディレクトリ構造を整理するコマンドは速度の点で重要ではないので、ここでそれらを記述することはありませんでしたが、独自のコードを再利用できます。

これは私が考えることができる最速の方法ですが、繰り返しになりますが、このコマンドがあなたが既に持っているものよりもはるかに速くなるとは思いません。

6
hdante

あなたは間違いなく rclone を試してみたいと思います。これはすごく速いです:

Sudo rclone sync/usr/home/fred/temp -P -L-転送64

転送:17.929G/17.929 GBytes、100%、165.692 MBytes/s、ETA 0sエラー:75(再試行すると役立つ場合があります)チェック:691078/691078、100%転送:345539 ​​/ 345539、100%経過時間:1m50.8s

これは、LITEONIT LCS-256(256GB)SSDとの間のローカルコピーです。

1
Frédéric N.

リモートは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-%r@%h:%p

詳細と注意事項は here にあります。

0
Tom Hale

rsyncは適切な回答ですが、セキュリティを重視する場合は、次の使用を検討してください。

rdist

Rsyncとrdistの違いの詳細については、こちらをご覧ください: rdist vs rsync およびsshを使用して設定する方法に関するブログは、こちら 非rootリモート更新

最後に、悪名高いtar pipe tarパターンを使用し、sshを振りかけます。

tar zcvf - /wwwdata | ssh [email protected] "cat > /backup/wwwdata.tar.gz"

この例は、ここで説明されています: 安全なネットワーク上のtarコピー

0
Jeff Sheffield

rsyncはオプションでそのデータを圧縮します。これにより、通常、転送がはるかに高速になります。

あなたはSCPに言及しませんでしたが、SCP -Cも圧縮します。

CPUとネットワークリンクの速度によっては、圧縮によって転送が速くなったり遅くなったりする場合があることに注意してください。

リンクが低速でCPUが高速なため、圧縮を行うことをお勧めします。リンクが高速でCPUが低速であると、圧縮は好ましくありません。

他の最適化と同様に、独自の環境で結果を測定します。

また、大きなファイル(> 10M)FTPの転送速度テストはSCPよりも速く、さらにrsyncでも動作するため(ファイル形式と圧縮率に依存します)、ftpも別のオプションだと思います。

0
Milad Abooali