引入问题
前几天在生产环境的Windows服务器上碰到一个奇怪的问题。使用SqlDeveloper访问Oracle数据库,已经连接的实例可以正常访问数据库,而新建连接时,提示连接不上数据库异常。
排查原因
网络上的问题,首先考虑用netstat -ano
命令检查一下本机的网络连接情况。
+
发现TCP协议的端口被占用完,并且状态都是「TIME_WAIT」,进一步发现问题的源头是某个程序连续地新建HTTP连接去访问WEB服务,但释放连接却有延时,导致所有的TCP端口在短时间内耗尽,系统没有额外的TCP端口资源分配给新的请求,然后报错。
那么,为什么断开TCP连接会有延时?如何规避TCP端口耗尽呢?
为什么断开TCP连接会有延时
TCP的连接过程及状态可参见上一篇博文。对于本文中出现的问题,其实是「TIME_WAIT」状态在作祟。
如何规避TCP端口耗尽
建立长连接。