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
。
現在、私は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_PARTITION
PRIMARY
フォルダー内のファイルとSECONDARY_PARTITION
SECONDARY
内のmachineA
フォルダー内の_ファイル。
machineA
でファイルをより速く移動する方法はありますか?このプロセスまたは他のアプローチを高速化するために、一度に10ファイルまたは同時に5ファイルをコピーできますか?
注:machineA
はSSD
で実行されています
更新:-
私が試した並列シェルスクリプト、シェルスクリプトの上部は上記と同じです。
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
あなたはこのコマンドを試すことができます
rsync
から
man rsync
rsyncリモート更新プロトコルを使用すると、rsyncは、このパッケージに付属するテクニカルレポートに記載されている効率的なチェックサム検索アルゴリズムを使用して、2つのファイルセットの違いだけをネットワーク接続経由で転送できます。
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
の速度を使用して、ネットワークで大量のデータを転送するために必要なデータ量と時間を計算します。実際の転送時間と比較して、大きな違いはありますか?top
、vmstat
、iostat
。を見てください。top
を実行し、1
を押してコアを表示します)?vmstat 1
に割り込み(in
)が多すぎませんか?コンテキストスイッチ(cs
)はどうですか?iostat 1
のファイル読み取り速度はどのくらいですか? HDDはデータを読み取るのに十分な速度ですか?受信機にデータを書き込むには?perf top
またはperf record -a
を使用して、フルシステムプロファイリングを試すことができます。 Linuxのscpまたはネットワークスタックによるコンピューティングはたくさんありますか? dtrace
またはktap
をインストールできる場合は、 off-cpu profiling も作成してみてください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
すでに圧縮されているメディアファイルを転送する場合は、コンプレッサーを削除します。
ディレクトリ構造を整理するコマンドは速度の点で重要ではないので、ここでそれらを記述することはありませんでしたが、独自のコードを再利用できます。
これは私が考えることができる最速の方法ですが、繰り返しになりますが、このコマンドがあなたが既に持っているものよりもはるかに速くなるとは思いません。
あなたは間違いなく 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との間のローカルコピーです。
リモートは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 にあります。
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コピー
rsyncはオプションでそのデータを圧縮します。これにより、通常、転送がはるかに高速になります。
あなたはSCPに言及しませんでしたが、SCP -Cも圧縮します。
CPUとネットワークリンクの速度によっては、圧縮によって転送が速くなったり遅くなったりする場合があることに注意してください。
リンクが低速でCPUが高速なため、圧縮を行うことをお勧めします。リンクが高速でCPUが低速であると、圧縮は好ましくありません。
他の最適化と同様に、独自の環境で結果を測定します。
また、大きなファイル(> 10M)FTPの転送速度テストはSCPよりも速く、さらにrsyncでも動作するため(ファイル形式と圧縮率に依存します)、ftpも別のオプションだと思います。