一、TCP连接状态简介
TCP协议规定,对于已经建立的连接,网络双方要进行四次挥手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。
网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。
如果服务器出现异常,百分之八九十都是下面两种情况:
服务器保持了大量TIME_WAIT状态;
服务器保持了大量CLOSE_WAIT状态;
因为linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,而且是“占着茅坑不使劲”,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,tomcat崩溃。
在服务器的日常维护过程中,会经常用到下面的命令:
netstat -n | awk \'/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}\'