gpt4 book ai didi

Java IOException : No buffer space available while sending UDP packets on Linux 错误

转载 作者:IT王子 更新时间:2023-10-29 01:06:45 24 4
gpt4 key购买 nike

我有一个第三方组件试图在特定情况下将太多 UDP 消息发送到太多单独的地址。这是软件启动时发生的突发,情况是暂时的。实际上,我不确定是消息的普通数量还是每个消息都发送到一个单独的 IP 地址。

无论如何,更改底层协议(protocol)或有问题的组件不是一种选择,所以我正在寻找解决方法。 StackTrace 看起来像这样:

java.io.IOException: No buffer space available
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:612)

此问题(至少)出现在 Java 版本 1.6.0_13 和 1.6.0_10 以及 Linux 版本 Ubuntu 9.04 和 RHEL 4.6 中。

是否有任何可能有帮助的 Java 系统属性或 Linux 配置调整?

最佳答案

我终于确定了问题所在。 Java IOException 具有误导性,因为它是“没有可用的缓冲区空间”,但根本问题是本地 ARP 表已被填充。在 Linux 上,默认的 ARP 表查找是 1024(文件/proc/sys/net/ipv4/neigh/default/gc_thresh1、/proc/sys/net/ipv4/neigh/default/gc_thresh2、/proc/sys/net/ipv4/neigh/default/gc_thresh3).

我的情况(我假设您的情况)是您的 Java 代码从与您的目标地址位于同一子网中的 IP 地址发送 UDP 数据包。在这种情况下,Linux 机器将执行 ARP 查找以将 IP 地址转换为硬件 MAC 地址。由于您正在向许多不同的 IP 发送数据包,本地 ARP 表很快就会填满,达到 1024,这就是抛出 Java 异常的时候。

解决方案很简单,要么通过编辑我之前提到的文件来增加限制,要么将您的服务器移动到与目标地址不同的子网中,这将导致 Linux box 不再执行邻居 ARP 查找(而是由网络上的路由器处理)。

关于Java IOException : No buffer space available while sending UDP packets on Linux 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com