分类: 系统运维
2022-03-25 16:35:53
socket文件句柄泄漏
2022年3.25日,报警:
TCP连接数][触发条件:1054785 > 100000 ][报警次数: 第1次/{BANNED}{BANNED}最佳佳多1次][IP:*.13.53 EIP:][实例名:容器-node-3]
1、netstat显示的tcp连接数正常
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
ESTABLISHED 26
FIN_WAIT1 2
TIME_WAIT 288
建立的tcp连接数并不是很多。
2、ss -s显示大量的closed连接
ss -s
ss -s
Total: 1055821 (kernel 0)
TCP: 1055854 (estab 26, closed 1055793, orphaned 10, synrecv 0, timewait 1046/0), ports 0
Transport Total IP IPv6
* 0 - -
RAW 0 0 0
UDP 14 11 3
TCP 61 33 28
INET 75 44 31
FRAG 0 0 0
而我的系统监控取值方法是:
cat /proc/net/sockstat | grep sockets | awk '{print $3}'
158391
cat /proc/net/sockstat
sockets: used 158400
TCP: inuse 89 orphan 2 tw 197 alloc 157760 mem 16
UDP: inuse 6 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
很多socket处于alloc状态,已经分配sk_buffer,而且处于closed。
有东东的file discriptes存在泄漏,没有被内核回收。
3、追查真凶
上面信息说明存在socket fd泄漏,那么用lsof命令检查系统sock的文件句柄。
使用lsof把信息导到一个文件里,以便分析
lsof >/home/yzj/20220325.lsof (执行了近1小时还未出结果,而且内存已经用了近10G,强制中断,不然机器崩了)
只能到/proc/下用脚本进行统计
先导出pid列表:
使用脚本:
点击(此处)折叠或打开
在执行到pid为:14515时卡住,基本上定位是pid为:14515的进程
在pid列表把14515删除再执行,脚本正常执行完,再次确认是pid:14515的进程有问题
cd /proc/14515/fd
无法执行ls
Ps -ef |grep 14515
显示为一个java进程
粗暴解决方案:
kill 14515进程
ss -s
Total: 8204 (kernel 0)
TCP: 7968 (estab 25, closed 7911, orphaned 8, synrecv 0, timewait 829/0), ports 0
Transport Total IP IPv6
* 0 - -
RAW 0 0 0
UDP 14 11 3
TCP 57 29 28
INET 71 40 31
FRAG 0 0 0
Closed已经1055793 变成 7911
{BANNED}{BANNED}最佳佳终的解决方案还是要修改程度进行解决!