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

时间:2020-06-06 03:59:01

标签: 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

对于其他测试,我想添加100ms的模拟延迟。这旨在模拟传播延迟,而不是排队延迟。我使用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)。

为什么在这种情况下无法增加系统网络缓冲区大小?

1 个答案:

答案 0 :(得分:0)

据我所知,即使这不是您要实现的目标,您也应该限制发送UDP数据包的速度,因为确实确实如@ user3878723所指出的那样,缓冲区将迅速填满缓冲区,而数据包将迷路了。换句话说-就像@Ron Maupin一样-在应用延迟时接口变得拥塞。我认为发射过程没有意识到100ms的延迟,因此它可能会很快淹没所有可用资源。

相反,如果您想在用例中走得更远,则可能必须进行调整,例如令牌桶过滤器(TBF)。还要考虑“费用控制”。

更新

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

net.core.rmem_default
net.core.wmem_default

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

SO_SNDBUF
SO_RCVBUF

以便整个链具有足够的缓冲区。