Java程序链接数过多导致java.net.SocketException: No buffer space available问题
问题
跑java的程序,报错如下:
java.net.SocketException: No buffer space available (maximum connections reached?): connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
...
现象
通过netstat -an
查看到存在大量的socket资源被占用
原因
http
/ tcp
连接未释放
- 系统
socket
连接数设置过小
解决方式
Linux
在/etc/security/limits.conf
添加:
* soft nofile 204800
* hard nofile 32768
在/etc/sysctl.conf
添加:
# Decrease TIME_WAIT seconds, default is 30 seconds
net.ipv4.tcp_fin_timeout=10
# Recycle and Reuse TIME_WAIT sockets faster, default is 0 for both
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
参数说明:
- net.ipv4.tcp_fin_timeout 系統默认的TIMEOUT时间
- net.ipv4.tcp_tw_reuse 允许将TIME_WAIT sockets重新用于新的TCP连接 默认为0表示关闭
- net.ipv4.tcp_tw_recycle 开启TCP连接中TIME_WAIT sockets的快速回收 默认为0 表示关闭
windows
-
启动注册表编辑器
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
新建 MaxUserPort
- 值名称:MaxUserPort
- 值类型:DWORD
- 值数据:十进制65534/十六进制是FFFE
- PS:有效范围:5000 - 65534 (十进制) 默认:0x1388 5000(十进制)
- 新建 TCPTimedWaitDelay
- 值名称:TCPTimedWaitDelay
- 值类型:DWORD
- 值数据:十进制30/0000001e