百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

FD泄漏问题排查 泄漏故障的检查方法

lipiwang 2024-10-25 15:49 11 浏览 0 评论

FD泄漏问题排查

收到文件FD过多告警

  1. 先查看TCP连接数
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

CLOSE_WAIT          22
ESTABLISHED          1949
TIME_WAIT          267
SYN_SENT          17
  1. 查看连接状态: ss -s
Total: 64958
TCP:   64561 (estab 1945, closed 62538, orphaned 0, timewait 70)

Transport Total     IP        IPv6
RAW          1         1         0        
UDP          86        80        6        
TCP          2023      1599      424      
INET          2110      1680      430      
FRAG          0         0         0     

发现有大量的closed的TCP连接

  1. 进一步查看socket的状态
cat /proc/net/sockstat
sockets: used 64981
TCP: inuse 1600 orphan 0 tw 132 alloc 64517 mem 96240
UDP: inuse 80 mem 57
UDPLITE: inuse 0
RAW: inuse 1
FRAG: inuse 0 memory 0

很多socket处于alloc状态,已经分配sk_buffer,而且处于closed,没有被内核回收

  1. lsof上场: lsof | grep sock
server    3467008 2017093        game *983u     sock                0,9        0t0   24780984 protocol: TCP
server    3467008 2017093        game *984u     sock                0,9        0t0   24792264 protocol: TCP
server    3467008 2017093        game *985u     sock                0,9        0t0   24775087 protocol: TCP

protocol: TCP 所有的文件具柄泄漏都在这里,pid是3467008

  1. strace进程: strace -t -T -f -p 3467008 -e trace=network,close -o strace.out
2017182 02:16:24 futex(0xc00a812548, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017181 02:16:24 futex(0xc01bd21d48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017180 02:16:24 futex(0xc00d2dd148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017179 02:16:24 futex(0xc0121a2948, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017178 02:16:24 futex(0xc01002dd48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017177 02:16:24 futex(0xc00c5a7d48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017176 02:16:24 futex(0xc01fb5a548, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017175 02:16:24 futex(0xc010343d48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017174 02:16:24 futex(0xc01bd20d48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
2017173 02:16:24 futex(0xc010fe2d48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>

进程hang在了FUTEX_WAIT_PRIVATE,看起来就是程序死锁引起的。

如何准确的统计FD?

调查一个"too many open files"的问题,用到了lsof,加上一堆漂亮的命令组合来查看哪些程序打开了很多文件。

lsof | awk '{print $2}' | uniq -c | sort -rnk1 | head


CentOS 7中的lsof是按PID/TID/file的组合显示结果的,上面lsof组合命令显示“打开”了很文件的进程,只是因为进程运行了N个线程,而每个线程都“用到”了M个jar包,并且FD一栏分别为mem和具体fd号都分别显示了一次,就出现了2*N*M——上万条结果。

结论一:

使用lsof查看fd数是不正确的。

这是因为:

  1. lsof的结果包含了并非以fd形式打开的文件,比如用mmap方式访问文件(FD一栏显示为mem),实际并不占用fd。
  2. 其中包括了像.so这样的文件。从结果看.jar文件也是以FD为mem和具体fd编号分别打开了一次。
  3. lsof(我这里lsof -v的版本号是4.87)是按PID/TID/file的组合对应一行,不是一行一个fd。同一个进程如果多个线程访问同一个文件通常只需要打开一次、占用一个fd,但在lsof中就显示多行。
  4. 如果用lsof -p <pid>,则不按TID显示,结果数少很多。但仍包含了没有使用fd的文件。

结论二:

准确的查看fd使用总数的命令是:

cat /proc/sys/fs/file-nr

或者(结果多的时候运行需要一段时间)

sudo find /proc -print | grep -P '/proc/\d+/fd/'| wc -l

注意如果用

sudo ls -l /proc/*/fd/* | wc -l

结果是不对的,比上面的命令返回结果少很多。原因是实际执行是会把*扩充成具体的目录作为参数,而这个参数长度有限制。

查看具体一个进程号的fd数量是:

ls -l /proc/<pid>/fd | wc -l

查看哪个进程使用的fd最多(再来一路组合拳):

sudo find /proc -print | grep -P '/proc/\d+/fd/'| awk -F '/' '{print $3}' | uniq -c | sort -rn | head

但还要注意上面的命令返回的是系统的fd使用情况,而ulimit的配置是针对单用户的,两者是有区别的。

结论三:

不同版本的lsof输出结果不同。

CentOS 7.3的lsof (我这里是4.87),按PID/TID/file显示。CentOS 6.6的lsof(我这里是4.82),按PID/file显示。结果数相差很大。但lsof -p <pid>的结果是一致的。

这在容器OS版本和宿主机OS版本不同时就需要注意了,在容器里和宿主机上用lsof查看同一进程的结果会很不同,我碰到的就是这种情况。

之前使用lsof(或lsof -n不解析协议主机名)的相关命令和真实意义:

打开文件总记录数(没太大意义):

lsof | wc -l或lsof -n | wc -l #不解析协议主机名

查看哪些pid使用文件数量最多(其实也没有太大意义):

lsof | awk '{print $2}' | uniq -c | sort -rnk1 | head

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: