2017年12月27日水曜日

SCPを高速化

あまプロではシェルスクリプトを作成する場合が有ります。

先日、scpで大量のファイルをコピーする案件が有りました。
scpとはsshのcpで、暗号化通信コピーのコマンドになります。
サーバ間やリモートローカル間でファイル遣り取りする際に使います。

大変便利なコマンドなんですが、暗号化通信の為に接続時に時間が掛かります。
httpsのサイトも最初の表示に時間が掛かるのと同じです。
内部で公開鍵の交換等を行っている為で、どうしても処理に時間が掛かります。
数十〜数百ファイルなら大した時間ではないですが、これが数千数万になると数時間掛かってしまいます。

ディレクトリ内にファイルが有る場合
scp コピー元 コピー先
scp hoge.jpg username@hostname:/path/to/dir
という風にローカルからリモートへファイルをアップロードします。

シェルスクリプトで大量のファイルをアップロードする場合
ls *.jpg | xargs -i scp {} username@hostname:/path/to/dir
こうなります。

しかし、これだと
scp hoge0.jpg username@hostname:/path/to/dir
scp hoge1.jpg username@hostname:/path/to/dir
scp hoge2.jpg username@hostname:/path/to/dir
scp hoge3.jpg username@hostname:/path/to/dir
 ︙
としている事になり、1ファイルずつ接続切断を繰り返すので非効率です。
この場合、rオプションを追加して、ディレクトリごとアップロードすると高速になります。

scp -r hoge/ username@hostname:/path/to/dir

rオプションを追加する事で、内部ではこんな感じになり、
scp hoge0.jpg hoge1.jpg hoge2.jpg hoge3.jpg username@hostname:/path/to/dir
一回の接続切断にまとめてくれます。

ディレクトリ内の一部ファイルをアップロードしたい場合は
一部ファイルを一時ディレクトリにコピーして、一時ディレクトリごとrオプションで送りましょう。
一時ディレクトリの作成にはmktemp -d temp.XXXを用います。詳しくはmanをご覧下さい。

ファイル数やファイルサイズや帯域に選りますが、今回の案件では5〜6倍程高速化しました。

画像ファイルは既に圧縮済なので無理ですが、テキストファイル等でしたらCオプションを追加する事で圧縮転送も可能です。
転送量低下->高速化となります。

0 件のコメント:

コメントを投稿

つっこみ