什么是java.net.NoRouteToHostException:无法分配请求的地址?

时间:2015-01-22 13:21:44

标签: linux amazon-ec2 openfire

我在亚马逊EC2中Openfire上运行了stress test,在连接28.000之后,我的压力测试重置了,这个错误出现在我身上。

这是什么?

2 个答案:

答案 0 :(得分:5)

据我所知,你的机器没有可用的端口。

您可以使用TIME_WAIT中的套接字数确认:

netstat -a

如果确认 - 您可以考虑调整tcp配置,例如如上所述:https://serverfault.com/questions/23385/huge-amount-of-time-wait-connections-says-netstat

答案 1 :(得分:1)

如果存在大量TCP / IP连接并且您的程序在OS级别上超过了可用的端口范围,则可能会出现此错误(java.net.NoRouteToHostException:无法分配请求的地址)。

命令检查端口范围 猫/ proc / sys / net / ipv4 / ip_local_port_range

可以通过在操作系统级别上微调TCP套接字参数来避免这种情况。

  1. 使用以下命令增加本地端口范围

    echo 1024 65000> / proc / sys / net / ipv4 / ip_local_port_range。

    更改此限制之前请多加注意。我建议首先弄清楚为什么存在大量TCP / IP连接。程序中是否存在任何连接泄漏(使用后未关闭连接)?如果是这种情况,并且您的程序确实需要大量用于TCP / IP的端口,则只需修改限制。

  2. 使用以下命令更改TCP_FIN_TIMEOUT

    echo 30> / proc / sys / net / ipv4 / tcp_fin_timeout

    此设置确定TCP / IP释放封闭的连接并重新使用其资源之前必须经过的时间。通过减小该条目的值,TCP / IP可以更快地释放关闭的连接,从而使更多资源可用于新连接。如果有许多处于TIME_WAIT状态的连接,请进行调整。

    注意:-仅当许多TCP / IP连接处于CLOSE_WAIT状态时,此功能才有用。 可以通过命令-“ netstat -a -n | grep -E” ^(tcp)“ | cut -c 68- | sort | uniq -c | sort -n”来确定TCP / IP连接状态。

    < / li>
  3. 使用以下命令更改TCP_TW_REUSE

    回声1> / proc / sys / net / ipv4 / tcp_tw_reuse

    当从协议角度来看是安全的时候,这允许在TIME_WAIT状态下为新的连接重用套接字。默认值为0(禁用)。通常,它是tcp_tw_recycle的更安全的替代方法

    注意:tcp_tw_reuse设置在Web服务器等开放大量短连接并保持TIME_WAIT状态的环境中特别有用。重用套接字对于减少服务器负载非常有效。

  4. 使用以下命令更改TCP_TW_RECYCLE

    回声1> / proc / sys / net / ipv4 / tcp_tw_recycle

    它可以快速回收TIME_WAIT套接字。默认值为0(禁用)。