rmem_max 值越高,数据包丢失越多

rmem_max 值越高,数据包丢失越多

Linux设置rmem_max定义了接收 UDP 数据包的缓冲区大小。
当流量变得过于繁忙时,就会开始发生数据包丢失。

我制作了一个图表来显示数据包丢失如何随着传入带宽而增加。
(我用IPerf在两个 VM 实例之间生成 UDP 流量)
不同的颜色代表不同的rmem_max值:

在此处输入图片描述

可以看到,设置rmem_max26214400(深蓝色)比设置为更小的值更早导致数据包丢失。Linux 的默认值为131071(深绿色),这看起来比较合理。

在这种情况下,为什么JBoss 文档建议设置rmem_max26214400
是因为 UDP 流量预计会高于 350 MBytes/秒吗?无论如何,我认为如果数据包丢失率超过 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

答案1

缓冲区越多并不一定意味着速度越快。缓冲区越多只是意味着缓冲区越多。低于某个值时,您会看到溢出,因为应用程序不一定能足够快地处理接收到的数据。这很糟糕,但是如果有足够的缓冲区供应用程序以合理的速率提供服务,即使在偶尔出现流量高峰的情况下,其他任何东西都可能被浪费。

如果设置得太大,那么内核查找和分配内存的负担就会更大,而讽刺的是,这可能会导致数据包丢失。我的直觉是,这可能是您所看到的情况,但需要一些其他指标来确认。

2.5M 这个数字可能来自为 TCP 设置 rmem 和 wmem 值的建议 - 在某些情况下,窗口大小和缓冲区设置之间的关系可能会产生重大影响。也就是说,TCP != UDP - 但有些人认为,如果它有助于 TCP,那么它也将有助于 UDP。你得到了正确的经验信息。如果我是你,我会坚持 256K 的值并称其为偶数。

答案2

问题在于,两个端点(即服务器)之间的路径上通常有多个交换机。虽然使用 rmem 可以增加端点中缓冲区的大小,但这不会影响交换机中的缓冲区,因为这些缓冲区相当有限。因此,您可能会因交换机缓冲区溢出而丢失数据包。

相关内容