【问题标题】:nodejs fs seems greedynodejs fs 似乎很贪婪
【发布时间】:2013-10-22 06:02:16
【问题描述】:

我设置了一个gist 来显示一个小程序的内存使用情况,该小程序从磁盘流式传输文件。

process.memoryUsage() 中分配为rss 的内存永远不会下降。从其他项目中,我知道另一个文件读取将能够重用部分内存,但该内存永远不会释放。

我知道当其他一些进程正在满足内存时,操作系统可以占用未充分利用的内存并将其写入交换,但这只是一个临时修复(并且可能导致我的机器无缘无故地用完交换很好的理由)。

由于这个“泄漏”不在 javascript 堆中,我认为这与我流式传输此文件的方式无关,但我想确认一下。我应该做些什么来释放这段内存吗?

$ node -v
v0.10.20

【问题讨论】:

  • 是同一个文件吗?
  • 要点是一个任意示例,它只流式传输一个文件,但我的实际项目上传和写入/读取许多文件。
  • @PagodaJosh 很可能没有那么贪婪;文件描述符应该已经关闭(绑定到'close' 知道什么时候)。但是,V8 中的垃圾收集器可能尚未运行以释放流使用的内存。对我来说,在大约 330 MB 的文件中流式传输,在 'end''close' 之后,内存使用量下降了大约 45-50 秒。
  • @JonathanLonowski 我的要点显示超过 450 秒的节点保持约 122 兆。
  • @JonathanLonowski 如果你能用你的 330 MB 文件运行我的要点并发布你的结果,我将不胜感激

标签: node.js stream fs


【解决方案1】:

我遇到的问题归结为与您的问题非常相似的最小测试用例 - 我在 Web 服务器进程中对文件进行了即时 zip 压缩。

为了找到这个帖子的人 - 根据 the node.js bugreport you opened 上的 bnoordhuis,您必须使用选项调用您的脚本 --max_old_space_size=32 --expose_gc(将 32 MB 调整为您想要的任何内容)然后定期致电gc()。这对我的测试用例有帮助,希望对我的应用程序也有帮助。

默认限制为 1.5 GB。如果您只想流式传输一些文件,无需在服务器上做更多工作,无需记住状态,并且您在有很多其他事情要做的小型服务器上使用 node.js“以提高效率”,那就太令人惊讶了。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多