linux - 为什么增加网络缓冲区大小不能减少丢包?

标签 linux ubuntu networking

运行 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/

相关文章:

linux - *nix 系统上是否有与 COM 等效的功能?如果不是,那么 *nix 的可重用性方法是什么?

svn - libapache2-svn,与 Subversion 1.6.1 匹配的版本

ruby - jekyll 安装 ubuntu : gem verification

c# - 如何监控以太网连接状态

java - Grep 在文件中找到特定文本字符串后的 5 行

linux - 我可以在 POSIX sh 脚本中避免这个子 shell 吗?

networking - 关于 IP 多播的问题?

python - Ping 网络子网中的第一个可用主机

linux - 如何与 parent 沟通 child 关闭了管道的写入端?

postgresql - pg_config - 如何更改 postgres 版本