Nodejs中ImageMagick遇到 spawn Unknown system errno 12
Nodejs中ImageMagick遇到 spawn Unknown system errno 12
ImageMagick 遇到 spawn Unknown system errno 12 的问题。是代码的问题还是ImageMagick的问题呢?用的node-ImageMagick。开始程序木问题,跑了一阵以后出现的,裁切图片调用ImageMagick报内存溢出了。。why?
莫非我逻辑写的有问题= =?有同学遇到过的吗。
Nodejs中ImageMagick遇到 spawn Unknown system errno 12
在使用Node.js进行图像处理时,如果你遇到了spawn Unknown system errno 12
的问题,这通常意味着系统资源(如内存或文件描述符)耗尽了。errno 12通常表示ENOMEM
,即内存不足错误。这种问题可能由多种因素引起,包括但不限于代码逻辑、系统资源限制等。
可能的原因:
- 内存限制:如果你的应用程序在长时间运行后频繁地创建大量子进程来执行图像处理任务,可能会导致内存不足。
- 文件描述符限制:每个进程都有一个文件描述符的限制,如果同时打开太多文件(包括临时文件),也可能导致这个问题。
- 代码逻辑问题:可能存在一些未释放的资源,导致内存泄漏。
示例代码与调试步骤:
假设你使用的是sharp
库(这是一个高性能的图像处理库,推荐用于生产环境)而不是node-imagemagick
,因为后者已不再维护。
const sharp = require('sharp');
async function processImages(images) {
for (const image of images) {
try {
await sharp(image.path)
.resize(800, 600)
.toFile(`processed_${image.name}`);
} catch (error) {
console.error(`Error processing ${image.name}:`, error);
}
}
}
// 模拟一批需要处理的图片
const images = [
{ path: 'path/to/image1.jpg', name: 'image1.jpg' },
{ path: 'path/to/image2.jpg', name: 'image2.jpg' },
// 添加更多图片...
];
processImages(images).catch(console.error);
调试与优化建议:
- 检查内存使用情况:使用
process.memoryUsage()
检查内存使用情况,并确保没有内存泄漏。 - 增加文件描述符限制:通过修改系统配置或使用
ulimit
命令增加文件描述符限制。 - 异步处理:确保你的代码是异步的,避免阻塞事件循环。
- 资源管理:确保在完成操作后及时关闭文件句柄。
通过以上方法,你可以更好地理解和解决spawn Unknown system errno 12
的问题。如果问题仍然存在,考虑查看是否有其他进程占用过多资源,或者尝试调整系统级别的资源限制。
我就是在forEach里用了个resize。。。= =
目测可能是我把ImageMagick处理的函数在每个app.get的handle里都定义了?
我已经把处理图片的部分单独提出来放在外面了。。观察下是否还会有泄露问题。
forEach 里 ImageMagick 一下子开得太多了吧?
ImageMagick 的 resize 操作还是比较费资源的,排成队列一个个处理可能会比较好
上代码吧, 或者贴 Gist 的链接
今天发现又出错了。
Express 500 Error: spawn Unknown system errno 12 at errnoException (child_process.js:481:11) at ChildProcess.spawn (child_process.js:444:11) at Object.spawn (child_process.js:342:9) at exec2 (/home/tuer/node_modules/imagemagick/imagemagick.js:22:25) at Object.convert (/home/tuer/node_modules/imagemagick/imagemagick.js:189:10) at /home/tuer/node_modules/imagemagick/imagemagick.js:194:22 at Object.resize (/home/tuer/node_modules/imagemagick/imagemagick.js:207:10) at /home/tuer/lib/util.js:163:16 at Array.forEach (native) at /home/tuer/lib/util.js:155:11
看来还是有内存溢出的问题。
嗯 我明天改成forEachLimit试一试。
有种猜测,foreach的时候开了多个convert,中途又有意外中断了进程,可并没有kill掉。。
去看了源码,不知道是否这种情况导致,明天写单独的例子测试吧。
楼主:我可以给你提几个建议吗? 一:expressjs 本身已经是WEB server,你根本不需要nginx 二:居然你的前端是有jquery库加载了,就没必要seajs 三:文件(图片)上传(包括市场缩略图)的功能,node.js现在也有很多成熟插件了. 上传文件就直接用那expressjs自带的就行了:http://cnodejs.org/topic/4f40a4dc0feaaa4424081758 缩略图的模块:https://github.com/joyent/node/wiki/modules#wiki-graphics
啊。。。
1,确实expressjs本身就是web server了。但是node的端口和我服务器上其他占用80端口的服务冲突呀。。。所以,我就用nginx给代理了,并且在nginx里设置一些规则,也挺方便,还有指定静态资源,也很方便,承载性也比node的要好些。
2,seajs和jquery没啥冲突的啊。。我是在用seajs加载的我每个page的conf。和jquery没啥关系。。我也没有把jquery写成模块,因为我可能有时候需要在页面里写些js。
3,文件上传我用的就是express自带的咯,imageMagick难道不是wiki-graphics里的模块么…… 我就是参照的这个wiki的~其他更好的模块还有一个node-canvas,我也在用~
感谢你的回复啊!~
在Node.js中使用ImageMagick遇到spawn Unknown system errno 12
错误通常与系统资源限制或执行环境有关。错误码12表示ENOMEM
,即内存不足。这可能是由于长时间运行的进程导致系统资源耗尽,或者因为Node.js进程本身达到了内存限制。
可能的原因:
- 内存限制:Node.js进程可能达到了JavaScript引擎的内存限制。
- 系统资源:操作系统可能对进程的内存使用设有限制。
- ImageMagick配置:ImageMagick自身的内存配置可能需要调整。
解决方案:
1. 调整Node.js内存限制
你可以尝试增加Node.js进程的内存限制,通过启动参数设置:
node --max-old-space-size=4096 your-script.js
这里的4096
表示以MB为单位的最大内存大小。根据实际情况调整此值。
2. 检查ImageMagick配置
确保ImageMagick没有达到其内部的内存限制。可以在调用ImageMagick前设置环境变量来调整其内存使用:
process.env.MAGICK_MEMORY_LIMIT = '512MB';
process.env.MAGICK_AREA_LIMIT = '512MB';
上述代码将ImageMagick的内存限制调整为512MB。
示例代码:
const Imagemagick = require('imagemagick');
// 设置ImageMagick内存限制
process.env.MAGICK_MEMORY_LIMIT = '512MB';
process.env.MAGICK_AREA_LIMIT = '512MB';
Imagemagick.convert(['input.jpg', '-crop', '100x100+0+0', 'output.jpg'], (err, stdout) => {
if (err) throw err;
console.log('Cropping complete!');
});
总结
确保你的Node.js进程有足够的内存,并适当调整ImageMagick的内存使用限制。如果问题仍然存在,可能需要进一步检查系统级别的资源限制。