限制ImageMagick的内存使用

7
基本上,我试图将我的Nginx服务器内存使用保持在一定的范围内,因为我有点疯狂(按照我的朋友们的说法),并且我想省钱。然而,我担心ImageMagick可能会超过这个限制。
我使用了"-limit area 20MiB",我还尝试了"-limit memory 15MiB -limit map 15MiB",但是当通过"top -c (with Shift-M)"和"ps aux"检查进程(随着它的运行)时,它显示它使用的内存比我设置的限制要多,有时会使用35MB或40MB,而不是我预期的20MB/30MB。如果只多使用2MB或3MB,我不会介意,但这是相当大的偏差。
有人告诉我,额外的内存可能是ImageMagick的开销,因为它加载解释器等,但我对Unix程序不是很熟悉,所以在那个部门里一无所知。
如果有人能解释为什么会发生这种情况,那就太好了。如果这是正常的事情,那就太好了。我将调整一些东西,以考虑到它可能使用我的限制加上一定数量的内存,但如果它不是,而"-limit"参数不能将内存限制在一定数量的话,那么在ImageMagick中使用该参数的意义是什么?
再次感谢你的帮助,不胜感激。

有没有什么想法?这不是一个大问题,但我很希望有人能为此提供一些线索。 - Vunus
2个回答

2
根据文档,ImageMagick正在将所有内存操作移动到mmaped文件中,因此如果您有足够的磁盘空间,它将开始交换,详见手册:-limit部分:

文件的值是文件数。磁盘限制以千兆字节为单位,其他资源的值以兆字节为单位。默认情况下,限制为768个文件、1024MB内存、4096MB映射和无限的磁盘空间,但在能够提供可用资源信息的平台上,在启动时会进行调整。当达到限制时,ImageMagick将以某种方式失败,或者在可能的情况下采取补偿措施。例如,-limit memory 32 -limit map 64 限制了内存。当像素缓存达到内存限制时,它使用内存映射。当达到该限制时,它将转向磁盘。如果磁盘有硬限制,则程序将失败。


1
我肯定有足够的磁盘空间(50GB+),但它似乎仍在使用超过通过-limit参数设置的数量。对于评论的大延迟感到抱歉,我已经忘记了我提出了这个问题,因为ImageMagick似乎表现良好,尽管这仍然是一个问题。 - Vunus
尝试从svn安装,也许你的版本有bug? - Arman
我相信这与我的主机系统有关。自从我转移到另一个主机后,我可以自己安装ImageMagik,并且一直没有出现问题。 - Vunus

2
这些限制仅影响ImageMagick的像素缓存。程序代码和库/代理可能执行的任何加载或处理图像的操作都不受这些设置的影响。
在top命令中,你没有指定要查看的内容,正确的列名显然应该是RES或RSIZE。当限制值很小,例如20MiB时,程序和库代码将占据相当大的常驻内存大小。
为了验证你在环境变量中使用的单位是否正确,请使用 "identify -list resource" 命令。如果内存像素缓存的大小 (MAGICK_MEMORY_LIMIT) 对于一张图片来说不足够,那么将使用一个mmap文件 (MAGICK_MAP_LIMIT),如果该限制过低,则会使用一个传统的磁盘文件 (MAGICK_DISK_LIMIT)。如果所有限制都太低,ImageMagick 将立即失败,并显示如下错误信息:cache resources exhaustedMemory allocation failedcorrupt image

所以,额外使用的内存实际上可能是库本身被加载到内存中,那么额外的10MB大约是正确的吗?我正在查看RES,它通常会在我的设定限制之上增加额外的8-10MB,因此我一直假设这是程序开销,并已调整了我的服务器内存来适应它。感谢您的答案。 - Vunus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接