valgrind 检测 php-fpm 内存泄漏

最近线上服务器安装了一些扩展,导致 php-fpm 内存增长过快,虽然可以通过配置最大请求数和定时脚本来重启 php-fpm ,但是也抱着学习折腾的精神来学习下valgrind的使用。 下面的配置都是在我自己的服务器上测试,就是该博客运行的服务器上。

下载安装

wget http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
tar -jxvf valgrind-3.12.0.tar.bz2
cd valgrind-3.12.0
./autogen.sh
./configure
make
make intall

下载地址:http://valgrind.org/downloads/current.html#current
可能需要升级automakeautoconf

修改 php-fpm 启动命令

我我的脚本是/etc/init.d/php-fpm,需要做两个修改:在启动脚本中增加环境变量USE_ZEND_ALLOC=0以及将bin文件由原来的php-fpm文件修改为由valgrind启动,并将valgrind的日志重定向到日志文件中。

+ export USE_ZEND_ALLOC=0

- php_fpm_BIN=${exec_prefix}/sbin/php-fpm
+ php_fpm_BIN="valgrind --leak-check=full --log-file=/data/log/valgrind-log-%p.log ${exec_prefix}/sbin/php-fpm"

重启 php-fpm

[root@VM_132_97_centos log]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@VM_132_97_centos log]#  ps afx|grep php-fpm.pid
15694 pts/0    S+     0:00  |       \_ grep php-fpm.pid
15677 ?        Ss     0:00 valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15678 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15679 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15680 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15681 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15682 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
15683 ?        S      0:00  \_ valgrind --log-file=/data/log/valgrind-log-%p.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
[root@VM_132_97_centos log]# ll |grep valgrind
-rw-r--r-- 1 root root      1090 12月  9 10:34 valgrind-log-15634.log

查看日志

==12378== Invalid read of size 8
==12378==    at 0x9CCCB5F: rndr_image (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD859A: char_link (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD64EF: parse_inline (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD970A: parse_paragraph (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDB500: parse_block (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDC0ED: sd_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCE690: php_sundown_markdon_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCEE1B: zim_sundown_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x8124FF: zend_do_fcall_common_helper_SPEC (zend_vm_execute.h:550)
==12378==    by 0x811A97: execute_ex (zend_vm_execute.h:363)
==12378==    by 0xA0EFC5E: hp_execute_ex (xhprof.c:1664)
==12378==    by 0x812866: zend_do_fcall_common_helper_SPEC (zend_vm_execute.h:584)
==12378==  Address 0xd6ebc30 is 0 bytes inside a block of size 32 free'd
==12378==    at 0x4A07B16: free (vg_replace_malloc.c:529)
==12378==    by 0x9CCCB3D: rndr_image (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD859A: char_link (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD64EF: parse_inline (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD970A: parse_paragraph (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDB500: parse_block (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDC0ED: sd_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCE690: php_sundown_markdon_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCEE1B: zim_sundown_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x8124FF: zend_do_fcall_common_helper_SPEC (zend_vm_execute.h:550)
==12378==    by 0x811A97: execute_ex (zend_vm_execute.h:363)
==12378==    by 0xA0EFC5E: hp_execute_ex (xhprof.c:1664)
==12378==  Block was alloc'd at
==12378==    at 0x4A0813C: malloc (vg_replace_malloc.c:298)
==12378==    by 0x9CCC9F5: rndr_image (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD859A: char_link (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD64EF: parse_inline (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CD970A: parse_paragraph (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDB500: parse_block (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CDC0ED: sd_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCE690: php_sundown_markdon_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x9CCEE1B: zim_sundown_markdown_render (in /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/sundown.so)
==12378==    by 0x8124FF: zend_do_fcall_common_helper_SPEC (zend_vm_execute.h:550)
==12378==    by 0x811A97: execute_ex (zend_vm_execute.h:363)
==12378==    by 0xA0EFC5E: hp_execute_ex (xhprof.c:1664)

然后怎么玩呢?
这篇文章只是测试。

时间: 2024-09-15 16:25:33

valgrind 检测 php-fpm 内存泄漏的相关文章

插件:检测javascript的内存泄漏_javascript技巧

转自:http://www.ajaxjs.com/yuicn/bbs/ShowPost.asp?ThreadID=6 2006-10-18 @ 07:59:29 · 作者 volcano Javascript的内存泄漏,不是太可怕.它只会悄悄的,慢慢的把你的浏览器拖的巨慢无比,让你愤怒的拍案而起,大骂微软出品的破烂浏览器危害社会.这一切有可能并不是浏览器的错,可能只是因为网页上有些javascript的内存泄漏罢了. 在科技日益发达今天,我们有必要武装自己,以及自己的浏览器,这样万一浏览器倒下了

C/C++内存泄漏及检测

"该死系统存在内存泄漏问题",项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失 败.内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题.实际上,使用C/C++这类没有垃圾回收机制 的语言时,你很多时间都花在处理如何正确释放内存上.如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也 会对程序造成重大的影响,如造成某些关键服务失败. 对于内存泄

C++内存泄漏检测拾遗

在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏.也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息. 在非MFC框架中,需要借助CRT函数实现这些功能. 1. 调用_CrtDumpMemoryLeaks()函数会在输出窗口中输出当前的内存泄漏.若在程序开始处加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ): 语句,CRT会在程序的每个出口处自动调用_C

VC使用CRT调试功能来检测内存泄漏

信息来源:csdn     C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证了这句话.在 C/C++ 应用程序开发过程中,动态分配的内存处理不当是最常见的问题.其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误.偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种 各样的征兆:从性能不良(并且逐渐降低)到

Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法_Android

前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来.所以决定抽空学习总结一下这方面的知识,以及分享一下我们是如何检测内存泄漏的.我们公司使用开源框架LeakCanary来检测内存泄漏. 什么是内存泄漏? 有些对象只有有限的生命周期.当它们的任务完成之后,它们将被垃圾回收.如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏

Android 内存泄漏总结

Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收.最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量. 我会从 java 内存泄漏的基础知识开始,并通过具体例子来说明 Android 引起内存泄漏的各种原因,以

一个跨平台的 C++ 内存泄漏检测器

内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧.在Windows下,MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏.在Linux下,相对来说就没有那么容易使用的解决方案了:像mpatrol之类的现有工具,易用性.附加开销和性能都不是很理想.本文实现一个极易于使用.跨平台的C++内存泄漏检测器.并对相关的技术问题作一下探讨. 基本使用 对于下面这样的一个简单程序test.cpp: 我们的基本需求当然是对于该程序报告存在两处内存泄漏.要做到这点的话,非常简单,只要

Android中导致内存泄漏的竟然是它----Dialog

一. 内存泄漏的 Bug 猛增 最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题.在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬间心理无比纠结,真有千万只羊驼向我奔来. 登录页面出现内存泄漏??!!楼主的代码是如此的完美而无懈可击,这么可能出现这么多泄漏的问题? 插播什么是 Activity 泄漏:Android 中 Activity 代表一个页面,拥有一段生命周期,生命周期结束后,Activity 对象应当在之后某个合适的时机被 VM 回收内存.出现了泄漏就意味着

[Android]Android内存泄漏你所要知道的一切(翻译)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 原文:https://blog.aritraroy.in/everything-you-need-to-know-about-memory-leaks-in-android-apps-655f191ca859 写一个Android app很简单,但是写一个超高品质的内存高效的Android app并

C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂.久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露.内存管理错误,只要不影响运行,没有读到不该读的东西VS就不会告诉你(应该是VS内部没实现这个内存检测功能),因此用VS写出的程序可能不是