netty 大量 close_wait 导致其他 tcp 连接不上?

在centos7,利用netty创建tcp服务端,大概有1500的客户端tcp连接上,在短时间出现close_wait的机率很大(2分钟内可达2000个),大概一天二次,然后导致正常的tcp连接不上。

这种问题一般是客户端的问题,还是服务端没处理好呢?

在linux能不能通过某些命令主动清除close_wait。

阅读 5.1k
1 个回答

close_wait都是出现在被动关闭的一端,也就是说是客户端主动断开的连接,此时服务端接收到了客户端的FIN关闭请求。但是内核未调用close()关闭socket,并给客户端发送一个FIN,因此不能进入LAST_ACK以及CLOSED状态。

猜测原因:netty的I/O线程被阻塞,不能及时调用close方法;【需要具体分析线程dump】

另外感觉你这边可能都是短链接,那么

  1. net.ipv4.tcp_keepalive_time可以相应设小些【默认2小时】;
  2. 服务端文件句柄数可以相应设置大些,避免大并发下导致socket句柄不足而无法建立tcp连接【主要下面的内核参数】;
* soft nofile 655360
* hard nofile 655360
fs.file-max = 999999

如果后面发现是其他原因导致的该问题,希望也可以及时告知学习。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题