Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在LInux上以编程方式增加UDP套接字的每套接字缓冲区?_Linux_Sockets_Network Programming_Udp - Fatal编程技术网

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

如何在LInux上以编程方式增加UDP套接字的每套接字缓冲区?,linux,sockets,network-programming,udp,Linux,Sockets,Network Programming,Udp,我正在尝试理解在Linux上为我们的流媒体网络应用程序增加套接字缓冲区大小的正确方法。应用程序通过多个UDP套接字接收流式传输的可变比特率数据。数据流开始时的数据量要高得多,我使用了: # sar -n UDP 1 200 显示UDP堆栈正在丢弃数据包和 # ss -un -pa 显示在丢弃数据包之前,每个套接字Recv-Q长度几乎增长到极限(124928.fromsysctl net.core.rmem_default)。这意味着应用程序根本无法跟上流的开始。丢弃足够多的初始数据包后,数据

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

# sar -n UDP 1 200
显示UDP堆栈正在丢弃数据包和

# ss -un -pa
显示在丢弃数据包之前,每个套接字Recv-Q长度几乎增长到极限(124928.from
sysctl net.core.rmem_default
)。这意味着应用程序根本无法跟上流的开始。丢弃足够多的初始数据包后,数据速率会减慢,应用程序也会跟上。Recv-Q趋向于0,并在持续时间内保持不变

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

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

描述udp_mem设置,但我不清楚这些值如何与rmem_默认值和rmem_最大值交互。它使用的语言是“所有套接字”,因此我怀疑这些设置适用于整个UDP堆栈,而不是单个UDP套接字

udp\u rmem\u min是我要找的设置吗?它似乎适用于单个套接字,但全局适用于系统上的所有UDP套接字

有没有一种方法可以在不修改任何全局设置的情况下安全地增加我的应用程序中使用的特定UDP端口的套接字缓冲区长度


谢谢。

吉姆·盖蒂全副武装,正朝你走来。不要睡觉


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

如果这是Windows,我会说“现在移动到重叠IO,最好是IOCP,这样运行堆栈的内核线程就可以直接将数据接收到您提供的用户缓冲区中。”。创建一个包含100个64K缓冲区的池,并将一些重叠读取保持在队列中'。当然,类似的东西在Linux上也是可能的?NIO/ASIO?您可以考虑将UDP- ReVo()循环移到单独的、高优先级的线程中,除了接收数据包之外什么都不做,然后将其交给主线程(或其他线程)进行实际处理。根据我的经验,当应用程序无法跟上传入的UDP时,通常不是因为CPU速度不够快,而是因为接收线程偶尔忙于做其他事情,并且没有足够快地调用recv()。通过将一个线程仅用于执行recv()和其他一些操作,可以最大限度地减少发生这种延迟的可能性。即使recv()是系统上运行的最高优先级(并且是唯一的)线程,如果处理数据包所需的时间大于到达率,数据仍然可以填充队列。很明显,这个应用程序无法维持这样的数据速率,但是,由于它只发生在开始时,我想增加缓冲区深度以适应它。呵呵。我不确定Bufferbloat的人在这里是否有充分的理由。TCP不是一个选项,因为我们不愿意用它增加的开销换取有保证的交付。我们愿意丢失一些数据。但在这种情况下,我们正在丢失大量数据,而这些数据只是在流的开头。一旦我们通过了最初的攻击,数据速率就会下降,我们能够在非常小的缓冲区深度下维持操作。