近日收到一个客户方的反馈,应用程序无法访问,想着应该是中间件异常了,重新启动一下就好,然而,登陆服务器的时候,发现tomcat已经不知道什么时候自动结束了,程序运行在tomcat+windows2008的环境下,以为是客户给结束了,然后直接尝试重启,发现如下报错(前面的一堆就不再截取了,因为此文是事后所写,报错信息是从日志文件中取出):
严重: Error starting endpoint
: Unable to establish loopback connection
at $(:106)
at (Native Method)
at .<init>(:122)
at (:27)
at (:133)
at .<init>(:104)
at (:26)
at (:209)
at $Poller.<init>(:1472)
at (:929)
at .http11.(:168)
at (:1220)
at (:540)
at (:759)
at (:595)
at .invoke0(Native Method)
at (:39)
at (:25)
at (:597)
at (:289)
at (:414)
Caused by: : No buffer space available (maximum connections reached?): connect
at (Native Method)
at (:532)
at (:146)
at $(:78)
... 20 more
2018-8-20 10:00:21
从上面报错可以看出缓冲空间已经不足了,无法启动应用程序,但是为什么会出现这个问题,赶紧问问度娘,毕竟玩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连接未被释放,导致占用的端口资源一直未被回收,出现了缓冲区空间不足的问题,应用也总是自动断线。