http://www.laruence.com/2011/03/04/1894.html

前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨。

情景:线上图片服务压缩的图片品质(100),缩略图品质(100)占用了很多空间,导致后来又55个文件了(占用空间160G)才发现这个问题。现在需要解决的是把这部分压缩个低品质的缩略图节省空间(当然在这个硬盘白菜价的时代搞这样的问题没这个必要,我这里讨论的不是节省空间是想找出内存消耗问题)。我用php脚本重新生成缩略图的时候,通过top发现内存消耗一直增加导致后来脚本报错内存不够了,到底谁动了我的内存?

处理代码版本一(php):

  1. set_time_limit(0);
  2. function thumbnailimage($img,$width,$height,$savefile){
  3. $new_img = imagecreatetruecolor ( $width, $height );
  4. imagedestroy($new_img);
  5. }
  6. //$list:是那个55万的文件名
  7. foreache($list as $v) {
  8. $img = imagecreatefromjpeg($v);
  9. thumbnailimage($img,480,300,$savepath);
  10. imagedestroy($img);
  11. }

这个脚本处理了5千多个的时候,由于内存不够用挂了,然后我改了php.ini里面的memory_limit改成了5G,但是随着脚本的执行,内存也会被消耗殆尽。

于是我就以为是php的内存泄露了,然后就想用其他方案解决,在老王的技术手册里面看到GraphicsMagick这个工具,然后写了个脚本去处理,结果发现top看到的内存消耗还是一直增加,然后经人提示这个应该是系统操作文件(写文件)文件被缓存了消耗了内存,

调整bash脚本,处理一张图片后手动释放一下内存(sync && echo 3 > /proc/sys/vm/drop_caches),然后top看到的内存消耗就正常了。

由于这个bash脚本处理的速度还不如php的gd库处理,然后就换成php处理。

验证php脚本内存消耗的原因:

处理代码版本二(php):

  1. set_time_limit(0);
  2. function thumbnailimage($img,$width,$height,$savefile){
  3. $new_img = imagecreatetruecolor ( $width, $height );
  4. ...
  5. imagedestroy($new_img);
  6. }
  7. //$list:是那个55万的文件名
  8. foreache($list as $v) {
  9. $memory1=memory_get_usage();
  10. file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
  11. $img = imagecreatefromjpeg($v);
  12. thumbnailimage($img,480,300,$savepath);
  13. imagedestroy($img);
  14. $memory1=memory_get_usage();
  15. file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
  16. system('sync && echo 3 > /proc/sys/vm/drop_caches');
  17. }

通这个版本处理内存消耗就正常了,当然php进程也要消耗内存,php.ini的memory_limit稍微改大一下。

从这里看来消耗内存的是系统操作文件消耗的,不是php,由于我的无知一开始错怪了PHP。

结尾:这个例子只是简单的描述我找到内存消耗的原因。

 
我按照上面的指示做了一遍,果然见效,参见下面的截图。

最后,我总结一下:

所谓的dom内存泄露或者其他php脚本的内存泄露,其实不是真正的内存泄露,因为php进程在运行时res显示项很平稳,对于used和cached的变化,那是Linux的内存管理机制在起作用。

再次感谢这两位朋友,让我解开了困扰许久的问题。

最新文章

  1. Table 固定表头的几种方法
  2. ubuntu/var/log/下各个日志文件
  3. Bash Shell字符串操作
  4. [转]为什么使用 Redis及其产品定位
  5. javascript平时小例子②(正则表达式验证邮箱)
  6. sina第三方登录
  7. Window7中Eclipse运行MapReduce程序报错的问题
  8. nyoj重建二叉树(不真的建立)
  9. Angular2 - Starter - Component and Component Lifecircle Hooks
  10. 并查集hdu1232
  11. NetAnalyzer笔记 之 八 NetAnalyzer2016使用方法(2)
  12. HDFS配额管理(实战)
  13. OSM数据下载地址
  14. Java与C之间的socket通信
  15. self-sizing cell的一个问题
  16. Mask RCNN 源码阅读(update)
  17. 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(上)
  18. [转]VC++宏与预处理使用方法总结
  19. html文件中jquery与velocity变量中的$冲突的解决方法
  20. ELK 方案

热门文章

  1. 基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台
  2. Axios跨域实例
  3. C++11的新特性:右值引用
  4. python3-返回函数
  5. DispatcherServlet的工作原理
  6. css 响应式(媒介查询)
  7. [BZOJ] 聚会
  8. Primary Key Increase by Trigger
  9. 用树状数组写的最长上升子序列(友好城市),nlogn。
  10. [luogu]P1133 教主的花园[DP]