【发布时间】:2019-08-06 23:49:07
【问题描述】:
我构建了一个简单的测试程序,它每 250 毫秒发送 100 个 UDP 数据包,每个数据包大小为 1000 字节。我发现两个独立的 linux 机器正在丢弃其中一些数据包。
我的期望是,当我写入 100 个 UDP 数据包时,内核缓冲区能够保存所有这些数据包。 netstat -us 表示每个被丢弃的数据包都有RcvbufErrors。所以看起来内核接收缓冲区溢出了。但我不明白为什么。
/proc/sys/net/core/rmem_default 显示的值为 212992,因此我认为增加它不会有帮助,因为它已经大于此测试发送的 100kB 批次。
我进行了第二次测试,每 10 毫秒发送 50 个 UDP 数据包,每个数据包大小为 1000 字节。我发现在这个测试中没有数据包被丢弃。这表明 100kB 会溢出缓冲区,而 50kB 不会。它还进一步表明我不受 CPU 限制或数据包限制——这个测试发送数据包的速度比第一个快很多倍。
我使用的两台 linux 机器:macbook 上的 virtualbox 和 AWS m5a.xlarge。
我的测试程序:https://github.com/theicfire/rando/tree/master/udp-fail-batch-stack-overflow
【问题讨论】:
-
哎呀,为什么投反对票?
标签: linux sockets networking udp