运行 Ubuntu 18.04.4 LTS
我有一个高带宽文件传输应用程序 (UDP),我正在使用环回接口(interface)在本地进行测试。
在没有模拟延迟的情况下,我可以以 <1% 的丢包率以最大速度传输 1GB 文件。为了实现这一点,我不得不将网络缓冲区大小从 ~200KB 增加到 8MB:
sudo sysctl -w net.core.rmem_max=8388608
sudo sysctl -w net.core.wmem_max=8388608
sudo sysctl -p
对于其他测试,我想添加 100 毫秒的模拟延迟。这是为了模拟传播延迟,而不是排队延迟。我使用 Linux 流量控制 (tc) 工具完成了这项工作:
sudo tc qdisc add dev lo root netem delay 100ms
增加延迟后,最大速度下 1GB 传输的丢包率从 <1% 下降到 ~97%。在真实网络中,传播延迟引起的延迟不应该导致数据包丢失,所以我认为问题在于,为了模拟延迟,内核必须在应用延迟时将数据包存储在 RAM 中。由于我的缓冲区仅设置为 8MB,因此如果添加模拟延迟会丢弃大量数据包是有道理的。
我将缓冲区大小增加到 50MB:
sudo sysctl -w net.core.rmem_max=52428800
sudo sysctl -w net.core.wmem_max=52428800
sudo sysctl -p
但是,数据包丢失没有明显减少。我还尝试了 1GB 的缓冲区大小,结果相似(我的系统有 >90GB 的可用 RAM)。
为什么在这种情况下增加系统网络缓冲区大小不起作用?
最佳答案
据我所知,即使这不是您想要达到的目标.. 您可能应该提高发送 UDP 数据包的速度,因为确实正如@user3878723 所指出的那样,缓冲区会很快填满缓冲区并且数据包会丢失。换一种说法——很像@Ron Maupin——在应用延迟时界面变得拥挤。我认为发射过程不知道 100 毫秒的延迟,因此它可能会很快淹没所有可用资源。
相反,如果您想在自己的用例中走得更远,您可能必须调整诸如 token 桶过滤器 (TBF) 之类的东西。还要考虑“速率控制”。
更新
可能值得修改这些参数并使它们持久化
net.core.rmem_default
net.core.wmem_default
和/或确保您在发射器/接收器中正确使用这些选项:
SO_SNDBUF
SO_RCVBUF
使整个链条有足够的缓冲。
关于linux - 为什么增加网络缓冲区大小不能减少丢包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62227100/