【问题标题】:Node.JS Memory problem, Heroku Error R14 (Memory quota exceeded)Node.JS 内存问题,Heroku 错误 R14(超出内存配额)
【发布时间】:2020-11-23 11:38:42
【问题描述】:

我在 heroku 上运行我的 Node.JS API 时遇到了一些内存问题(RAM 限制为 512mb)。 Heroku 记录以下内容:

2020-08-03T11:31:41.084066+00:00 heroku[web.1]:进程正在运行 内存=950M(185.6%)

2020-08-03T11:31:41.086357+00:00 heroku[web.1]:错误 R14(内存 超出配额)

这发生在其他一些小任务中的请求:

  • 发送以 base64 编码的图像
  • 从该图像创建缓冲区
  • 通过“sharp”模块对图像进行3次处理(需要检查图像是否垂直,然后创建2个不同的图像)
  • 将图像一次调整为大像素尺寸(即 10000x7000 像素)
  • 将图像上传到 FTP 服务器。

我正在使用的图像是大型打印图像(超过 1000x1000 像素)。

如果您认为有必要,我可以发布代码示例,但是您知道这种计算是否应该能够在 Heroku 上的 512mb 内存服务器上运行?或者我的代码可能存在内存泄漏?

【问题讨论】:

    标签: node.js heroku sharp


    【解决方案1】:

    我遇到了同样的问题,但我可以通过调用 sharp.cache(false) 禁用缓存来彻底抑制它。一个示例 sn-p 如下所示:

    const sharp = require('sharp');
    sharp.cache(false);
    
    // then do your sharp magic
    

    你可以在sharp docs找到更多关于缓存的信息。

    这是我在禁用缓存后释放后注意到的内存使用量下降。尽管如此,仍有一部分内存未释放,但情况比以前要好得多。

    As per this thread in sharp's github issues,除非您连续处理相同的图像,否则缓存不会显着提高性能。因此,如果您的应用程序不希望以这种方式处理相同的图像,您可能会看到内存使用情况有所改善。

    更多..

    另外,there is a memory fragmentation problem 显然是由于在 Linux 上使用 libuv 线程锐化处理图像时分配内存的方式。 There's a heroku buildpack 将 heroku dynos 配置为使用称为 jemalloc 的替代内存分配器,以减少内存碎片。虽然我个人没有看到使用它有明显的改进,但您可以尝试一下,看看它是否适合您。

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2023-03-28
      • 2013-10-01
      • 2017-11-02
      • 2014-07-14
      • 2014-10-15
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多