分析 PHP 应用程序内存使用的可视化工具

23

是否有任何免费或商业软件可以辅助分析PHP应用程序的内存使用情况?我知道xdebug可以生成跟踪文件,显示函数调用的内存使用情况,但没有图形化工具,数据很难解释。

理想情况下,我希望能够查看不仅是总内存使用情况,还希望查看堆上的对象以及谁引用了它们,类似于Jprofiler


1
可能是PHP内存分析的重复问题。 - Francesco Casula
8个回答

12

正如你可能知道的那样,自从 2.* 版本以来,Xdebug 放弃了内存分析支持。请在这里搜索“已删除的功能”字符串:http://www.xdebug.org/updates.php

已删除的功能

删除对内存分析的支持,因为它无法正确工作。

因此,我尝试了另一个工具,并且它对我很有效。

https://github.com/arnaud-lb/php-memory-profiler

这是我在我的 Ubuntu 服务器上启用它所做的操作:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

然后在我的代码中:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

最后使用KCachegrind打开callgrind.out文件。

使用Google gperftools(推荐)

首先,通过下载最新的软件包https://code.google.com/p/gperftools/来安装Google gperftools

然后像往常一样:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install
现在在你的代码中:
memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

然后打开您的终端并运行:

pprof --web /tmp/profile.heap

pprof会在您现有的浏览器会话中创建一个新窗口,其内容类似于下面显示的内容:

PHP memory profiling with memprof and gperftools

Xhprof + Xhgui(我认为是同时对CPU和内存进行分析的最佳工具)

使用XhprofXhgui,您可以同时分析CPU使用情况和内存使用情况,或者只分析当前的内存使用情况。

这是一个非常完整的解决方案,它可以给您完全的控制权,而且日志可以同时写入mongo数据库和文件系统中。

更多详情请查看我的回答

Blackfire

Blackfire是SensioLabs开发的PHP性能分析工具,由Symfony2的开发团队打造 https://blackfire.io/

如果你使用 puphpet 来设置你的虚拟机,那么你会很高兴知道它是被支持的 ;-)


sudo pecl install memprof doesn't get pass make stage. Gives error:Makefile:194: recipe for target 'memprof.lo' failed - Buddy
需要注意的是,php-memory-profiler不支持php7。 - Heath N
应该是被接受的答案...感谢提供信息。请注意,尽管kcachegrind/qcachegrind是为CPU分析而设计的,但当您分析php-memory-profiler生成的cachegrind文件时,您会发现所命名的值和字段对应于内存分析。 - Ezekiel Victor
@HeathN 是的。存储库中有一个名为master的分支,仅支持PHP 7,还有一个名为php5的分支,仅支持PHP5。 - starbeamrainbowlabs
值得一提的是,如果要使用“Google gperftools(推荐!)”,您需要先安装php-memory-profiler,这些php函数不是来自gperftools。 - ManBehindTheCurtain
显示剩余2条评论

8

最近我遇到了相同的问题,可惜没有找到特定的工具。

但是有一些帮助的方式,就是使用启用内存增量的xdebug跟踪以人类可读格式输出(一个INI设置,我认为是xdebug.show_mem_deltas什么的)。然后在输出上运行sort命令(如果你在*nix上):

sort -bgrk 3 -o sorted.txt mytracefile.xt 

该命令将按第三列(内存增量)排序。您也可以按第二列排序,这样您就可以找到应用程序总体上使用的最大内存所在行。

当然,这无法检测对象的内存使用量只以小增量增加但最终会使用大量内存的情况。我有一种相当简单的方法尝试通过对象迭代和序列化来解决这个问题。它可能不完全等同于内存使用情况,但希望能够提供开始查找的思路。请注意,它本身将使用内存,并且还未经过广泛测试,敬请谨慎:

function analyzeMem($obj, $deep=false)
{
    if (!is_scalar($obj))
    {
        $usage = array('Total'=>strlen(serialize($obj)));
        while (list($prop, $propVal) = each($obj)) 
        {
            if ($deep && (is_object($propVal) || is_array($propVal)))
            {
                $usage['Children'][$prop] = analyzeMem($propVal);
            }
            else
            {
                $usage['Children'][$prop] = strlen(serialize($propVal));
            }
        }
        return $usage;
    }
    else
    {
        return strlen(serialize($obj));
    }
}

print_r(analyzeMem(get_defined_vars()));

另外,我的同事Dennis建议了一种方法(感谢Dennis;-))可以隐藏两个缩进级别以下的步骤,您可以很容易地看到总体内存使用量跳升的点,并通过增加缩进来缩小范围:

egrep '[0-9]+ (  ){1,2}-> ' mytracefile.xt

6

在 Xdebug 2.0.4 的 更新页面 的 "removed functions" 栏目中写道:"...删除了内存分析功能,因为它不能正常工作...". 因此,xdebug 不再是一个选项。


1
我个人在 PHP 5.6 和 Ubuntu 18 上使用了 https://github.com/arnaud-lb/php-memory-profiler,并使用 Kcachegrind 进行可视化。
Kcachegrind 还可以,但不是最好的。我希望能找到更好的替代方案,即使它是在 Mac 或 Windows 上。

1

在2018年1月29日的2.6.0版本中,xdebug增加了对内存使用分析的支持。现在您可以生成带有时间和内存信息的callgrind文件。在Mac上,您可以使用Qcachegrind或Profiling Viewer(高级版)来可视化该信息。

Profiling Viewer callgraph


0
一个用于 xdebug 输出的图形化工具是 KCacheGrind

2
我知道KCacheGrind和WinCacheGrind。就我所知,这两个工具都不允许分析内存使用情况。 - Oleg Barshay

0

试试webgrind。它可以以易于阅读的基于浏览器的格式为您提供CacheGrinder的配置文件。我用Mac,这让分析变得轻而易举。


4
很不幸,Webgrind 没有报告内存使用量,只能报告执行速度。 - Oleg Barshay

0

phpDesigner 2008 可以使用 xdebug 和 KCacheGrind 调试和基准测试网站。它还具有内置监视器。


它是否处理内存使用分析或仅性能分析?从他们的网站上我只看到了性能分析。 - Oleg Barshay
我无法告诉你。这个程序的程序员是一个非常好的人。给他发一封电子邮件询问一下也不会有什么损失! - user29772

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