imagemagick /tmp/magick-xxxxxxxx
问题
imagemagick在某种场景下会狂写/tmp目录,文件名形如magick-xxxxxxxx,
ls -lh查看这些文件达到几百G,
du -sh查看则只有几十M
被这个问题折磨了许久,大晚上收报警、出去玩收报警的感觉你懂的。。。
忍够了!!!
原因
google发现imagemagick的资源管理](Cache Storage and Resource Requirements章节):http://www.imagemagick.org/script/architecture.php
imagemagick内部有个帧缓存(pixel cache),用于提升存储和处理速度,其大小与图片的尺寸、位深正相关。随着图片尺寸的增大,其存储介质会做出相应调整:
- 通常情况下,只会在堆内存中处理图片
- 堆内存不够用时,帧缓存使用anonymous map
- anonymous map不够用时,使用硬盘作为帧缓存,并硬盘映射到内存中
- 内存映射所需内存仍不够用时,只能使用磁盘作为缓存,其性能严重依赖磁盘IO性能
至于使用哪个缓存介质是由Imagemagick依据所配置的资源限制参数来自动决定的,我们可以修改这些参数,但修改这几个参数都只是缓解症状,无法避免图片较大时还是要写硬盘。
解决方案
阅读代码发现可以通过三种方式修改临时文件存放目录:
- 注册表
- convert -define registry:temporary-path=/data/tmp logo: -resize 250000x250000 logo.miff
- 环境变量
- policy.xml
遗憾的是,基于php imagick扩展无法修改帧缓存目录,三种方案均依赖于系统环境配置。好在我们的php框架可以方便的设定环境变量,算是巧妙地将所依赖的环境控制在项目范围内
PS:
imagemagick选择帧缓存目录相关源码:
- //magick/resource.c
- (void) CopyMagickString(path,"magick-XXXXXXXX",MaxTextExtent);
- exception=AcquireExceptionInfo();
- directory=(char *) GetImageRegistry(StringRegistryType,"temporary-path",
- exception);
- exception=DestroyExceptionInfo(exception);
- if (directory == (char *) NULL)
- directory=GetEnvironmentValue("MAGICK_TEMPORARY_PATH");
- printf("tmp path:%s\n",directory);
- if (directory == (char *) NULL)
- directory=GetEnvironmentValue("MAGICK_TMPDIR");
- if (directory == (char *) NULL)
- directory=GetPolicyValue("temporary-path");
本文转自博客园知识天地的博客,原文链接:imagemagick /tmp/magick-xxxxxxxx,如需转载请自行联系原博主。
imagemagick /tmp/magick-xxxxxxxx相关推荐
- 【c++开发】C++ Linux Ubuntu imagemagick以及magick++安装;c++调用magick++库;找不到Magick++.h
ubuntu系统自带的imagemagick没有c++函数库,需要能重新下载一个新一点的库,重新编译并且安装 一.教程 官网详细教程:https://imagemagick.org/script/in ...
- java imagemagick 接口_ImageMagick安装及使用教程
ImageMagick是一套功能强大且免费的图片处理开发包,可以用来读,写和处理多种格式的图片文件. 本节介绍下ImageMagick的安装与使用方法. 1.imagemagick安装 以linux下 ...
- Linux - ImageMagick 6.9.10-5安装配置
==-------------------------------------------------------------------------------------------------- ...
- linux下安装php的imagick扩展模块(附php升级脚本)
imagick是一个PHP的扩展,是一套软件系列,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的A ...
- DoS Deflate Iptables
DoS Deflate 是一个轻量级阻止拒绝服务***的bash shell脚本.我们可以根据自己需要修改特定参数,来达到目的! 安装/卸载都很简单,分别执行下面三步就可以了: wget http:/ ...
- 使用macOS自带convert,sips命令快速处理图片及转换图片格式
写在前面 最近有需求转换图片的格式, 例如 将.PDF转换为.png以便CSDN编辑器上传(如果直接使用截图会显得比较麻烦,多费一道手续), 或是将微信的一些图片制作成表情包(需要转换图片为.gif格 ...
- 您如何合并两个Git存储库?
请考虑以下情形: 我在自己的Git存储库中开发了一个小型实验项目A. 它现在已经成熟,我希望A成为较大项目B的一部分,该项目B具有自己的大型存储库. 我现在想将A添加为B的子目录. 如何将A合并为B, ...
- 超级NB的防DDOS(小量级)攻击的脚本
# tree /usr/local/ddos/ /usr/local/ddos/ ├── ddos.conf ├── ddos.sh ├── ignore.ip.list └── LICENSE0 d ...
- ZXing vs ZBar: 开源条形码SDK性能PK
很多手机app条形码应用都使用了ZXing和ZBar两个开源条形码SDK.那么从检测速度和检测率看哪个更出色呢?ZXing用Java实现,ZBar用C/C++实现,为了确保公平,这里用JNI封装ZBa ...
- 关于解决VS2008ODBC连接MySQL时“绑定所有列“程序崩溃问题
2012年5月20更新: 1. 连Oracle没有这个问题,修改了标题 2.可以使用VC6生成这些东西,不过和VS2008生成的有一些不同. ============== 这两天做数据库实验,VS20 ...
最新文章
- 对话云知声李霄寒:不计成本研发芯片,探索语音之外的“硬”实力
- 面试官:关于Spring就问这13个
- 【Android 应用开发】Android 图表绘制 achartengine 示例解析
- 分布式经典书籍--深入分布式缓存 从原理到实践
- SpringMVC入门案例
- 被围绕的区域(dfs)
- Python Django 模板继承(header,body,footer抽取)
- 怎么查看python是多少位_python+位数
- HDOJ 1056 HangOver
- 如何让ios app支持32位和64位?
- yum只下载软件不安装的两种方法
- .view-content:overflow:hidden 大错误
- Java HashSet的元素内容变化导致的问题
- PMON分析(1)- ROM阶段
- 浅析企业供应链管理和供应链战略
- 长方形图片填充为正方形
- Git查看本地配置信息
- Typescript的优缺点和面试题
- linux文件名补全,Linux中10个关于命令行自动补全的技巧
- mfc chartctrl 饼状图编写_南瓜糯米饼:外酥里糯,吃到嘴巴里,真是舌尖上的享受...