由于以下情况,我刚刚失去了几天:
我正在运行一个 NodeJS 控制台应用程序,主要来自 VS Code。该应用程序从网络上抓取各种数据和文件。自然地,它处理大量的 HTTP 请求和磁盘读写。
在某个时间点,我注意到该应用程序开始在运行过程中退出。 VS Code 中没有说明原因。我排除了常见的原因:
- 这不是异常或未处理的错误:“在所有异常时中断”没有帮助,并且日志中没有异常消息。
process.on('uncaughtException', ...)
也没有帮助。 - 都不是被拒绝的 Promise:
process.on('unhandledRejection', ...)
没有结果。
这向我表明了更深层次的原因,比如内存泄漏。但是应用程序的内存使用率几乎保持不变,而且不高。
经过更多调试后,我注意到在崩溃前不久,所有 writeFile
promise 都挂起。该应用无法再写入文件。
最后,崩溃的原因是文件句柄泄漏,即调用了fs.createReadStream
,文件流没有close
d .在大约 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/