我正在使用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?
它们是从未连接或未断开且不是close
d的套接字.
在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。