You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React应用在Ubuntu服务器耗尽文件描述符,数日内崩溃求排查

React应用serve部署文件描述符泄漏排查方案

核心排查方向(结合最近变更:依赖更新、yarn替换)

1. serve 版本或依赖树变化导致的句柄泄漏

换用yarn后,可能拉取了与原npm环境不同的serve版本,或间接依赖出现变更,引入了文件打开未关闭的bug。

  • 操作步骤:
    • 对比新旧环境的serve版本:执行 serve --version,确认是否与npm时代的版本一致
    • 回退serve至旧版本测试:yarn add serve@<旧版本号>,启动后观察文件描述符增长情况
    • 检查serve官方issues,搜索"file descriptor leak"或"index.html open not close",确认是否为已知bug

2. yarn依赖解析差异引发的间接依赖问题

yarn与npm的依赖解析逻辑不同,可能引入了存在泄漏问题的底层依赖(如send、mime等serve依赖包)。

  • 操作步骤:
    • 导出新旧环境的依赖树:旧环境执行 npm list --depth=0,新环境执行 yarn list --depth=0,对比差异包
    • 重点聚焦文件IO相关依赖,逐个替换为npm环境的版本,验证是否解决泄漏

3. SSE功能与serve的兼容性冲突

虽然此前无问题,但依赖更新可能导致SSE连接未正确释放,或与serve的静态文件处理逻辑冲突。

  • 操作步骤:
    • 临时关闭SSE功能,启动应用后观察文件描述符是否仍增长,确认是否相关
    • 检查SSE实现代码:确保客户端断开连接时,服务器端正确调用response.end()释放资源
    • 用 netstat -anp | grep <serve_pid> 查看是否存在大量未关闭的socket连接

4. Jenkins运行环境的进程干扰

Jenkins的日志收集或进程管理逻辑可能间接导致句柄泄漏,需排除环境影响。

  • 操作步骤:
    • 直接在服务器终端启动serve(脱离Jenkins),观察文件描述符增长情况
    • 用 lsof -p <serve_pid> | grep index.html 统计打开的index.html实例数量,确认泄漏来源

诊断工具命令

  • 实时查看进程打开的文件:lsof -p <serve_pid> | grep index.html
  • 检查进程文件描述符限制:cat /proc/<serve_pid>/limits | grep "Max open files"
  • 跟踪文件系统调用:strace -p <serve_pid> -e open,close,验证index.html打开后是否有对应的close调用

内容的提问来源于stack exchange,提问作者Aditya T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:25:23