node.js - 如何在 NodeJS 中检测 "file handle leak"?

标签 node.js windows filehandle

由于以下情况,我刚刚失去了几天:

我正在运行一个 NodeJS 控制台应用程序,主要来自 VS Code。该应用程序从网络上抓取各种数据和文件。自然地,它处理大量的 HTTP 请求和磁盘读写。

在某个时间点,我注意到该应用程序开始在运行过程中退出。 VS Code 中没有说明原因。我排除了常见的原因:

  • 这不是异常或未处理的错误:“在所有异常时中断”没有帮助,并且日志中没有异常消息。 process.on('uncaughtException', ...) 也没有帮助。
  • 都不是被拒绝的 Promise:process.on('unhandledRejection', ...) 没有结果。

这向我表明了更深层次的原因,比如内存泄漏。但是应用程序的内存使用率几乎保持不变,而且不高。

经过更多调试后,我注意到在崩溃前不久,所有 writeFile promise 都挂起。该应用无法再写入文件。

最后,崩溃的原因是文件句柄泄漏,即调用了fs.createReadStream,文件流没有closed .在大约 5,000 个打开的文件句柄处,进程崩溃了,没有任何关于原因的指示。

有没有一种方法可以检测到崩溃的原因,比如我可以启用的一些日志记录可以显示原因?如果是内存泄漏,我会看到一个增加应用程序的内存使用量,可能还有一些“内存压力”警告。但是该进程运行良好(至少如 SysInternals 的 Process Explorer 所示),然后它就崩溃了,没有任何关于原因的提示。

最佳答案

也许这个库可以帮助你。

库调用泄漏句柄 https://www.npmjs.com/package/leaked-handles , ut用于测试

关于node.js - 如何在 NodeJS 中检测 "file handle leak"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202998/

相关文章:

php - 如何将php,nodejs和mysql应用程序部署到IBM Cloud

windows - 平滑圆窗角

perl - 如何使用 tie() 仅为某些包重定向 STDOUT、STDERR?

Java 文件句柄不会关闭

javascript - 在nodejs中使用promise的同步方式

javascript - 如何使用 npm 将 PDF.JS 导入 Typescript

mysql - 我如何使用全局变量从 mysql 表设置查询 id?

windows - 将我的 cloudService 内容从 Subscription1 复制到 Subscription2

java - 将 IntelliJ IDEA 项目转换为 Eclipse

perl - 如何取消引用 STDIN 文件句柄的副本?