linux 停止连接网络,Linux-太多关闭的连接

我正在使用Netty(异步nio)在单台Linux计算机上以1800个连接/分钟的速度打开一个应用程序的编码.连接存活几秒钟,然后关闭,或者如果没有收到应答,则在20秒后超时.此外,读/写超时为30秒,并且请求标头包含connection = close.

一段时间(2-3小时)后,日志中出现很多异常,因为Netty由于缺乏资源而无法创建新的连接.

我将limits.conf中打开文件的最大数量增加为:

root hard nofile 200000

root soft nofile 200000

这是netstat -nat的输出| awk'{print $6}’|排序uniq -c |排序-n:

1 established)

1 FIN_WAIT2

1 Foreign

2 TIME_WAIT

6 LISTEN

739 SYN_SENT

6439 LAST_ACK

6705 CLOSE_WAIT

12484 ESTABLISHED

这是ss -s命令的输出:

Total: 194738 (kernel 194975)

TCP: 201128 (estab 13052, closed 174321, orphaned 6477, synrecv 0, timewait 3/0), ports 0

Transport Total IP IPv6

* 194975 - -

RAW 0 0 0

UDP 17 12 5

TCP 26807 8 26799

INET 26824 20 26804

FRAG 0 0 0

还ls -l / proc / 2448 / fd | wc -l给出大约199K.

也就是说,问题与ss -s命令输出中报告的已关闭连接有关:

1)它们到底是什么?

2)为什么它们不被破坏就一直晃来晃去?

3)是否有任何设置(超时或其他条件)可以帮助将其保持在合理的范围内?

解决方法:

1)what are they exactly?

它们是从未连接或未断开且不是closed的套接字.

在Linux中,传出TCP套接字大致经历以下阶段:

>您使用create套接字(未连接),内核为它分配了一个文件描述符.

>您将connect()连接到远程端,建立网络连接.

>您可以进行数据传输(读/写).

>读/写完成后,您将同时进行读和写的套接字shutdown(),并关闭网络连接.

>使用close()套接字,内核将释放文件描述符.

因此,那些已关闭的174K连接ss报告是未经过阶段1(也许connect()失败,甚至从未调用过)或经过阶段4,但没有经过5的套接字.实际上,它们是具有基础打开文件描述符的套接字,但没有任何网络绑定(因此netstat / ss列表不会显示它们).

2)why do they keep dangling without being destroyed?

因为没人给他们打电话close().我将其称为“文件描述符泄漏”或“套接字描述符泄漏”.

3)Is there any setting (timeout or whatever) which can help to keep them under a reasonable limit?

从Linux的角度来看,没有.您必须在它们上显式调用close()(或终止拥有它们的进程,以使内核知道不再使用它们).

从Netty / Java的角度来看,也许我不知道.

本质上,这是您的代码,Netty代码(可能性较小)或JRE代码(可能性较小)中的错误.您没有在应该的时候释放资源.如果显示代码,也许有人可以发现错误.

标签:sockets,netty,linux

来源: https://codeday.me/bug/20191118/2027218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值