【问题标题】:What is java.net.NoRouteToHostException: Cannot assign requested address?什么是 java.net.NoRouteToHostException:无法分配请求的地址?
【发布时间】:2015-01-22 13:21:43
【问题描述】:

我在 Amazon EC2 中的 Openfire 上运行 stress test,在 28.000 次连接后,我的压力测试重置并且出现了这个错误。

这是什么?

【问题讨论】:

  • 什么?您快速连接到 ec2 远程亚马逊服务,您想知道,为什么它们在 28.000 个连接后迅速中止? OpenFire-testcases 似乎提供了这个来模拟繁重的连接负载。但是 EC2 允许这样做吗?你问他们了吗?它可能有任何原因,其中一些可能与安全有关。

标签: linux amazon-ec2 openfire


【解决方案1】:

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

检查端口范围的命令 cat /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 状态时才有用。 TCP/IP连接状态可以通过命令-"netstat -a -n|grep -E "^(tcp)"| cut -c 68-|sort|uniq -c|sort -n"来判断。

  3. 使用以下命令更改 TCP_TW_REUSE

    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

    这允许在从协议角度来看是安全的情况下,重新使用处于 TIME_WAIT 状态的套接字来进行新连接。默认值为 0(禁用)。它通常比 tcp_tw_recycle 更安全

    注意:tcp_tw_reuse 设置在许多短连接打开并处于 TIME_WAIT 状态的环境中特别有用,例如 Web 服务器。重用套接字可以非常有效地减少服务器负载。

  4. 使用以下命令更改 TCP_TW_RECYCLE

    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

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

【讨论】:

    【解决方案2】:

    据我了解,您的机器用完了可用端口。

    您可以通过 TIME_WAIT 中的套接字数来确认:

    netstat -a
    

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

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 1970-01-01
      • 2016-09-16
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多