遇到java.net.bindexception的问题无法分配请求的地址

问题描述

|| 我目前正在使用可模拟大量用户自动测试客户端来测试服务器。服务器和客户端都是用Java编写的。客户端为每个用户打开一个tcp / ip连接。服务器和客户端都在Ubuntu linux上运行,客户端在11.04上运行,服务器在10.04上运行。 测试一直进行到27000个并发打开的连接,之后我决定跳到36000(服务器和客户端资源并不是27000用完的全部,所以我决定做一个更大的跳动)。当我尝试运行36k的测试时,客户端出现以下异常: java.net.BindException:无法分配请求的地址 据我所知,在36k时,我仍然应该有可用端口,因为在任何一台机器上都没有运行太多的东西,而tcp将端口号限制为2 ^ 16,即65536。由于是linux,我还为以下端口设置了打开文件数量用户使用ulimit -n 100000到100k。 但是我仍然遇到同样的例外。 我想知道还有什么可能导致上述异常,或者linux是否以其他方式限制了传出连接的数量? 提前致谢, 丹尼尔     

解决方法

默认情况下,Linux从32768..61000范围内选择动态分配的端口。如果绑定到特定端口号,则其他端口可用于静态分配。如果您希望更多端口可用于动态分配,则可以更改范围,但请注意不要包含用于所需特定服务的端口(例如X11为6000)。同样,您不应允许动态分配<1024端口,因为它们具有特权。要检查或更改范围:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   61000

# echo \"16384 65535\" > /proc/sys/net/ipv4/ip_local_port_range