Tomcat报错:No buffer space available

       近日收到一个客户方的反馈,应用程序无法访问,想着应该是中间件异常了,重新启动一下就好,然而,登陆服务器的时候,发现tomcat已经不知道什么时候自动结束了,程序运行在tomcat+windows server2008的环境下,以为是客户给结束了,然后直接尝试重启,发现如下报错(前面的一堆就不再截取了,因为此文是事后所写,报错信息是从日志文件中取出):

严重: Error starting endpoint
java.io.IOException: Unable to establish loopback connection
    at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)
    at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27)
    at java.nio.channels.Pipe.open(Pipe.java:133)
    at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:104)
    at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:26)
    at java.nio.channels.Selector.open(Selector.java:209)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.<init>(NioEndpoint.java:1472)
    at org.apache.tomcat.util.net.NioEndpoint.start(NioEndpoint.java:929)
    at org.apache.coyote.http11.Http11NioProtocol.start(Http11NioProtocol.java:168)
    at org.apache.catalina.connector.Connector.start(Connector.java:1220)
    at org.apache.catalina.core.StandardService.start(StandardService.java:540)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:759)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at sun.nio.ch.Net.connect(Native Method)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:532)
    at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
    at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:78)
    ... 20 more
2018-8-20 10:00:21 org.apache.catalina.core.Sta

 从上面报错可以看出缓冲空间已经不足了,无法启动应用程序,但是为什么会出现这个问题,赶紧问问度娘,毕竟玩window服务器的时间还是比较少的,网上说是有连接没有关闭,占用了端口资源,查一查,果然,进程都结束了,依然后很多TIME_WAIT状态的连接未释放,再查看所有的time_wait连接,直接过去好几屏,汗,计数也不用了,肯定有问题。

netstat -ano   windows下查看当前所有的tcp连接
 
netstat -ano |findstr "8080"  windows下查看所有8080端口的tcp连接
 
netstat -ano |findstr "TIME_WAIT"  windows下查看所有的“TIME_WAIT”状态的tcp连接
 
netstat -ano |find /i /c "TIME_WAIT"   windows下统计time_wait出现的次数(按行统计) /i 忽略大小写

随即,查看一下有没有设TIME_WAIT的自动关闭时间(默认4分钟)、还有windows下的大端口服务(虽然系统总共可使用的Ports有65536个,但从本机连到外部网路(Outbound Connections)的连线埠最多只会使用到5000个而已【此为系统默认值】)

cmd--->regedit    进入注册表
 
进入 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters 
 
新建 DWORD 类型的注册表项,命名为:MaxUserPort  
 
值数据: 60000(用十进制的格式录入进去,此值的有效范围为5000-65534)
 
新建 DWORD 类型的注册表项,命名为:TCPTimedWaitDelay
 
值数据: 30(TIME_WAIT的自动断开时间,默认为4分钟)

设置完大端口及time_wait时间后,重新启动tomcat,能正常启动了,访问应用也正常了。但是有个现象就是time_wait的连接数似乎没有降低,同事说是微软操作系统的bug,然后重新启动服务器,再观察time_wait的链接,发现变少了,而且也能自动释放了。

   【结论】:由于大量的TIME_WAIT连接未被释放,导致占用的端口资源一直未被回收,出现了缓冲区空间不足的问题,应用也总是自动断线。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值