我有一台通过物理电缆(无路由器或交换机)连接的 UDP 与相机通信的计算机。相机充当 UDP 服务器,计算机充当客户端。有时,在逐行传输图像时,我的 Java APP 会挂起。我的 Java 软件等待图像的一行,但从未收到,我相信这可能是由接收缓冲区溢出引起的。
我尝试增加接收缓冲区的最大大小/etc/sysctl.conf
:
sysctl -w net.core.rmem_max 1000000
我的程序请求 7000000 字节,但运行时报告只收到 212992 字节。
当我尝试询问操作系统最小、默认和最大尺寸时:
$ sysctl -a | grep usb
net.ipv4.udp mem 185535 247780 371670
如何获得更大的缓冲区?sysctl
甚至正在读取?
答案1
类型:
sysctl -w net.core.rmem_max=8388608
这将为所有类型的连接设置最大 OS 接收缓冲区大小。
解决 UDP 流量缓慢的问题
如果您的服务器接收 UDP 流量的速度似乎不如接收 TCP 流量的速度快,这可能是因为 Linux 默认未将网络堆栈缓冲区设置为支持高 UDP 传输速率所需的大小。缓解此问题的一种方法是允许 IP 堆栈使用更多内存来存储传入数据。例如,使用以下命令:
sysctl -w net.core.rmem_max=262143
和:
sysctl -w net.core.rmem_default=262143
将读取缓冲区内存最大值和默认值从默认值 max=131071 (128k - 1) 和 default=65535 (64k - 1) 增加到 262143 (256k - 1)。这些变量将增加网络堆栈用于接收的内存量,并且如果应用程序需要,可以显著增加内存量。
答案2
/etc/sysctl.conf 的编辑有错误,它应该如下所示,并且我还应该增加默认值:
net.core.rmem_max=1000000
net.core.rmem_default=1000000
我不知道为什么当我手动输入时下面的内容不起作用但无论如何我希望在启动时设置这些值。
sysctl -w net.core.rmem 1000000