0

我正在使用 has5120 CPU8192 Memory. 有时在重负载下运行时(使用 S3 压缩大量图像imagemin或使用 S3 同步将文件从 S3 复制到本地计算机)我会收到ENOMEM错误消息。

这会导致 ECS 实例崩溃。

S3 同步命令通过 child_process spawn 执行,而 imagemin 包还生成一个子进程以压缩图像。 两个错误都显示在下面

(node:23) UnhandledPromiseRejectionWarning: Error: spawn ENOMEM
    at ChildProcess.spawn (internal/child_process.js:403:11)
    at spawn (child_process.js:553:9)
    at new SpawnTimeout (/app/src/utils/SpawnTimeout.ts:33:25)
    at s3Cp (/app/src/utils/s3.utils.ts:62:24)
    at copyFile (/app/src/utils/s3.utils.ts:52:10)
    at executeImageCompression (/app/src/processors/Processor.ts:63:9)

在此处输入图像描述

我尝试增加 ECS 资源并添加自定义-max-old-space-size,但没有帮助。

我看到了这篇文章 - Node.js catch ENOMEM error throw after spawn

但是我无法--memory-swap在 docker 中配置参数,因为部署是由其他人控制的。

请告诉我如何解决这个问题?

4

1 回答 1

1

内存分配给您调用的每个 child_process.spawn()。据我所知,imagemin 调用 child_process.spawn() 的次数可能超过了计算机可以处理的次数,导致 nodejs 分配的内存比计算机分配给新生成的 child_processes 的内存多,从而导致 ENOMEM 错误。要么,要么进程可能占用太多内存。这只是我的猜测,因为我看不到代码。

您可以尝试减少或限制生成的新 child_processes 的数量。

同样,此解决方案纯粹是推测性的,因为我无法访问您的代码,因此如果您可以将其添加到您的问题中将会很有帮助。

此链接可能会进一步帮助您: 如何限制 imagemin 中子进程的数量?

于 2021-12-30T09:21:00.210 回答