【发布时间】:2016-12-14 17:33:20
【问题描述】:
我正在使用 Netty (async 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}' | sort | uniq -c | sort -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)是否有任何设置(超时或其他)可以帮助将它们保持在合理的限制范围内?
【问题讨论】:
-
什么是exact 错误信息和堆栈跟踪,
netstat显示什么? -
这是某种网络命名空间环境(docker host / docker container / ...)吗?这些数字只是没有加起来。
-
@Roman 不,它是一台没有虚拟化的真实机器。它们可能会有所不同,因为它们是在应用程序运行时在不同时间获得的(只是以短序列执行命令,但不是在同一时刻)并且因为 fd 包括所有打开的文件描述符而不仅仅是套接字(我猜)。
-
尝试运行
sudo lsof -n -p pid(用实际值替换pid)并检查输出中最常见的条目(并与我们分享结果)。