← 中文资源

简体中文版本

Node.js EMFILE: 打开的文件过多

修复 Node.js 的 EMFILE 错误:进程因未关闭的流、文件监听或连接池耗尽文件描述符。

阅读英文原文

症状

进程运行一段时间后开始出现 EMFILE: too many open files,或者在一次性并发打开大量文件时立即报错。重启进程能暂时消除问题。

诊断

统计进程当前使用的描述符数量并与上限对比:

ls /proc/$(pgrep -f 'node server.js')/fd | wc -l
ulimit -n

然后用 lsof -p <pid> 查看占比最高的路径,反复出现的同一路径往往就是泄漏源。

修复

确定性地关闭资源并限制并发:

const handle = await fs.promises.open(p, 'r');
try {
  // ...read...
} finally {
  await handle.close();
}

批量读取时应分批处理(例如用 p-limit)而不是一次性全部发起,并在退出时销毁 watcher。

验证

重新施加负载并再次统计描述符数量:应趋于平稳而非持续增长,且不再出现新的 EMFILE 错误。