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
相关产品推荐
相关产品推荐

