TL; DRバージョン
このASCIIキャストまたはこのビデオをご覧ください。次に、これが発生する理由を考えてください。次のテキスト説明は、より多くのコンテキストを提供します。
セットアップの詳細
- マシン1はArch Linuxラップトップであり、その上に
ssh
Armbian実行SBC(オレンジPIゼロ)に接続されます。 - SBC自体はイーサネット経由でDSLルーターに接続され、192.168.1.150のIPを持っています
- ラップトップはWiFi経由でルーターに接続されます-公式のRaspberry PI WiFiドングルを使用します。
- イーサネット経由でDSLルーターに接続された別のラップトップ(マシン2)もあります。
iperf3によるリンクのベンチマーク
でベンチマークするとiperf3
、ラップトップとSBC間のリンクは理論上の56 MBits / sec未満です。これは、非常に「混雑した2.4GHz」(アパート)内のWiFi接続であるためです。
具体的iperf3 -s
には、SBCで実行した後、ラップトップで次のコマンドが実行されます。
# iperf3 -c 192.168.1.150
Connecting to host 192.168.1.150, port 5201
[ 5] local 192.168.1.89 port 57954 connected to 192.168.1.150 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 2.99 MBytes 25.1 Mbits/sec 0 112 KBytes
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 28.0 MBytes 23.5 Mbits/sec 5 sender
[ 5] 0.00-10.00 sec 27.8 MBytes 23.4 Mbits/sec receiver
iperf Done.
# iperf3 -c 192.168.1.150 -R
Connecting to host 192.168.1.150, port 5201
Reverse mode, remote host 192.168.1.150 is sending
[ 5] local 192.168.1.89 port 57960 connected to 192.168.1.150 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 3.43 MBytes 28.7 Mbits/sec
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 39.2 MBytes 32.9 Mbits/sec 375 sender
[ 5] 0.00-10.00 sec 37.7 MBytes 31.6 Mbits/sec receiver
したがって、基本的に、SBCへのアップロードは約24MBits /秒に達し、そこからのダウンロード(-R
)は32MBits /秒に達します。
SSHによるベンチマーク
それを踏まえて、SSHの運命を見てみましょう。rsync
andの使用時に、この投稿につながった問題を最初に経験しましたborgbackup
-両方ともトランスポートレイヤーとしてSSHを使用しています。
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
20.3MiB 0:00:52 [ 315KiB/s] [ 394KiB/s]
まあ、それはひどい速度です!はるかに遅い予想されるリンク速度よりも...
(ケースで、あなたは気づいていないpv -ptevar
:それは、それを通過するデータの現在および平均レートを表示します。このケースでは、私たちが見ることからの読み取り/dev/urandom
およびSBCにSSH経由でデータを送信します平均で400KB / sに達します。つまり、3.2MBits / secで、予想される24MBits / secよりもはるかに少ない数値です。
リンクが容量の13%で実行されているのはなぜですか?
おそらく私/dev/urandom
たちのせいですか?
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
いや、絶対に違います。
SBC自体でしょうか?おそらく処理するには遅すぎますか?同じSSHコマンド(つまり、SBCにデータを送信)を実行してみますが、今回はイーサネット経由で接続されている別のマシン(マシン2)から実行します。
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
240MiB 0:00:31 [10.7MiB/s] [7.69MiB/s]
いいえ、これは正常に動作します-SBC上のSSHデーモンは、イーサネットリンクが提供する11MBytes / sec(つまり100MBits / sec)を(簡単に)処理できます。
これを行っている間、SBCのCPUはロードされますか?
いや。
そう...
- ネットワークごとに(ごとに
iperf3
)10倍の速度を実現できるはずです - CPUは負荷に簡単に対応できます
- ...そして、他の種類のI / O(ドライブなど)は含まれません。
一体何が起こっているのですか?
NetcatとProxyCommandによる救助
昔ながらのnetcat
接続を試してみましょう-期待通りの速度で実行されますか?
SBCで:
# nc -l -p 9988 | pv -ptebar > /dev/null
ラップトップで:
# cat /dev/urandom | pv -ptebar | nc 192.168.1.150 9988
117MiB 0:00:33 [3.82MiB/s] [3.57MiB/s]
できます!そして、予想通りの速度-はるかに良い、10倍の速度-で動作します。
ProxyCommandを使用してncを使用してSSHを実行するとどうなりますか?
# cat /dev/urandom | \
pv -ptebar | \
ssh -o "Proxycommand nc %h %p" root@192.168.1.150 'cat >/dev/null'
101MiB 0:00:30 [3.38MiB/s] [3.33MiB/s]
動作します!10倍の速度。
今、私は少し混乱しています-「裸」をnc
として使用するProxycommand
場合、基本的にSSHとまったく同じことをしていませんか?すなわち、ソケットを作成し、SBCのポート22に接続してから、SSHプロトコルをシャベルでシャベルしますか?
結果として生じる速度にこのような大きな違いがあるのはなぜですか?
PSこれは学術的な演習ではありませんでしたborg
。このため、バックアップの実行速度は10倍速くなりました。なぜか分からない:-)
編集:ここにプロセスの「ビデオ」を追加しました。ifconfigの出力から送信されたパケットをカウントすると、両方のテストで40MBのデータを送信し、約30Kパケットで送信していることが明らかですProxyCommand
。
nc
バッファリングssh
がないのに対して、ラインバッファリングを使用すると思います。そのため(またはその場合)、sshトラフィックにはより多くのパケットが含まれます。