【问题标题】:Node JS memory management on ARM single boardARM单板上的Node JS内存管理
【发布时间】:2019-08-27 23:44:22
【问题描述】:

我正在使用清晰的图像处理模块来调整图像大小并将其呈现在 UI 上。

app.get('/api/preview-small/:filename',(req,res)=>{
    let filename = req.params.filename;


    sharp('files/' + filename)
        .resize(200, 200, {
            fit: sharp.fit.inside,
            withoutEnlargement: true
        })
        .toFormat('jpeg')
        .toBuffer()
        .then(function(outputBuffer) {
            res.writeHead('200',{"Content-Type":"image/jpeg"});
            res.write(outputBuffer);
            res.end();
        });

});

我在具有 1 GB 内存的单板计算机 Rock64 上运行上述代码。当我运行 Linux htop 命令并监控内存利用率时,我可以看到在每次调用 nodejs 应用程序后,内存使用率呈指数增长,从 10% 增加到 60%,并且从未下降。

CPU 使用率

虽然运行应用程序没有任何问题,但我唯一担心的是内存使用量不会下降,即使应用程序未运行也是如此,我不确定如果此应用程序连续运行最终是否会导致应用程序崩溃。

或者如果我将类似的代码 sn-p 移动到云端,即使它没有运行,它是否会继续占用内存?

任何使用sharp模块的人都面临类似的问题,或者这是node.js的一个已知问题。我们是否有办法清除/清除内存或节点会进行垃圾收集?

感谢任何帮助。谢谢

【问题讨论】:

  • 我想知道你的sharp库是否有本机代码并且没有对自己的内存进行适当的清理。如果您不保留对图像的引用,Node 将进行自己的垃圾收集。但是,你不能从 htop 命令看到它的垃圾收集,因为内存可能在 node.js 内部是空闲的,但没有返回给操作系统。您可以使用 node.js 内部的堆快照来查看 node.js 内部分配的内存是否在稳步攀升。
  • 我不确定管理内存的能力如何,但从我的代码来看,我没有保留对图像的任何引用。另外,我将在 node.js 中尝试堆快照。谢谢。我会更新我发现的

标签: node.js memory-management memory-leaks sharp


【解决方案1】:

sharp 内置了一些内存调试功能:

http://sharp.dimens.io/en/stable/api-utility/#cache

您可以控制 libvips 缓存,并获取有关资源使用情况的统计信息。

节点版本对内存行为有非常强烈的影响。这已经在尖锐问题跟踪器上进行了很多讨论,例如:

https://github.com/lovell/sharp/issues/429

或许:

https://github.com/lovell/sharp/issues/778

【讨论】:

  • 当然我会试试这个,我观察到,如果我在 raspberry pi 中运行相同的代码,它会正确进行内存管理,但在 rock64 中它不会清理内存。
  • 两台机器上的不同节点版本,我猜。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2017-12-15
  • 1970-01-01
  • 2015-04-01
  • 2016-06-10
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多