本帖最后由 minimu 于 2017-07-07 19:23 编辑
1、环境: 服务器端:centos7,一个Socket服务程序
客户端:用模拟多个Socket请求的客户端程序
2、现象:
(1)服务器端刚启动的时候,句柄正常:
[root@localhost app]# lsof -n | wc -l 6298
(2)如果客户端不发送程序,句柄也基本没有波动,几个上下波动
(3)一旦客户端发送连接请求并发送数据(每隔30S发送一次),文件句柄就开始暴涨 [root@localhost app]# lsof -n | wc -l 38139 根据观察,客户端每1000个socket连接,句柄会增加3万以上个;尝试将客户端的连接数增加到6000的时候,句柄超过了21万个。但是服务器状态正常的,所有客户端的响应时间也在3ms内。
(4)可打开的文件句柄最大值:6000连接的时候已经用掉21W+了
[root@localhost gps]# cat /proc/sys/fs/file-max 1048576
3、分析: (1)查看网络连接数量,正常 [root@localhost app]# netstat -ant | wc -l
1007
(2)指定端口网络连接,正常 [root@localhost app]# netstat -ant | grep ":10032" | wc -l 1001
(3)查看句柄,明显异常,2235就是Socket服务端的PID [root@localhost app]# lsof -n | awk '{print $2}' | sort -n | uniq -c | sort -nr | more 33046 2235 3180 1527 420 966
(4)导出lsof的数据打开看了下,几万个句斌基本都是ESTABLISHED状态的socket连接,类似下面【来自另一次测试的导出,忽略PID不一样】: java 2345 2346 root 1288u IPv4 54615 0t0 TCP 192.168.1.200:10032->192.168.1.4:55505 (ESTABLISHED) java 2345 2346 root 1289u IPv4 54616 0t0 TCP 192.168.1.200:10032->192.168.1.4:55518 (ESTABLISHED) java 2345 2346 root 128u IPv4 52029 0t0 TCP 192.168.1.200:10032->192.168.1.4:56815 (ESTABLISHED) java 2345 2346 root 1290u IPv4 54617 0t0 TCP 192.168.1.200:10032->192.168.1.4:55532 (ESTABLISHED) java 2345 2346 root 1291u IPv4 54618 0t0 TCP 192.168.1.200:10032->192.168.1.4:55545 (ESTABLISHED)
(5)担心是IPv6或防火墙的问题,把IPv6和防火墙全部禁用了,问题依旧
(6)担心是后续应用造成的,把后续的代码全部屏蔽,只留Socket的接收代码,问题依旧
4、对比测试
把Socket服务端的程序放在win10和mac上跑,句柄都是正常的
5、求助?为什么会有这种状况?是centos7的某个配置或初始化参数的原因?或者其他原因?
|