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
- 通常情况下,只会在堆内存中处理图片
- 堆内存不够用时,帧缓存使用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的更多相关文章
- 设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换
目录 任务描述 解决方案 Magick++ Talk is cheap, show me the code. 与 Opencv 配合 相关链接 任务描述 我有这样一个需求,读取一张格式为PNG 或者 ...
- linux下安装php的imagick扩展模块(附php升级脚本)
imagick是一个PHP的扩展,是一套软件系列,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的A ...
- 使用普通用户执行 docker
CentOS 版本 7.4,Docker 版本 docker-1.13 及以下 ll /var/run/docker.sock srw-rw----. 1 root root 0 May 25 14: ...
- 超级NB的防DDOS(小量级)攻击的脚本
# tree /usr/local/ddos/ /usr/local/ddos/ ├── ddos.conf ├── ddos.sh ├── ignore.ip.list └── LICENSE di ...
- 使用DDOS deflate抵御少量DDOS攻击
DDoS-Deflate是一款非常小巧的防御和减轻DDoS攻击的工具,它可以通过监测netstat来跟踪来创建大量互联网连接的IP地址信息,通过APF或IPTABLES禁止或阻档这些非常IP地址. 工 ...
- 内存管理 初始化(六)vmalloc_init 及 ioremap
是不是我错了,本想这个函数会如网上所说将进行非连续内存管理的初始化,但是对于2.6.34的ARM架构而言,该函数实际完成的业务非常少. 内存管理的初始化读到此处,我感觉原有的认识存在很大缺陷: (1) ...
- mosquitto --- 单向认证
1.生成证书要单向配置SSL 需要 做三项前置工作 1. 生成CA证书 2.生成server 端证书,server 端key github 的一个开源项目已经做到这点 ,详情可见 https://gi ...
- Mosquitto 单向SSL配置
Mosquitto 单向SSL配置 摘自:https://blog.csdn.net/a_bcd_123/article/details/70167833 2017年04月14日 06:56:06 s ...
- docker(二):CentOS安装docker
前置条件 1. CentOS 7:要求系统为64位.系统内核版本为 3.10 以上 使用如下命令,查看机器配置 lsb_release -a uname -a 2. 关闭防火墙 systemctl s ...
随机推荐
- linux多线程示例
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h& ...
- linux网络编程之网络函数详解
1.epoll_create函数 函数声明:int epoll_create(int size) 该 函数生成一个epoll专用的文件描述符.它其实是在内核申请一空间,用来存放你想关注的socket ...
- union 和 union all 有什么不同?
假设我们有一个表 Student, 包括以下字段与数据:drop table student;create table student( idint primary key,name nvarchar ...
- JavaBean组件在JSP文档中的应用
Bean: package cn.donghaua.bean; public class StringBean { private String message = "No message ...
- loaded some nib but the view outlet was not set
链接地址:http://www.cnblogs.com/TivonStone/archive/2012/04/20/2460116.html 当使用 initWithNibName 函数, 并使用 由 ...
- 梳理下phpmyadmin改root密码后登录不上的问题。
一, 登陆phpmyadmin,然后点击左侧进入mysql数据库,在顶部点击“mysql”进入sql输入界面.输入以下命令: update user set password=password('12 ...
- Symfony框架系列----1.入门安装
一.安装 (1)Composer安装(可选) $ curl -s https://getcomposer.org/installer | php $ php composer.phar crea ...
- Net Core WebAPI
Net Core WebAPI .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以 ...
- 启用Apache Mod_rewrite模块
Ubuntu 环境 在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块. 另外,也可以通过将 /etc/apache2/mods-available ...
- DllMain加载其他DLL造成的死锁问题及其解决办法
使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+.我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance ...