Wifi TCP iperf 吞吐量:1 个流与多个流?

网络工程 无线的 ipv4 通讯协议 测试 iperf
2021-07-19 16:34:55

在 WLAN iperf TCP 吞吐量测试中,多个并行流将比 1 个流提供更高的吞吐量。我尝试增加 TCP 窗口大小,但我仍然无法仅使用 1 个流实现最大吞吐量。TCP 层中是否还有其他东西阻止使用完整的链路容量?

3个回答

在 WLAN iperf TCP 吞吐量测试中,多个并行流将比 1 个流提供更高的吞吐量。我尝试增加 TCP 窗口大小,但我仍然无法仅使用 1 个流实现最大吞吐量。TCP 层中是否还有其他东西阻止使用完整的链路容量?

根据我的经验,如果您看到 1 个 TCP 流和多个 TCP 流之间的结果明显不同,则问题通常是丢包;所以TCP层中的“别的东西”是重传(由于低层丢包)。

我编写的一个例子来说明丢包如何影响单流吞吐量......

                   [Wifi||LAN-0.0%-Loss||LAN-2.0%-Loss]
+--------------+                                        +--------------+
|              |                                        |              |
| Thinkpad-T61 |----------------------------------------| Linux Server |
|              |                                        | Tsunami      |
+--------------+                                        +--------------+
iperf client             ------------------>            iperf server
                             Pushes data

这是一张汇总iperf了客户端和服务器之间60 秒测试结果的表格……您可能会看到 RTT 抖动导致的 iperf 结果略有变化(即更高的 RTT 标准偏差);然而,最显着的差异出现在我模拟离开客户端有线 NIC 的 2% 损失时。172.16.1.56 和 172.16.1.80 是同一台笔记本电脑(运行 Ubuntu)。服务器是 172.16.1.5,运行 Debian。在客户端有线网卡上netem模拟丢包...

Client IP       Transport    Loss     avg RTT    RTT StdDev    TCP Streams   Tput
-----------     ----------   ----     -------    ----------    -----------   ----------
172.16.1.56     802.11g      0.0%      0.016s          42.0              1     19.5Mbps
172.16.1.56     802.11g      0.0%      0.016s          42.0              5     20.5Mbps
172.16.1.80     1000BaseT    0.0%     0.0002s           0.0              1    937  Mbps
172.16.1.80     1000BaseT    0.0%     0.0002s           0.0              5    937  Mbps
172.16.1.80     1000BaseT    2.0%     0.0002s           0.0              1    730  Mbps <---
172.16.1.80     1000BaseT    2.0%     0.0002s           0.0              5    937  Mbps

编辑评论回复

您能解释一下最后一个场景(1000BaseT,5 个流,2.0% 的损失)中发生了什么吗?即使存在数据包丢失,总吞吐量仍然饱和,达到 937 Mbits/sec。

当检测到数据包丢失时,大多数 TCP 实现会减少它们的拥塞窗口由于我们使用netem强制从客户端到服务器丢失 2% 的数据包,因此客户端的一些数据会被丢弃。本示例netem的净效果是单流平均传输速率为 730Mbps。添加多个流意味着各个 TCP 流可以协同工作以使链路饱和。

我的目标是通过 WiFi 实现最高的 TCP 吞吐量。据我了解,我应该增加流的数量,以应对丢包导致的吞吐量下降。这个对吗?

是的

此外,过多的流会在什么时候开始对吞吐量产生负面影响?这是否是由有限的内存和/或处理能力引起的?

如果没有更多的实验,我真的无法回答这个问题,但是对于 1GE 链接,我从来没有遇到过用 5 个并行流使链接饱和的问题。为了让您了解 TCP 的可扩展性如何,Linux 服务器可以在适当的情况下处理1500 多个并发 TCP 套接字这是另一个与扩展并发 TCP 套接字相关的SO 讨论,但在我看来,如果您只是试图使链接饱和,那么超过 20 个并行套接字的任何内容都将是矫枉过正。

我一定有一个误解,即 iperf 使用 -w 窗口大小作为最大值,因为听起来您是说它超出了 21K 初始值

我没有使用iperf -w,所以我认为有一个误解。由于您对 wifi 案例有很多问题,因此我在 wifi 单 TCP 流案例中包含了 TCP 吞吐量的 wireshark 图。

Wifi TCP 单流吞吐量


测试数据

我还包括原始测试数据,以防您想看看我是如何测量这些东西的……

802.11g,1 个 TCP 流

mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report \
  --report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61       Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 172.16.1.5                 0.0%    60    0.8  16.0   0.7 189.4  42.0
mpenning@mpenning-ThinkPad-T61:~$

[mpenning@tsunami]$ iperf -s -p 9000 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9000 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9000
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 172.16.1.56 port 40376 connected with 172.16.1.5 port 9000
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.1 sec   139 MBytes  19.5 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

802.11g,5 个 TCP 流

[mpenning@tsunami]$ iperf -s -p 9001 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9001 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 172.16.1.56 port 37162 connected with 172.16.1.5 port 9001
[  5] local 172.16.1.56 port 37165 connected with 172.16.1.5 port 9001
[  7] local 172.16.1.56 port 37167 connected with 172.16.1.5 port 9001
[  4] local 172.16.1.56 port 37163 connected with 172.16.1.5 port 9001
[  6] local 172.16.1.56 port 37166 connected with 172.16.1.5 port 9001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  28.0 MBytes  3.91 Mbits/sec
[  5]  0.0-60.1 sec  28.8 MBytes  4.01 Mbits/sec
[  4]  0.0-60.3 sec  28.1 MBytes  3.91 Mbits/sec
[  6]  0.0-60.4 sec  34.0 MBytes  4.72 Mbits/sec
[  7]  0.0-61.0 sec  30.5 MBytes  4.20 Mbits/sec
[SUM]  0.0-61.0 sec   149 MBytes  20.5 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

1000BaseT, 1 Stream, 0.0% 损失

mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report \
>   --report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61       Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 172.16.1.5                 0.0%    60    0.2   0.2   0.2   0.2   0.0
mpenning@mpenning-ThinkPad-T61:~$

[mpenning@tsunami]$ iperf -s -p 9002 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9002 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9002
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  3] local 172.16.1.80 port 49878 connected with 172.16.1.5 port 9002
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  6.54 GBytes   937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

1000BaseT,5 个流,0.0% 损失

[mpenning@tsunami]$ iperf -s -p 9003 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9003 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9003
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  7] local 172.16.1.80 port 47047 connected with 172.16.1.5 port 9003
[  3] local 172.16.1.80 port 47043 connected with 172.16.1.5 port 9003
[  4] local 172.16.1.80 port 47044 connected with 172.16.1.5 port 9003
[  5] local 172.16.1.80 port 47045 connected with 172.16.1.5 port 9003
[  6] local 172.16.1.80 port 47046 connected with 172.16.1.5 port 9003
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-60.0 sec  1.28 GBytes   184 Mbits/sec
[  5]  0.0-60.0 sec  1.28 GBytes   184 Mbits/sec
[  3]  0.0-60.0 sec  1.28 GBytes   183 Mbits/sec
[  6]  0.0-60.0 sec  1.35 GBytes   193 Mbits/sec
[  7]  0.0-60.0 sec  1.35 GBytes   193 Mbits/sec
[SUM]  0.0-60.0 sec  6.55 GBytes   937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

1000BaseT, 1 Streams, 2.0% 损失

mpenning@mpenning-ThinkPad-T61:~$ sudo tc qdisc add dev eth0 root netem corrupt 2.0%

mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report   --report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61       Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 172.16.1.5                 1.7%    60    0.2   0.2   0.2   0.2   0.0
mpenning@mpenning-ThinkPad-T61:~$

[mpenning@tsunami]$ iperf -s -p 9004 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9004 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9004
TCP window size: 42.0 KByte (default)
------------------------------------------------------------
[  3] local 172.16.1.80 port 48910 connected with 172.16.1.5 port 9004
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-64.1 sec  5.45 GBytes   730 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

1000BaseT,5 个流,2.0% 的损失

[mpenning@tsunami]$ iperf -s -p 9005 -B 172.16.1.5

mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9005 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9005
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  7] local 172.16.1.80 port 50616 connected with 172.16.1.5 port 9005
[  3] local 172.16.1.80 port 50613 connected with 172.16.1.5 port 9005
[  5] local 172.16.1.80 port 50614 connected with 172.16.1.5 port 9005
[  4] local 172.16.1.80 port 50612 connected with 172.16.1.5 port 9005
[  6] local 172.16.1.80 port 50615 connected with 172.16.1.5 port 9005
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  1.74 GBytes   250 Mbits/sec
[  7]  0.0-60.0 sec   711 MBytes  99.3 Mbits/sec
[  4]  0.0-60.0 sec  1.28 GBytes   183 Mbits/sec
[  6]  0.0-60.0 sec  1.59 GBytes   228 Mbits/sec
[  5]  0.0-60.0 sec  1.24 GBytes   177 Mbits/sec
[SUM]  0.0-60.0 sec  6.55 GBytes   937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$

去除丢包模拟

mpenning@mpenning-ThinkPad-T61:~$ sudo tc qdisc del dev eth0 root

这是单个 tcp 流的最大吞吐量的计算。

(TCP Window [bytes]/RTT[seconds]) * 8 [bits/byte] = Max single tcp throughput in (bps)

所以你有一个瓶颈,延迟起着很大的作用。

这可能是由于多个进程与一个进程。使用 iperf 2.0.9 可以在客户端通过 -P 2 进行测试。这将分叉两个线程而不是一个。大多数现代 CPU 具有多个内核,因此使用多线程将能够利用它们。