为什么会出现 close wait
数据库连接不释放问题实际上上线之前就会发现,线上系统出这种问题根本就是测试不过关。
close wait 出现场景
我之前也遇到过出现很多CLOSE_WAIT的场景,一般出现这种情况,都是同步通信的场景,server端执行业务超时,client端主动断开连接的场景。
特别是一些写库的操作,随着表越来越大,写操作越来越慢,当慢到一定程序后会触发client端的超时再重试机制,越来越多的写操作积压在server端,很短的时间内server端被搞的socket全是CLOSE_WAIT,只能重启,重启也是好一段时间。
所以现在我们现在对同步通信机制一定要保证不能有不可预估的开销。这类开销一律走异步机制
检查tcp方法
lsof -i:8081
查看所有tcp连接
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
netstat -n | grep 8082 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
按类型查看 tcp 连接
netstat -nap |grep :8082| grep CLOSE_WAIT
查看close_wait的tcp连接数量
netstat -atn|grep CLOSE_WAIT|wc -l
netstat -nap |grep :8082