我在一个带有has 5120 CPU和8192 Memory的AWS机器上运行Node 14。有时,在重载运行(使用imagemin压缩大量图像或使用S3同步将文件从S3复制到本地计算机)时,会出现ENOMEM错误。
这将导致ECS实例崩溃。
S3同步命令通过child_process派生执行,而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 thrown after spawn
但是我不能在码头上配置--memory-swap参数,因为部署是由其他人控制的。
请告诉我如何解决这个问题?
发布于 2021-12-30 09:21:00
内存分配给您调用的每个child_process.spawn()。据我所见,imagemin调用child_process.spawn()的次数可能超过计算机所能处理的次数,从而导致nodejs分配的内存比计算机分配给新生成的child_processes的内存多,从而导致ENOMEM错误。或者是进程占用了太多的内存。这只是我的猜测,因为我看不见密码。
您可以尝试减少或限制生成的新child_processes的数量。
同样,这个解决方案纯粹是推测性的,因为我没有访问您的代码的权限,所以如果您可以将它添加到您的问题中将是有帮助的。
此链接可能进一步帮助您:How can I limit the number of child proccesses in imagemin?
https://stackoverflow.com/questions/70529220
复制相似问题