大容量ファイルのSCP転送を高速にする方法

by Bohman


比較的大きいサイズのファイルをSCPで転送することがあって、できるだけ高速化してみたかったので、色々試してみたメモ。

scpというかsshには、暗号化方式と圧縮有無の指定があるので、それらのベンチマークを。
尚、以下は、SSH v2が対象です。v1はかなり遅かったのと、そもそも使っていないので試していません。

(追記: 2019/11)

本エントリの情報は既に古いため、以下のエントリにて再検証しています。あわせてご覧くださいませ。

ベンチマークで利用した環境

[Server1] <=> [Gigabit Switching Hub] <=> [Server2]
  • Server1 (HP ML115 G5)
    • AMD Phenom 9950, 8GB, RAMディスク使用, Gigabit Ethernet
  • Server2 (HP ML115 G1)
    • AMD Opteron 1210, 4GB, RAMディスク使用, Gigabit Ethernet

※ ディスクI/Oがボトルネックにならないように、RAMディスク(tmpfs)を使いました。

暗号化方式の違いによるベンチマーク

選択できる暗号化方式は、man sshを見る限りは以下のようです。

aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,
arcfour256,arcfour,aes192-cbc,aes256-cbc,aes128-ctr,
aes192-ctr,aes256-ctr

何も指定しないと、デフォルトで"aes128-cbc"が選択されるようです。
尚、厳密には、"/etc/ssh/ssh_config"の"Ciphers"の指定順で優先して、暗号化方式が選択されるようなので、そちらもあわせて確認してみると良いと思います

コマンドの実行例としては以下のような感じです。

$ scp -c aes128-cbc ./filename username@hostname:/tmp


下記の結果は、暗号化方式ごとにSCP転送を行い、サーバ間で1.5GBのファイル(単一)を転送したスループットを測ったものです。

暗号化方式 スループット
aes128-cbc 36.6MB/s
3des-cbc 11.5MB/s
blowfish-cbc 41.7MB/s
cast128-cbc 32.6MB/s
arcfour128 83.3MB/s
arcfour256 83.3MB/s
arcfour 79.0MB/s
aes192-cbc 31.9MB/s
aes256-cbc 28.9MB/s
aes128-ctr 30.6MB/s
aes192-ctr 28.3MB/s
aes256-ctr 25.9MB/s


上記の結果では、arcfour, arcfour128, arcfour256のスループットが断然速い結果となりました。デフォルトの"aes128-cbc"と比較しても2倍以上のスピードが出ています。

ただし、それだけ暗号化によるオーバヘッドがかかっていない、つまり強度的に弱くなっている可能性があるので、選択は慎重に行ってください。イントラネット内等でセキュリティをさほど気にする必要のない場合は、arcfour系の選択でも良いかと思います。(わざわざFTP立てるのもね・・・)
その場合は、"/etc/ssh/ssh_config"の"Ciphers"の先頭に以下のようにarcfour系を、

Ciphers arcfour128,arcfour256,arcfour,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc

な感じで指定しておくとデフォルトでの方式が変更されます。
尚、以降で紹介する転送時に圧縮を行うオプションを使用する事もそうですが、上記は暗号化を行う際にCPUを利用するので、スループットの大小は、サーバのCPUパワーに多少なりと依存します。↑のベンチマークで利用したサーバより高速なCPUを利用すると、もっとスループットは上がると思いますし、低速なCPUだとその逆になるかと思います。

圧縮して転送するとどうなるか

データを圧縮して転送する"-C"オプションを使うとどうなるかを試してみました。manによると圧縮に使われるアルゴリズムはgzipと同じものとのこと。
試してみたのは、以下の3種類の暗号方式のみですが、結論から言うと、経路およびスループットが高速な通信環境の場合は、あまり必要のないオプションと言えそうです。
# ナローバンドのような環境では、また違うのでしょうが。


ちなみに、実行コマンド例としては、以下のような感じです。

$ scp -c aes128-cbc -C ./filename username@hostname:/tmp

700MBの非圧縮ファイルのSCP転送比較

暗号化方式 "-C"有り "-C"無し
aes128-cbc 41.2MB/s 35.0MB/s
3des-cbc 41.2MB/s 11.5MB/s
arcfour 43.8MB/s 77.8MB/s

元々、時間がかかっていた"3des-cbc"に限っては、そこそこ速くなりました。

700MBの圧縮ファイル(gzip)のSCP転送比較

暗号化方式 "-C"有り "-C"無し
aes128-cbc 8.2MB/s 35.5MB/s
3des-cbc 5.6MB/s 11.3MB/s
arcfour 9.3MB/s 75.0MB/s

既に何らかの形で(↑は転送時の圧縮方式と同じgzipというのもあると思うが)圧縮がかかっているものについては、スピードが遅くなる結果となりました。見極めは慎重に。

参考


実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

  • 作者: Daniel J. Barrett,Richard E. Silverman,Robert G. Byrnes,小島肇,坂井順行,鹿田幸治,園田道夫,高橋基信,根津研介,宮本久仁男
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/22
  • メディア: 大型本
  • 購入: 2人 クリック: 79回
  • この商品を含むブログ (48件) を見る