ssh 経由で iperf を実行する

ssh 経由で iperf を実行する

ubuntu権限のない2 つのサーバー間のネットワーク接続のベンチマークを試みていますroot

iperf-2.0.9両方のボックスでダウンロードして起動することができました。

問題は、(ファイアウォール経由で)ポートを開くことができないことです。

そのため、クライアントはサーバーに接続できません。

2 つの間の ssh 接続を介してこれを動作させる方法はありますか? ポートを転送するか何か?

どのような解決策でも大歓迎です!

注記: ファイルを何度もやり取りしましたが、それでも私が得たscpものには遠く及びませんiperf

答え1

iperf を使用すると、ユーザーは 3 つの場所でポートを指定できます。1 つはサーバーがリッスンする場所、1 つはクライアントが接続する場所、もう 1 つはクライアントが-d/--dualtestオプション用のミニ サーバーを生成する場所です。このためには 3 つすべてが必要です。

より少ないポート数で実行することも可能ですが、すべてのポートを指定する方が追跡しやすいことがわかりました。このセットアップでは、次のようなセットアップを想定します。

-----------            -------          -------
| Control |  SSH #1,2  | Box |  SSH #3  | Box |
|   Box   | ---------> | #1  | -------> | #2  |
-----------            -------          -------

「コントロール ボックス」はボックス #2 の SSH に直接アクセスできる場合もありますが、これは必要ありません。この場合、ボックス #2 は 7001 でリッスンする iperf サーバーになり、ボックス 2 はポート 7002 でリッスンするクライアントになります。これらはアクセス可能な任意のポートにすることができますが、私はこれら 2 つをランダムに選択しました。

まず、ボックス #1 に接続します。次に、ボックス #2 に接続する必要があります。このネストされたセッションでは、2 つのポート トンネル (1 つはフォワード、もう 1 つはリバース) を作成する必要があります。これを行う ssh オプションは、-L7001:localhost:7001フォワード用と-R7002:localhost:7002リバース用です。iperf はポートがリモート ホスト上にあることを想定しているため、各トンネルは対称的 (トンネルの両端で同じポート番号) である必要があります。次に、ポート 7001 ( iperf -s -p 7001) でリッスンする iperf サーバーを起動します。

次のようになります:

me@control$ ssh box1.example.com
box1$ ssh -L7001:localhost:7001 -R7002:localhost:7002 box2.example.com
box2$ iperf -s -p 7001
------------------------------------------------------------
Server listening on TCP port 7001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

それが開始したら、ボックス #1 への 2 番目のセッションを開きます。ここで、ポート 7001 で localhost への iperf クライアントを開始し、リッスンバック ポートを 7002 に設定します (デフォルトのリッスンバック ポートは、サーバーと同様に 5001 です)。つまり、クライアントは localhost:7001 の iperf サーバーに接続しようとし、SSH がそれを取得してボックス #2 に送信します。次に、7002 でリッスンする「ミニ」 iperf サーバーを開始します。クライアントからサーバーへの接続が開始されると、iperf クライアントは iperf サーバーにポート 7002 で接続するように指示します。サーバーは、着信接続が 127.0.0.1 (または構成によっては ::1) から来ていることを認識し、127.0.0.1:7002 に接続する「ミニ」クライアントを開始します。逆転送も設定されているため、ssh はこの接続もスナップ アップしてボックス 1 に送信します。

2 回目のセッションは次のようになります。

(この例の補足: 別のテストでは時間を 30 秒に設定しましたが、デフォルトで十分です)

me@control$ ssh box1.example.com
box1$ iperf -c localhost -p 7001 -L 7002 -d -t 30
------------------------------------------------------------
Server listening on TCP port 7002
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to localhost, TCP port 7001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[  3] local 127.0.0.1 port 37014 connected with 127.0.0.1 port 7001
[  5] local 127.0.0.1 port 7002 connected with 127.0.0.1 port 51806
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec  1.26 GBytes   361 Mbits/sec
[  5]  0.0-30.2 sec  1.23 GBytes   349 Mbits/sec

クライアントのテストが終了すると、サーバー ウィンドウは次のようになります。

...
box2$ iperf -s -p 7001
------------------------------------------------------------
Server listening on TCP port 7001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 127.0.0.1 port 7001 connected with 127.0.0.1 port 41997
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 7002
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[  6] local 127.0.0.1 port 46864 connected with 127.0.0.1 port 7002
[ ID] Interval       Transfer     Bandwidth
[  6]  0.0-30.0 sec  1.23 GBytes   351 Mbits/sec
[  4]  0.0-30.2 sec  1.26 GBytes   359 Mbits/sec

警告:SSH は、認識される接続速度を歪めます。同じ 2 つのボックス間で SSH を使用せずに iperf を実行すると、次の結果が得られました (ボックスは同じ役割です)。

クライアント:

box1$ iperf -c box2.example.com -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to box2.example.com, TCP port 5001
TCP window size:  306 KByte (default)
------------------------------------------------------------
[  3] local 172.20.0.1 port 45722 connected with 172.20.0.2 port 5001
[  5] local 172.20.0.1 port 5001 connected with 172.20.0.2 port 60909
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.01 GBytes   866 Mbits/sec
[  5]  0.0-10.0 sec   823 MBytes   689 Mbits/sec

サーバ:

box2$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 172.20.0.2 port 5001 connected with 172.20.0.1 port 45722
------------------------------------------------------------
Client connecting to 172.20.0.1, TCP port 5001
TCP window size:  306 KByte (default)
------------------------------------------------------------
[  6] local 172.20.0.2 port 60909 connected with 172.20.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  6]  0.0-10.0 sec   823 MBytes   690 Mbits/sec
[  4]  0.0-10.0 sec  1.01 GBytes   864 Mbits/sec

TCP ウィンドウ設定、バッファの長さ、TCP_NODELAY を変更したり、複数の SSH セッションを使用したりしてみましたが、オーバーヘッドは依然として存在していました。HPN-SSH も試しましたが、実際には通常の SSH よりもパフォーマンスが向上したため、HPN の設定時に設定を見逃したのではないかと思います。iperf 接続をデュプレックスではなくシンプレックスで実行すると (オプション-r/ --tradeoff(双方向テストを個別に実行))、リンク速度に近い結果が得られましたが、それでも SSH のオーバーヘッドは依然としてかなりありました。

そうは言っても、これら 2 台のマシン間にブリッジを作成し、そのブリッジの容量を測定する必要がある場合は、このソリューションが最適です。これらのマシン間の生のスループットを測定しようとしている場合、これらのテストで提供される数値はリンク速度よりも少なくなります (おそらくはるかに少なくなります)。

関連情報