通过 ssh 运行 iperf

通过 ssh 运行 iperf

ubuntu我正在尝试对我没有权限的两台服务器之间的网络连接进行基准测试root

我确实成功下载并启动iperf-2.0.9了两个盒子。

我的问题是我无法打开端口(通过防火墙)。

所以客户端无法连接到服务器。

有什么办法可以通过两者之间的 ssh 连接来完成这项工作吗?转发端口什么的?

任何解决方案将不胜感激!

笔记:我scp来回做了几个文件...但这还远不及iperf能给我的

答案1

iperf 允许用户在三个位置指定端口 - 一个是服务器侦听的端口,一个是客户端连接的位置,还有一个是客户端为-d/--dualtest选项生成迷你服务器的位置。为此,我们需要这三者。

虽然可以用更少的数量来完成此任务,但我发现指定所有端口更容易,这样我就可以更好地跟踪它们。在此设置中,我将假设设置如下所示:

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

“控制盒”也可能可以直接访问 2 号盒上的 SSH,但我们不需要它。为此,框 #2 将是侦听 7001 的 iperf 服务器,框 2 将是侦听端口 7002 的客户端。这些可以是任何可访问的端口,我随机选择了这两个端口。

首先,连接到框 #1。接下来,您需要连接到 Box #2。在此嵌套会话中,您将需要创建两个端口隧道:一个正向和一个反向。执行此操作的 ssh 选项适用-L7001:localhost:7001于正向和-R7002:localhost:7002反向。由于 iperf 期望端口位于远程主机上,因此每个隧道必须是对称的(隧道两端的端口号相同)。然后,启动 iperf 服务器侦听端口 7001 ( iperf -s -p 7001)。

它可能看起来像这样:

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)
------------------------------------------------------------

启动后,打开 Box #1 的第二个会话。在这里,在端口 7001 处启动一个到 localhost 的 iperf 客户端,监听端口位于 7002(默认监听端口是 5001,与服务器一样)。这意味着客户端将尝试连接 localhost:7001 上的 iperf 服务器,SSH 会抓取该服务器并将其发送到框#2。然后,它启动一个“迷你”iperf 服务器,侦听 7002。一旦启动从客户端到服务器的连接,iperf 客户端就会告诉 iperf 服务器在端口 7002 上重新连接。服务器注意到入站连接来自 127.0.0 .0.1(或 ::1,具体取决于配置),因此它将启动一个连接到 127.0.0.1:7002 的“迷你”客户端。因为我们也有反向转发,所以 ssh 也会抢占此连接并将其发送到框 1。

您的第二次会议可能如下所示:

(此示例的旁注:我将不同测试的时间设置为 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 会扭曲感知的连接速度。在相同的两个机器之间运行不带 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 时我错过了一个设置。以单工而不是双工(选项-r/ --tradeoff(单独进行双向测试))运行 iperf 连接得到的结果更接近链路速度,但仍然具有显着的 SSH 开销。

话虽如此,如果您需要在这两台机器之间创建桥梁并测量该桥梁的容量,那么这个解决方案是完美的。如果您尝试测量这些机器之间的原始吞吐量,这些测试提供的数字将小于(并且可能远小于)链接速度。

相关内容