更高的rmem_max值导致更多的数据包丢失

rmem_max Linux设置定义了接收UDP数据包的缓冲区的大小。
当stream量变得太忙时,丢包开始发生。

我做了一个图表,显示了数据包丢失如何随传入带宽而增加。
(我使用IPerf在两个VM实例之间生成UDP通信)
不同的颜色是不同的rmem_max值:

在这里输入图像说明

如您所见,将rmem_max设置为26214400 (深蓝色)会导致数据包丢失的时间早于较小的值。 Linux的默认值是131071 (深绿色)看起来合理。

在这些情况下,为什么JBoss文档build议将rmem_max设置为26214400
是否因为UDPstream量预计会高于350兆字节/秒? 无论如何,我认为任何事情都不会发生超过1%的数据包丢失。

我错过了什么?

详细信息:我在两个节点上都使用了sysctl -w net.core.rmem_max=131071 (作为例子),并用作服务器iperf -s -u -P 0 -i 1 -p 5001 -f M ,另一个作为客户端iperf -c 172.29.157.3 -u -P 1 -i 1 -p 5001 -f M -b 300M -t 5 -d -L 5001 -T 1

更多的缓冲区不一定意味着更多的速度。 更多的缓冲区意味着更多的缓冲区。 低于某个值时,您将看到溢出,因为应用程序不一定足够快地处理收到的数据。 这是不好的,但是在应用程序有足够的缓冲区以适当的速率服务的时候,即使在偶发的stream量飙升的情况下,其他任何事情都可能被浪费掉。

如果你去 – 大,那么你在内核上发现和分配内存更大的负担,具有讽刺意味的是,可能会导致数据包丢失。 我的预感是,这可能是你所看到的,但还有一些其他指标需要确认。

很可能这个2.5M的数字可能来自围绕TCP设置rmem和wmem值的build议 – 在某些情况下,窗口大小和缓冲区设置之间的关系可能会有显着的影响。 也就是说,TCP!= UDP – 但是有些人认为如果TCP有帮助,它也能帮助UDP。 你有正确的经验信息。 如果我是你,我会坚持256K的价值,甚至称之为。

问题是在两个端点(即服务器)之间的path中通常有几个交换机。 虽然使用rmem可能会增加端点中的缓冲区大小,但不会影响交换机中的缓冲区,而缓冲区是相当有限的。 所以你可能会由于交换缓冲区中的溢出而丢失数据包。