我的问题是:为什么在智能交换机上设置链路聚合组会降低两台机器之间的带宽?
我终于在两台机器(运行 ubuntu 18.04 服务器的服务器)之间通过 TP-LINK T1700X-16TS 智能交换机通过 2 条绑定 10G CAT7 电缆连接实现了更高的吞吐量(带宽)。这些电缆连接到每台机器中的单个英特尔 X550-T2 NIC(每张卡上有 2 个 RJ45 端口),该网卡插入 PCI-E x8。
我做的第一件事是在交换机配置中创建静态 LAG 组,其中包含每台计算机连接到的两个端口。这最终成为我的第一个错误。
在每个盒子上,创建一个包含 intel X550-T2 卡上的两个端口的绑定。我正在使用 netplan (和网络)。例如:
network:
ethernets:
ens11f0:
dhcp4: no
optional: true
ens11f1:
dhcp4: no
optional: true
bonds:
bond0:
mtu: 9000 #1500
dhcp4: no
interfaces: [ens11f0,ens11f1]
addresses: [192.168.0.10/24]
parameters:
mode: balance-rr
transmit-hash-policy: layer3+4 #REV: only good for xor ?
mii-monitor-interval: 1
packets-per-slave: 1
请注意 9000 字节 MTU(用于巨型数据包)和balance-rr。
有了这些设置,我现在可以使用 iperf (iperf3) 来测试机器之间的带宽:
iperf3 -s (on machine1)
iperf3 -c machine1 (on machine2)
我得到的速度约为每秒 9.9 Gbits(非常接近单个 10G 连接的理论最大值)
但有些不对劲。我使用循环法,并且机器之间有两根 10G 电缆(理论上)。我应该可以获得20G带宽吧?
错误的。
奇怪的是,我接下来从智能交换机中删除了 LAG 组。现在,在 Linux 端,我有绑定接口,但对于交换机,没有绑定(没有 LAG)。
现在我再次运行 iperf3:
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 1.77 GBytes 15.2 Gbits/sec 540 952 KBytes
[ 4] 1.00-2.00 sec 1.79 GBytes 15.4 Gbits/sec 758 865 KBytes
[ 4] 2.00-3.00 sec 1.84 GBytes 15.8 Gbits/sec 736 454 KBytes
[ 4] 3.00-4.00 sec 1.82 GBytes 15.7 Gbits/sec 782 507 KBytes
[ 4] 4.00-5.00 sec 1.82 GBytes 15.6 Gbits/sec 582 1.19 MBytes
[ 4] 5.00-6.00 sec 1.79 GBytes 15.4 Gbits/sec 773 708 KBytes
[ 4] 6.00-7.00 sec 1.84 GBytes 15.8 Gbits/sec 667 1.23 MBytes
[ 4] 7.00-8.00 sec 1.77 GBytes 15.2 Gbits/sec 563 585 KBytes
[ 4] 8.00-9.00 sec 1.75 GBytes 15.0 Gbits/sec 407 839 KBytes
[ 4] 9.00-10.00 sec 1.75 GBytes 15.0 Gbits/sec 438 786 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 17.9 GBytes 15.4 Gbits/sec 6246 sender
[ 4] 0.00-10.00 sec 17.9 GBytes 15.4 Gbits/sec receiver
呵呵,现在我的速度为 15.4 Gbits/秒(有时高达 16.0)。
重新发送让我很担心(当我设置 LAG 时,我的发送结果为零),但现在我至少获得了一些优势。
请注意,如果我禁用巨型数据包或将 MTU 设置为 1500,我只能获得大约 4Gbps 到 5Gbps。
有谁知道为什么在智能交换机上设置链路聚合组(我认为这应该有所帮助),而不是限制性能?另一方面,不设置它们(哎呀,我本来可以省钱并购买非托管交换机!)让我发送更多正确路由的数据包?
交换机的 LAG 组有什么意义?我在某个地方做错了什么吗?如果可能的话,我希望将带宽增加到 16Gbps 以上。
编辑
复制下面我的评论(更新):
我通过绑定连接验证了实际应用程序的速度为 11Gbps(1.25 GiB/秒),使用 nc (netcat) 将 60 GB 文件从一个系统上的 ramdisk 复制到另一个系统上。我使用哈希验证了文件完整性,双方都是相同的文件。
一次仅使用 10G 端口之一(或使用平衡异或等绑定),我得到 1.15 GiB/秒(约 9.9 Gbps)。 iperf 和 nc 默认情况下都使用 TCP 连接。将其复制到本地计算机(通过环回)的速度为 1.5 GiB/秒。查看交换机上的端口使用情况,我发现发送方 Tx 端的使用情况大致相同(在 iperf 的情况下为 70%,在 nc 文件复制的情况下约为 55%),并且在 2 个绑定端口之间的使用情况相同接收端。
因此,在当前设置(balance-rr、MTU 9000、交换机上未定义 LAG 组)中,我可以实现超过 10Gbps,但也只是勉强达到。
奇怪的是,在交换机上定义 LAG 组现在会破坏一切(iperf 和文件传输现在发送 0 字节)。可能只是需要时间来找出新的开关情况,但我重新运行了很多次并重新启动/重置了开关几次。所以,我不确定这是为什么。
编辑2
实际上,我在 kernel.org 文档中发现了条带化和balance-rr 允许高于单端口带宽的提及。
https://www.kernel.org/doc/Documentation/networking/bonding.txt
具体来说
12.1.1 单开关拓扑的 MT 绑定模式选择
尽管您必须决定哪种绑定模式最适合您的需求,但此配置最容易设置和理解。每种模式的权衡详细如下:
Balance-rr:此模式是唯一允许单个 TCP/IP 连接跨多个接口对流量进行条带化的模式。因此,它是唯一允许单个 TCP/IP 流利用多个接口吞吐量的模式。然而,这是有代价的:条带化通常会导致对等系统无序接收数据包,从而导致 TCP/IP 的拥塞控制系统启动(通常是通过重新传输数据段)。
可以通过更改 net.ipv4.tcp_reordering sysctl 参数来调整 TCP/IP 的拥塞限制。通常的默认值是 3。但请记住,TCP 堆栈在检测到重新排序时能够自动增加此值。
请注意,无序传送的数据包比例变化很大,并且不可能为零。重新排序的级别取决于多种因素,包括网络接口、交换机和配置的拓扑。一般来说,高速网卡会产生更多的重新排序(由于数据包合并等因素),并且“多对多”拓扑将以比“多慢到一快”配置更高的速率重新排序。
许多交换机不支持任何条带流量模式(而是根据 IP 或 MAC 级别地址选择端口);对于这些设备,流经交换机到balance-rr 绑定的特定连接的流量将不会使用超过一个接口的带宽。
如果您使用的是 TCP/IP、UDP 等协议,并且您的应用程序可以容忍无序交付,则此模式可以允许单流数据报性能随着接口添加到绑定而近乎线性地扩展。
此模式要求交换机将适当的端口配置为“etherchannel”或“trunking”。
所以,理论上,balance-rr将要允许我对单个 TCP 连接的数据包进行条带化。但是,它们可能会无序到达,等等。
但是,它提到大多数交换机不支持条带化。我的交换机似乎就是这种情况。观察实际文件传输期间的流量,Rx 数据包(即发送机器->交换机)均匀分布在两个绑定端口上。然而,Tx 数据包(交换机 -> 接收机器)仅通过其中一个端口发出(并达到 90% 或更高的饱和度)。
通过不在交换机中明确设置链路聚合组,我能够实现更高的吞吐量,但我不确定接收计算机如何告诉交换机将一个端口发送到一个端口,然后发送到另一个端口,等等。
结论:
交换机链路聚合组不支持循环(即端口条带化)发送数据包。因此,忽略它们可以让我获得高吞吐量,但实际写入内存(ramdisk)似乎达到了内存、CPU 处理或数据包重新排序饱和点。
我尝试使用 sysctl 增加/减少重新排序以及读写 TCP 内存缓冲区,但性能没有变化。例如
sudo sysctl -w net.ipv4.tcp_reordering=50
sudo sysctl -w net.ipv4.tcp_max_reordering=1000
sudo sysctl -w net.core.rmem_default=800000000
sudo sysctl -w net.core.wmem_default=800000000
sudo sysctl -w net.core.rmem_max=800000000
sudo sysctl -w net.core.wmem_max=800000000
sudo sysctl -w net.ipv4.tcp_rmem=800000000
sudo sysctl -w net.ipv4.tcp_wmem=800000000
我注意到的唯一性能变化是在以下机器之间:
1)更强的处理器(单核时钟稍高,不关心 L3 缓存)
2)更快的内存? (或相同容量的内存使用更少的 DIMM)
这似乎意味着我正在执行总线、CPU 或内存读/写操作。在 ramdisk 中进行本地简单的“复制”(例如 dd if=file1 of=file2 bs=1M)可实现 2.6 Ghz 上大约 2.3GiB/秒、2.4 Ghz 上 2.2GiB/秒、以及 2.0GiB/秒 的最佳速度。 2.2GHz。第二个的记忆力也较慢,但这似乎并不重要。
所有 TCP 副本从较慢的机器到 2.6 Ghz ramdisk 的速度为 1.15 GiB/s,从 2.4 Ghz 的速度为 1.30 GiB/s,从最快的机器到中间机器的速度为 1.02 GiB/s,到较慢的机器(具有更快的内存) 1.03 GiB/s 等
影响最大的似乎是接收端的单核 CPU 和内存时钟。我没有比较BIOS设置,但它们都运行相同的BIOS版本并使用相同的主板、eth卡等。重新排列CAT7电缆或交换机端口似乎没有效果。
我确实找到了
http://louwrentius.com/achieving-340-mbs-network-file-transfers-using-linux-bonding.html
谁用四个 1GbE 连接来执行此操作。我尝试设置单独的VLAN,但它不起作用(没有提高速度)。
最后,使用相同的方法发送给 self 似乎会导致 0.3 GiB - 0.45 GiB/秒的损失。所以,我观察到的值不是那远低于该方法的“理论”最大值。
编辑3 (为后代添加更多信息)
即使在交换机上设置了balance-rr和LAG,我也意识到尽管看到了9.9 Gbps,但balance-rr中的重试次数实际上比没有LAG的情况要高!有组时平均每秒 2500 次,无组时平均每秒 1000 次!
但是,设置组后,内存间的平均实际文件传输速度为 1.15 GiB/s (9.9 Gbps)。如果我只在每台机器上插入一个端口,我会看到相同的速度(1.15 GiB/s),并且很少重试。如果我将模式切换为平衡异或,我将获得 1.15 GiB/s (9.9 Gbps),并且不会重新发送。因此,balance-rr 模式试图在输出上进行条带化以切换事物的一侧,我猜这会导致大量乱序数据包。
由于使用交换机 LAG 和平衡异或,内存到内存传输的最大(真实世界)性能相似或更高,同时重新发送(拥塞)较少,因此我正在使用它。然而,由于最终目标是 NFS 和 MPI 发送,因此我需要以某种方式找到一种方法来饱和并测量这些情况下的网络速度,这可能取决于 MPI 连接的实现方式......
最终编辑
我重新使用balance-rr(在交换机端没有设置LAG),因为XOR将始终散列到相同的两个对等点的相同端口。因此它只会使用其中一个端口。使用balance-rr,如果我同时运行2个或更多(RAM到RAM)文件传输,我可以获得18-19 Gbps的净速度,非常接近20 Gbps的理论最大值。
最终最终编辑(使用几个月后)
我必须在交换机中设置 LAG 组,因为我遇到了错误,无法再通过 SSH 连接到机器,我猜是因为数据包在它们应该与某些寻址内容一起去的地方变得混乱。现在,我只能获得每个连接的最大 10GBPS,但它很稳定。
答案1
我认为您的文字中有几点可以澄清您的想法:
- 您如此随意地提到您正在正常帧和巨型帧之间切换的事实令我感到担忧。您不能在同一网络/网络块中混合使用巨型帧和常规帧。整个网络要么传输巨型帧,要么传输普通帧,我的意思是全部该网络中的接口。
- 如果你有一个聚合链路,你就必须在两侧都有它,无论是在交换机端还是在系统端;其他令人讨厌的事情可能而且将会发生;幸运的是,在最好的情况下,交换机将检测到环路并仅禁用其中一个链路;
- 如果你想要速度,你需要链路聚合,而不是负载平衡;
- 单个 UDP(主要是 TCP)连接在达到一定阈值后不会有太大扩展;您需要测试多个同时连接。
iperf
让你这样做; - 在这些速度下,在处理两个链路与一个链路上的链路聚合时,您可能会遇到其他限制因素,尤其是中断处理。
至于交换机,我对TP-LINK了解不多,这里进入交换机话题属于题外话。我只想留下这样一个想法:如果您专业工作,您最好使用更多顶级设备,以获得更深奥的功能或高性能网络的更好结果。
查看相关如何知道我的服务器是否应该使用巨型帧(MTU)以及相关的是否可以在 VM 计算机上设置巨型帧 - MTU=9000?
至于在同一 VLAN/接口组中混合 9000 和 1500:
如果服务器向客户端传输的数据包在给定配置中大于 1500 字节,则该数据包将被简单地丢弃而不进行处理,这与分段不同
执行此操作时,请确保您的 NIC 存在于单独的网络块中。如果您使用 Linux,数据包将通过网络块中系统中的第一个 NIC 进行路由,因此,即使 eth1 的 MTU 为 9000,它最终也可能会通过 eth0 路由这些数据包。
我们为存储网络设置了一个单独的 VLAN,并且必须在 eth1 上设置一个单独的网络块以避免这种行为。将 MTU 增加到 9000 可以轻松提高吞吐量,因为该特定系统处理流式传输大量相当大的文件。
答案2
正如我在最终编辑中提到的,当交换机设置了链路聚合组时,我无法使用循环绑定获得更高的带宽,因为交换机链路聚合组不会对单个数据包进行循环剥离。 TCP 连接,而 linux 绑定则如此。 kernel.org 文档中提到了这一点:
https://www.kernel.org/doc/Documentation/networking/bonding.txt
12.1.1 单开关拓扑的 MT 绑定模式选择
尽管您必须决定哪种绑定模式最适合您的需求,但此配置最容易设置和理解。每种模式的权衡详细如下:
Balance-rr:此模式是唯一允许单个 TCP/IP 连接跨多个接口对流量进行条带化的模式。因此,它是唯一允许单个 TCP/IP 流利用多个接口吞吐量的模式。然而,这是有代价的:条带化通常会导致对等系统无序接收数据包,从而导致 TCP/IP 的拥塞控制系统启动(通常是通过重新传输数据段)。
可以通过更改 net.ipv4.tcp_reordering sysctl 参数来调整 TCP/IP 的拥塞限制。通常的默认值是 3。但请记住,TCP 堆栈在检测到重新排序时能够自动增加此值。
请注意,无序传送的数据包比例变化很大,并且不可能为零。重新排序的级别取决于多种因素,包括网络接口、交换机和配置的拓扑。一般来说,高速网卡会产生更多的重新排序(由于数据包合并等因素),并且“多对多”拓扑将以比“多慢到一快”配置更高的速率重新排序。
许多交换机不支持任何条带流量模式(而是根据 IP 或 MAC 级别地址选择端口);对于这些设备,流经交换机到balance-rr 绑定的特定连接的流量将不会使用超过一个接口的带宽。
如果您使用的是 TCP/IP、UDP 等协议,并且您的应用程序可以容忍无序交付,则此模式可以允许单流数据报性能随着接口添加到绑定而近乎线性地扩展。
此模式要求交换机将适当的端口配置为“etherchannel”或“trunking”。
关于将端口配置为“中继”的最后一个注意事项很奇怪,因为当我在 LAG 中创建端口时,来自交换机的所有传出 Tx 都会通过单个端口。删除 LAG 会使其在每个端口上发送和接收各半,但会导致多次重新发送,我认为是由于数据包乱序所致。然而,我的带宽仍然有所增加。