Home Archives Categories Tags

Java程序链接数过多导致java.net.SocketException: No buffer space available问题

发布时间: 更新时间: 总字数:482 阅读时间:1m 作者: 分享

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资源被占用

原因

  1. http / tcp 连接未释放
  2. 系统 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

  1. 启动注册表编辑器 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  2. 新建 MaxUserPort

  • 值名称:MaxUserPort
  • 值类型:DWORD
  • 值数据:十进制65534/十六进制是FFFE
  • PS:有效范围:5000 - 65534 (十进制) 默认:0x1388 5000(十进制)
  1. 新建 TCPTimedWaitDelay
  • 值名称:TCPTimedWaitDelay
  • 值类型:DWORD
  • 值数据:十进制30/0000001e
最新评论
加载中...