讲师中心 微信公众号
AI工具推荐 视频效率加速

too many open files 的 eventpoll / signalfd / timerfd 隐藏 fd 排查

阿辰同学_8711

阿辰同学_8711

发布时间:2026-01-31 14:12:01

|

395人浏览过

|

来源于php中文网

原创

lsof -p PID 看不到 eventpoll/signalfd/timerfd 是因它们属于内核匿名文件,仅在 /proc/PID/fdinfo/ 中通过 type: 字段标识,需用 grep -h "type:" /proc/PID/fdinfo/* 2>/dev/null | cut -d' ' -f2 | sort | uniq -c 统计。

too many open files 的 eventpoll / signalfd / timerfd 隐藏 fd 排查

为什么 lsof -p PID 看不到 eventpoll / signalfd / timerfd 却报 “too many open files”

因为这些 fd 是内核匿名文件(anonymous file),不挂载在任何路径下,也不出现在 /proc/PID/fd/ 的符号链接目标中——lsof 默认靠解析 /proc/PID/fd/ 下的 symlink 来识别类型,而 eventpoll、signalfd、timerfd 创建的 fd 指向的是 anon_inode:[eventpoll] 这类伪路径,lsof 会跳过或归类为 “unknown”,导致数量被低估。

真正能暴露它们的是 /proc/PID/fdinfo/:每个 fd 在这里都有独立文件,内容含 flags、mnt_id 和关键的 type 字段。例如:

cat /proc/12345/fdinfo/7
pos:    0
flags:  02000002
mnt_id: 12
type:   eventpoll

所以排查必须进 /proc/PID/fdinfo/ 扫描 type: 行,不能只信 lsof 或 ls -l /proc/PID/fd/。

快速统计 eventpoll / signalfd / timerfd 数量的 shell 命令

直接遍历 /proc/PID/fdinfo/ 并按 type 计数,比写脚本更可靠:

grep -h "type:" /proc/12345/fdinfo/* 2>/dev/null | cut -d' ' -f2 | sort | uniq -c | sort -nr

输出类似:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
     42 eventpoll
     18 timerfd
      5 signalfd

注意几点:

  • 2>/dev/null 必须加,因为进程可能在扫描过程中关闭部分 fd,导致 /proc/PID/fdinfo/N 文件消失,触发 warning
  • 某些旧内核(如 3.10)的 fdinfo 不输出 type:,而是用 fanotify: 或无标识,此时需结合 readlink /proc/PID/fd/N 看是否含 anon_inode:
  • epoll_create1(0) 和 epoll_create() 都生成 eventpoll 类型,无需区分

这些 fd 为什么容易堆积而不释放

根本原因不是“忘了 close”,而是它们常被封装在库或框架内部,生命周期脱离开发者直觉控制:

  • eventpoll:libuv、Node.js、Nginx、Redis 的事件循环都重度依赖;若 epoll 实例未被显式 close()(比如线程异常退出、对象析构失败),fd 就泄漏
  • signalfd:Go runtime 在启动时创建一个全局 signalfd 用于信号转发,但不会随 goroutine 退出而销毁;glibc 的 pthread_atfork 注册也可能隐式创建
  • timerfd:Java NIO 的 EPollArrayWrapper、Rust 的 mio、Python 的 asyncio 都用它实现超时调度;若定时器未 cancel 就丢弃引用(如 asyncio.Task 被 gc 但底层 timerfd 未关),fd 就滞留

它们都不占磁盘 inode,也不出现在 lsof -i 或 lsof -U 中,纯属内核资源,所以 ulimit -n 到了就直接 EMFILE,毫无缓冲。

如何定位是哪个模块创建的 eventpoll / timerfd

单靠 fdinfo 只能知道类型,不能回溯调用栈。需要运行时干预:

  • 用 strace -e trace=epoll_create,epoll_create1,signalfd,timerfd_create -p PID 抓创建点(注意开销大,慎用于生产)
  • 若进程支持 /proc/PID/stack(需内核开启 CONFIG_PROC_KCORE),可在 fdinfo 发现大量 eventpoll 后,立刻 cat /proc/PID/stack 看当前所有线程的内核态调用链,找频繁出现 do_epoll_wait 或 sys_timerfd_create 的线程
  • 对 Go 程序:kill -SIGQUIT PID 输出 goroutine stack,搜索 epollwait 或 timerfd 相关调用;Java 可用 jstack + Unsafe.park 上下文辅助判断

最隐蔽的情况是:C++ RAII 对象析构函数里 close 失败(比如被 signal 中断),或多线程环境下 close 被重复调用导致 EBADF 后静默忽略——这类 bug 不会报错,但 fd 就永远卡在那儿。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

106

2025.12.22

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

278

2026.02.11

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

622

2026.03.05

Rust 系统编程入门与实战
Rust 系统编程入门与实战

统讲解近年最受关注的系统级编程语言 Rust 的核心知识体系,涵盖 Rust 的安装与 Cargo 项目管理、变量绑定与不可变性设计哲学、所有权(Ownership)/ 借用(Borrowing)/ 生命周期(Lifetime)三大核心概念、结构体/枚举与模式匹配(match)、Trait 特征系统与泛型编程、错误处理(Result/Option)、智能指针(Box/Rc/Arc)、并发编程的无畏并发(Fearless Concurre

477

2026.05.29

Rust异步网络服务与Tokio Runtime深度实践
Rust异步网络服务与Tokio Runtime深度实践

本专题围绕 Rust 在高并发网络服务中的应用展开,系统讲解 Tokio 异步运行时、任务调度模型、Future 执行机制以及高性能网络编程方式。结合实际服务端案例,帮助开发者构建低延迟、高可靠的异步服务架构。

276

2026.06.29

nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3867

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

6645

2023.08.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn