繁体   English   中英

如何以编程方式增加LInux上UDP套接字的每个套接字缓冲区?

[英]How to programmatically increase the per-socket buffer for UDP sockets on LInux?

我正在尝试了解在Linux上为我们的流媒体网络应用程序增加套接字缓冲区大小的正确方法。 应用程序接收在多个UDP套接字上流式传输的可变比特率数据。 在流的开头,数据量大大增加,我用过:

# sar -n UDP 1 200

表明UDP堆栈正在丢弃数据包

# ss -un -pa

显示每个套接字Recv-Q长度在丢弃数据包之前增长到接近极限(124928.来自sysctl net.core.rmem_default )。 这意味着应用程序根本无法跟上流的开始。 丢弃足够的初始数据包后,数据速率变慢,应用程序赶上。 Recv-Q趋向0并且在此期间保持不变。

我能够通过大幅增加rmem_default值来解决数据包丢失问题,这会增加套接字缓冲区的大小,并使应用程序有时间从大的初始突发中恢复。 我的理解是,这会更改系统上所有套接字的默认分配。 我宁愿只增加特定UDP套接字的分配而不是修改全局默认值。

我最初的策略是修改rmem_max并在每个单独的套接字上使用setsockopt(SO_RCVBUF)。 但是,这个问题让我担心禁用所有套接字的Linux自动调整,而不仅仅是UDP。

udp(7)描述了udp_mem设置,但我很困惑这些值如何与rmem_default和rmem_max值相互作用。 它使用的语言是“所有套接字”,所以我怀疑这些设置适用于完整的UDP堆栈而不是单独的UDP套接字。

udp_rmem_min是我正在寻找的设置吗? 它似乎适用于单个套接字,但全局适用于系统上的所有UDP套接字。

有没有办法安全地增加我的应用程序中使用的特定UDP端口的套接字缓冲区长度,而无需修改任何全局设置?

谢谢。

Jim Gettys武装起来,为你而来。 别去睡觉了。

网络数据包泛洪的解决方案几乎从不增加缓冲。 为什么你的协议的排队策略没有退出? 如果您尝试在流中发送如此多的数据(这是TCP的设计目的),为什么不能只使用TCP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM