Linux怎么查看具体的文件描述符泄漏导致系统挂起的日志

月夜之吻

月夜之吻

2026-08-03

973人浏览

原创

挂起前“too many open files”错误需依次检查:服务systemd日志(journalctl -u)、全系统错误日志(journalctl -p err)、内核日志(dmesg)、应用stderr日志;确认fd泄漏要分析/proc/pid/fd/链接重复性,而非仅看总数;lsof可能漏掉a_inode等内核对象,应以/proc/pid/fd/为准;strace需加-f并跟踪所有fd相关系统调用,关注返回值匹配。

linux怎么查看具体的文件描述符泄漏导致系统挂起的日志

系统挂起前“Too many open files”错误在哪看

挂起前通常不是突然崩溃,而是先出现 Too many open files 错误,这个错误会出现在应用日志、系统日志或内核日志里,但位置不统一,得挨个查。

  • journalctl -u your-service-name --since "2 hours ago":优先查服务自己的 systemd 日志,错误常以 errno 24(EMFILE)形式出现,比如 open() failed: Too many open files
  • journalctl -p err --since "2 hours ago" | grep -i "open files":全系统级别筛选错误级日志,覆盖未托管到 systemd 的进程
  • dmesg | tail -50:内核日志里有时会打印 pid XXX comm XXX reached limit on open files,尤其在 ulimit 被硬限制卡死时
  • 如果应用自己记录了 stderr,检查其日志文件中是否含 errno=24Bad file descriptor ——注意 EBADF(errno 9)往往是 fd 泄漏后误用已关闭 fd 导致的次生错误,不是泄漏本身

/proc//fd 目录里哪些线索说明正在泄漏

光看数量增长不够,得确认是不是同个资源被反复打开却没关 —— 这才是泄漏的铁证。

PyCharm 2026.2.0.1 Linux版
PyCharm 2026.2.0.1 Linux版

PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。

下载
  • 执行 ls -l /proc/<pid>/fd/ | head -20</pid>,重点观察软链接目标是否大量重复,例如几十个 -> /dev/xxx-> socket:[1234567] 指向同一个 inode 或设备号
  • ls -l /proc/<pid>/fd/ 2>/dev/null | awk '{print $11}' | sort | uniq -c | sort -nr | head -5</pid> 快速统计最常出现的目标路径,若某设备节点或 socket 出现上百次,基本就是泄漏点
  • 注意 a_inode 类型(如 eventfdanon_inode):这类无法直接看到路径,但若数量异常增长且与业务逻辑中频繁创建的资源(如 timerfd、signalfd)匹配,也要怀疑
  • 别只看总数:ls /proc/<pid>/fd/ | wc -l</pid> 是当前 fd 数,但得对比 enable/disable 操作前后变化量 —— 单次操作净增 3 个 fd,重复 10 次就泄露 30 个

为什么 lsof -p 有时看不到泄漏源头

lsof 显示的是 fd 的“语义信息”,但某些 fd 内核不提供可读路径,导致输出全是 a_inodeREG 无名项,容易误判为没泄漏。

  • 常见于内核模块驱动节点(如 /dev/mydrv)、memfd_create 创建的匿名内存文件、或 eventfd/timerfd 等内核对象 —— 它们在 lsof 中显示为 a_inode,但 ls -l /proc/<pid>/fd/</pid> 仍能看到数字编号和指向
  • lsof -p <pid> | grep -E "(a_inode|CHR|REG)"</pid> 只能帮你分类,不能替代 /proc/<pid>/fd/</pid> 的原始链接分析
  • 如果 lsof 输出行数远少于 ls /proc/<pid>/fd/ | wc -l</pid>,说明大量 fd 未被识别,此时必须回到 /proc/<pid>/fd/</pid> 目录手动 inspect
  • 某些容器环境或 seccomp 限制下,lsof 可能因权限不足漏掉部分 fd,而 /proc/<pid>/fd/</pid> 只要进程属于当前用户就可读

strace 跟踪 open/close 时最容易忽略的三个细节

strace 抓调用链很有效,但默认参数容易错过关键上下文。

  • 必须加 -f:否则只跟踪主进程,漏掉 fork 出的子进程或线程里的 fd 操作
  • 不要只 trace open,得包含 openatsocketpipeepoll_create 等所有可能分配 fd 的系统调用 —— strace -e trace=open,openat,socket,pipe,epoll_create,close,dup,dup2 -f -p <pid></pid>
  • 输出日志体积大,建议用 -o trace.log -s 256:-s 控制字符串截断长度,否则路径太长会被省略,看不到具体文件名;-o 避免刷屏丢失早期调用
  • 注意返回值:成功调用返回非负整数(即 fd 号),失败返回 -1 并设 errno;重点找那些返回 fd 却没对应 close(fd) 的调用对
实际排查中,最耗时间的往往不是工具不会用,而是看到几百个 a_inode 后不确定哪个该关、哪个是正常复用。这时候得结合代码路径判断:比如某个模块每次初始化都调 eventfd() 却没配对 close(),哪怕它在 lsof 里看起来都一样,也是泄漏。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

2669

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

1625

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

1272

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

2632

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

2392

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

1637

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

1229

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

1398

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

209

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 127人学习