我正在尝试理解在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)。然而,这个question让我担心会禁用所有套接字(而不仅仅是UDP)的Linux自动调整。
udp(7)描述了udp_mem设置,但我不确定这些值如何与rmem_default和rmem_max值交互。它使用的语言是“所有套接字”,因此我的怀疑是这些设置适用于完整的UDP堆栈,而不是单个UDP套接字。
udp_rmem_min是我在寻找的设置吗?它似乎适用于单个套接字,但全局适用于系统上的所有UDP套接字。
有没有一种安全地增加特定UDP端口使用的套接字缓冲区长度而不修改任何全局设置的方法?
谢谢。