【问题标题】:Why isn't increasing the networking buffer sizes reducing packet drops?为什么增加网络缓冲区大小不能减少丢包率?
【发布时间】:2020-06-06 03:59:01
【问题描述】:

运行 Ubuntu 18.04.4 LTS

我有一个高带宽文件传输应用程序 (UDP),我正在使用环回接口在本地进行测试。

在没有模拟延迟的情况下,我可以以

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 的数据包丢失率从

我将缓冲区大小增加到 50MB:

sudo sysctl -w net.core.rmem_max=52428800
sudo sysctl -w net.core.wmem_max=52428800
sudo sysctl -p

但是,丢包率并没有明显减少。我还尝试了 1GB 的缓冲区大小,结果相似(我的系统有 >90GB 的可用 RAM)。

为什么在这种情况下增加系统网络缓冲区大小不起作用?

【问题讨论】:

  • "_ 我认为问题在于,为了模拟延迟,内核必须在应用延迟时将数据包存储在 RAM 中。_" 不。UDP 没有反馈,它只是尽可能快地发送,因此拥塞的接口只会丢弃数据包。
  • 在这种情况下 tc 将如何模拟延迟?如果在本地模拟 100 毫秒的延迟,我看不到任何方法可以绕过在内核的网络缓冲区中保存更长时间的数据包,从而导致缓冲区快速填满。
  • 嗨,已经一个月了。关于这个话题有什么更新吗?我的回答和建议呢?

标签: linux ubuntu networking


【解决方案1】:

据我所知,即使这不是您想要达到的目标.. 您可能应该加快发送 UDP 数据包的速度,因为确实正如 @user3878723 所指出的,缓冲区会很快填满缓冲区,而数据包会迷失。换一种说法——很像@Ron Maupin——在应用延迟时界面变得拥挤。我认为发射过程不知道 100 毫秒的延迟,因此它可能会很快淹没所有可用资源。

相反,如果您想在自己的用例中走得更远,您可能需要调整诸如令牌桶过滤器 (TBF) 之类的东西。还要考虑“速率控制”。

更新

可能值得修改这些参数并使它们持久化

net.core.rmem_default
net.core.wmem_default

和/或确保您在发射器/接收器中正确使用这些选项:

SO_SNDBUF
SO_RCVBUF

让整条链有足够的缓冲区。

【讨论】:

  • 感谢您的回复。发送进程有意尽可能快地发送 UDP 数据包,而不尝试进行速率控制。我正在尝试模拟传播延迟延迟,为了准确模拟我认为需要确保我的系统的缓冲区大小足以确保在模拟器应用延迟时数据包不会丢失。
  • 我更新了我的答案。验证这些参数并通过首先传输一个小有效负载并再次增量增加来重新启动会很有趣。引入 100 毫秒延迟确实可能比我们想象的影响更大,尤其是当您尝试以非常高的速度发送非常大的文件时。在最坏的情况下,如果发射器没有节流并且您决定引入 100 倍延迟(如果基础是 - 比如说 - 1 毫秒),那么您的缓冲区可能需要高出 100 倍......?
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多