转自:http://blog.sina.com.cn/s/blog_5669faf70100xtyi.html
这两天做压力测试,发现了一个问题,当模拟TCP client对外发起连接数(客户端本机对外发起连接的端口称为"客户端口",注意此处不是“服务端口”)达到28000左右时,开始大量抛如下异常:
java.net.BindException: Cannot assign requested address at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Net.java:364) at sun.nio.ch.Net.connect(Net.java:356) at sun.nio.ch.UnixAsynchronousSocketChannelImpl.implConnect(UnixAsynchronousSocketChannelImpl.java:326) at sun.nio.ch.AsynchronousSocketChannelImpl.connect(AsynchronousSocketChannelImpl.java:195) at com.aliyun.talk.mon.stack.comm.AsyncConnection.connect(AsyncConnection.java:85) 研究发现,Linux对外的随机分配端口是由一定限制的,理论上单机对外的端口最大值为65535,除去一些保留端口和被占用端口外,也应该在6W左右,但实际上单机建立对外连接时,默认不超过28232个连接。 执行以下命令就很清楚原因了: $ cat /proc/sys/net/ipv4/ip_local_port_range输出结果为: 32768 61000 这就是Linux随机分配端口的范围,如果在该范围内有被占用的端口,那么连接数肯定小于28232.如果想更改这个范围,可以执行以下命令: # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range