我正在调试存储转发千兆交换机中 UDP 数据包丢失的情况,我想直观地了解交换机内部发生的情况,以便更好地了解问题的本质。
场景很简单 - 两个突发数据流通过交换机内部的两个端口,并且都希望通过第三个端口(两个端口共用)离开交换机。因此,交换机需要在数据包缓冲区中保留一些数据一段时间。
问题是:根据我的简单计算,缓冲区应该足够大,可以处理我正在检查的情况。一个数据流每 1.56 毫秒发送 25 kB 的突发数据(分为 1514 B 数据包),另一个数据流每 1 毫秒发送 60 kB 的突发数据。现在,即使是像 Netgear GS105E 这样的小型交换机也有 128 kB 大小的缓冲区。因此,简单的数学运算(25+60 < 128)表明,即使流同时进入,它也应该可以工作(假设没有其他大量流量)。
实际测试表明,一些交换机上两个流的大量数据包都会丢失(这似乎与缓冲区大小有关,但不仅仅是缓冲区大小)。在我的模拟中,当设置为 128 kB 时,我无法使缓冲区溢出。
我为 24 kB 大小的缓冲区录制了这个动画,其中存在溢出。但是,您可以轻松看到,只需将缓冲区增加几个字节即可解决问题,所有数据包都会通过。
我在这个模拟中做了一些简化。所有数据包都具有相同的 QoS(在实际情况下也是如此)。因此,我从模拟中省略了 QoS 队列,并将所有流量视为同等重要。接下来,我省略了缓冲区的内存管理。我可以想象这是问题的一个重要部分,但如果我的简化与完美分配的误差超过 10%,我会感到惊讶。我还假装交换机在收到第一个字节时知道帧长度,以便它在开始时保留所有所需的内存。由于我找不到有关端口入口/出口队列大小的任何文档,我假设它们都放置在共享数据包缓冲区中,它们可以根据需要占用缓冲区的大部分(尽管我认为罪魁祸首可能在这里的某个地方)。我将每个数据包的处理延迟设置为 512 ns(64 B 数据包的传播延迟)。
我不确定它是否起作用,但这些流由碎片化的 UDP 数据包组成(即 25 kB 突发是一个被碎片化为 17 个 IP 碎片的单个 UDP 数据包)。第二个流将突发创建为 2 或 3 个 20 kB UDP 数据包,每个被碎片化为 14 个 IP 碎片。
Iperf 3.7 复制类似于真实流的命令是:
iperf3 -c sink -u -b 128M -t 600 -l 25256 --pacing-timer 1560
iperf3 -c sink -u -b 400M -t 600 -l 20k --pacing-timer 1000
你知道我还忘记考虑什么因素,导致模拟结果与现实相差甚远吗?谢谢你的帮助!
动画的源代码位于https://gist.github.com/peci1/a0346538acc6c289b2c6d596b184ad21。
这是我的实际实验结果表。数据流一是固定的 - 128 Mbps,25 kB UDP 数据包,每 1.56 毫秒。我正在更改第二个流的参数,试图找到第一个流的数据包开始被交换机丢失的极限。我正在更改指定-l
UDP 数据包大小的 (长度) 参数和-b
指定这些数据包应生成多少带宽的 (带宽) 参数。--pacing-timer
对于第二个流,始终设置为 1000。您可以看到 D-Link 和 Netgear GS105 根本无法应对 60 kB 的突发。GS108 比 GS105 好得多,而它拥有几乎相同的交换机芯片(同一个“家族”,只是端口数量不同,缓冲区稍大一些)。
转变 | 缓冲区大小 [kB] | 最大流量1.5kB突发 | 最大突发流量20kB | 最大突发流量60kB |
---|---|---|---|---|
Gigablox Rugged(VSC7512) | 220 | 825 Mbps | 825 Mbps | 825 Mbps |
Gigablox(RTL8367N-VB-CG) | 250 | 730 Mbps | 750 Mbps | 790 Mbps |
D-Link DIS-100G-5W (QCA8337N-AL3C) | 128 | 110 Mbps | 1 Mbps | 每次爆发都会丢失数据包 |
合勤 XGS 1210-12 (RTL9302B) | 1500 | 800 Mbps | 830 Mbps | 830 Mbps |
Netgear GS310-TP (RTL8380M) | 520 | 830 Mbps | 830 Mbps | 835 Mbps |
Netgear GS308T (RTL8380M) | 520 | 830 Mbps | 835 Mbps | 835 Mbps |
Netgear GS108 v3(BCM53118) | 192 | 630 Mbps | 660 Mbps | 710 Mbps |
Netgear GS105E (BCM53114) | 128 | 120 Mbps | 1 Mbps | 每次爆发都会丢失数据包 |
Renkforce RF-4270245 | ? | 740 Mbps | 760 Mbps | 800 Mbps |
Mikrotik RB260GS (AR8327) | 128 | 835 Mbps | 835 Mbps | 835 Mbps |
瞻博 EX2300 | 4GB? | 800 Mbps | 830 Mbps | 830 Mbps |
(该问题已从https://networkengineering.stackexchange.com/questions/78529/how-to-simulate-what-happens-inside-the-packet-buffer-of-a-simple-switch它被标记为离题)。