use*_*723 5 linux ubuntu networking
运行 Ubuntu 18.04.4 LTS
我有一个高带宽文件传输应用程序 (UDP),我正在使用环回接口在本地测试它。
在没有模拟延迟的情况下,我可以以最大速度传输 1GB 文件,并且丢包率小于 1%。为此,我必须将网络缓冲区大小从 ~200KB 增加到 8MB:
sudo sysctl -w net.core.rmem_max=8388608
sudo sysctl -w net.core.wmem_max=8388608
sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)
对于额外的测试,我想添加一个 100 毫秒的模拟延迟。这是为了模拟传播延迟,而不是排队延迟。我使用 Linux 流量控制 (tc) 工具完成了此操作:
sudo tc qdisc add dev lo root netem delay 100ms
Run Code Online (Sandbox Code Playgroud)
添加延迟后,以最大速度传输 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
Run Code Online (Sandbox Code Playgroud)
但是,数据包丢失没有明显减少。我还尝试了 1GB 缓冲区大小,结果相似(我的系统有 >90GB 的可用 RAM)。
为什么在这种情况下增加系统网络缓冲区大小不起作用?
据我所知,即使这不是您想要实现的目标..您可能应该限制发送UDP数据包的速度,因为确实正如@user3878723所指出的那样,缓冲区将很快填满并且数据包将丢失。换句话说 - 就像@Ron Maupin - 当应用延迟时,界面会变得拥塞。我认为发射进程不会意识到 100 毫秒的延迟,因此它可能会很快耗尽所有可用资源。
相反,如果您想在自己的用例中走得更远,您可能必须调整诸如令牌桶过滤器(TBF)之类的东西。还要考虑“速率控制”。
更新
可能值得修改这些参数并使它们持久化
net.core.rmem_default
net.core.wmem_default
Run Code Online (Sandbox Code Playgroud)
和/或确保您在发射器/接收器中正确使用这些选项:
SO_SNDBUF
SO_RCVBUF
Run Code Online (Sandbox Code Playgroud)
使整个链条有足够的缓冲。
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |