症状
进程运行一段时间后开始出现 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 错误。