大容量ファイルのSCP転送を高速にする方法 (ver.2019)

Keys


9年ほど前にこういうエントリを書いたのですが、まだそれなりに見られているようなので、最近はどうなのかなーと、再検証・再計測してみたエントリーです。

↑の過去エントリにも記載しているのですが、SSH/SCP では暗号化方式(強度)によってファイル転送のスループットが変わります。

もちろん、オープンなネットワークでやるにはセキュリティがー、とか、インターナルでやるなら、そもそも netcat (nc) でいいやんー、とか、そもそも大量にファイル数あるなら、事前に固めてしまえー、とか色々あると思うのですが、本エントリではあくまで暗号化方式 の違いでスループットがどう変化するのか、それはどのくらいスループットが出るのか、を確認したログとなります。

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

  • Google Compute Engine (GCE) の インスタンス (n1-highcpu-4) を2台準備しました
    • 同一リージョン、同一ゾーン、同一ネットワークに配置
  • ファイル転送時の読み出し/書き込みは、RAMディスク (tmpfs) 上に行っています
  • OS は Ubuntu 19.10
    • Linux version 5.3.0-1005-gcp (buildd@lgw01-amd64-001) (gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2))
    • OpenSSH_8.0p1 Ubuntu-6build1, OpenSSL 1.1.1c 28 May 2019
  • 転送するファイルは単一の2GBのファイルを使用
# iperf -c 10.xxx.xxx.12
------------------------------------------------------------
Client connecting to 10.xxx.xxx.12, TCP port 5001
TCP window size:  518 KByte (default)
------------------------------------------------------------
[  3] local 10.xxx.xxx.13 port 55778 connected with 10.xxx.xxx.12 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  9.81 GBytes  8.42 Gbits/sec

2台のサーバで iperf かけるとクラウド上の 10Gbps ネットワーク内にいるかなー、という感じ。

試してみた暗号化方式

"man ssh_config" した感じ、Ubuntu 19.10 では以下をサポートしているみたい。

The supported ciphers are:

       3des-cbc
       aes128-cbc
       aes192-cbc
       aes256-cbc
       aes128-ctr
       aes192-ctr
       aes256-ctr
       aes128-gcm@openssh.com
       aes256-gcm@openssh.com
       chacha20-poly1305@openssh.com

The default is:

       chacha20-poly1305@openssh.com,
       aes128-ctr,aes192-ctr,aes256-ctr,
       aes128-gcm@openssh.com,aes256-gcm@openssh.com

The list of available ciphers may also be obtained using "ssh -Q cipher".


"ssh -Q cipher" してみると、若干違うようですが。

$ ssh -Q cipher
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
rijndael-cbc@lysator.liu.se
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com


今回は検証目的ということで、上記でサポートしている Cipher を使って SSH/SCP 通信できるように、受け側(サーバ側)の sshd (/etc/ssh/sshd_config) に以下の設定を一時的に入れています。

Ciphers 3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com

# 良い子のみんなは真似しないでね...!!

ベンチマーク結果

さて、前回同様、以下のような感じでコマンドを実行しました。

$ scp -c ${cipher} ./filename username@hostname:/ramdisk/


暗号化方式ごとの結果は以下の通りです。
(ざっくりで申し訳ないですが、3回転送して中央値を取っています。)

暗号化方式 (cipher) スループット
3des-cbc 20.7MB/s
aes128-cbc 304.8MB/s
aes192-cbc 271.3MB/s
aes256-cbc 243.6MB/s
rijndael-cbc@lysator.liu.se
(aes256-cbc と同じ)
249.9MB/s
aes128-ctr 353.3MB/s
aes192-ctr 381.4MB/s
aes256-ctr 355.4MB/s
aes128-gcm@openssh.com 503.4MB/s
aes256-gcm@openssh.com 421.7MB/s
chacha20-poly1305@openssh.com 153.2MB/s


さすがに9年前からは、かなり進化が見られる結果となりました。CPU で AES-NI がサポートされた恩恵もあるのでしょう。

上述しましたが、経路のセキュリティ要件にあわせて暗号化方式を選んでいただければとは思いますが、純粋な単一ファイルの転送スピードを見た場合は、こちらの結果となります。

暗号化強度が気になる方は、基本的に OPenSSH のデフォルト設定順である

chacha20-poly1305@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com,aes256-gcm@openssh.com

を意識すればいいのではないかと思います。インターナル (LAN) 内はご自由にどうぞ。

元エントリでは、scp コマンドの圧縮転送 ("-C" オプション) の検証もしていたのですが、個人的に十分な数値が出ているので、一旦割愛しますw


ということで、今日はこの辺まで。本エントリが何かの参考になれば幸いです。

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

参考


OpenSSH[実践]入門 (Software Design plus)

OpenSSH[実践]入門 (Software Design plus)