scpコマンドとPiping Serverの転送の速度は同じくらい
測定法と結果表
500MBという名前でランダムな500MBのファイルを用意して送った。
(ゼロ埋めだと圧縮ロジックのある転送時に速度が変わってしまうのでランダムを使う。)
table:結果
scp 1m19.619s
Piping Server 1m19.036s
以下に、詳細。
code:bash
tmp$ time scp 500MB hogehogeio:/mypath 500MB 100% 500MB 6.4MB/s 01:17
real 1m19.619s
user 0m2.240s
sys 0m1.058s
受信先でGETを先にしてからtime curl -T ...で計測。
code:bash
INFO Waiting for 1 receiver(s)... INFO 1 receiver(s) has/have been connected. INFO Start sending with 1 receiver(s)! real 1m19.036s
user 0m0.315s
sys 0m0.739s
送信者・受信者の環境
code:送信者curlバージョン
$ curl --version
curl 7.65.1 (x86_64-apple-darwin16.7.0) libcurl/7.65.1 SecureTransport zlib/1.2.8
Release-Date: 2019-06-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile libz NTLM NTLM_WB SSL UnixSockets
code:受信者curlバージョン
$ curl --version
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
(どちらもHTTP/1.1で送受信している)
思うこと
経由する分と
がネックになりそうと思う。ただよくある「推測するな計測せよ。」みたいなこと。この調査であんまりネックにならないことが分かる。
HTTP自体ほんの数バイトのヘッダがあるだけで、ボディの部分はただのバイナリが直接乗っかる仕様のはずで(Transfer-Encoding: chunkedとかでなければ)、オーバーヘッドはほとんどないのではないかと思っていたことが、ちゃんと実際に確かめられた。言い換えれば、Piping Serverで通信するときのHTTPヘッダは通信の最初の一瞬の出来事に過ぎず、あとはボディがストリーミングされるため、影響はないということ。scpの利点はエンドツーエンドで暗号化できるところもあるので、(Piping ServerもHTTPSで送信者<->サーバー間、サーバー<->受信者間は暗号化される)、パイプに暗号化するコマンドを挟むと速度は変わる可能性はある。ただしストリーミングしながら暗号化できるので(opensslコマンドとか)、送信者のマシンスペックが、ネットワークの転送速度を上回れば、同等の速度を出せるかもしれない(←推測するな推定せよ)。