网络连接状态:
C: S:
SYN_SEND
SYN_RECV
ESTABLISH
ESTABLISH
FIN_WAIT1
CLOSE_WAIT
FIN_WAIT2
LAST_ACK
TIME_WAIT
CLOSED
http交互和上面的图形其实并不一样,TIME_WAIT 经常是服务端主动关闭的。
TIME_WAITK可以通过调整内核参数解决。
一直保持在CLOSE_WAIT状态,其实只有一种情况,就是在对方关闭连接之后服务器程序自己没有进一步发出ack信号。
大量CLOSE_WAIT的解决办法总结为一句话那就是:查代码。
查看网络连接:
netstat -an| awk '/^tcp/ {++S[$NF]} END {for(i in S) print i ,S[i]}'
案例一次线上服务器收到zabbix报警:
web01服务器cpu空闲值小于70%(该机器跑了多个tomcat)
登录机器排查:
首先是要top命令查看了一下,发现有个java进程占用了90%的cpu(这台服务器有多核cpu的)。
找到进程pid通过top -H -p 命令查看了线程情况,发现该进程的所有线程占用cpu多高。
如是通过ps命令找到该服务是一个运行后台的boss服务。
打开运营后台发现几乎处于卡死状态。
如是用了netstat 命令查看了网络连接状态,结果发现大量的CLOSE_WAIT状态。
如是判断是开发的代码有问题,果然排除了代码后发现了问题,修改了代码,重启tomcat。
用netstat再次查看发现大量的LAST_ACK 最后全部关闭,最终恢复正常。