【问题标题】:Tools to visually analyze memory usage of a PHP app可视化分析 PHP 应用程序的内存使用情况的工具
【发布时间】:2010-09-20 08:01:47
【问题描述】:

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

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

【问题讨论】:

标签: php memory-management profiling


【解决方案1】:

您可能知道,Xdebug 从 2.* 版本开始就放弃了内存分析支持。请在此处搜索“已删除函数”字符串: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(推荐!)

首先通过在此处下载最新的软件包来安装 Google gperftoolshttps://code.google.com/p/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 将在您现有的浏览器会话中创建一个新窗口,如下所示:

Xhprof + Xhgui(我认为最好的配置 CPU 和内存)

使用 XhprofXhgui,您还可以分析 CPU 使用情况,或者如果这是您目前的问题,则只分析内存使用情况。 这是一个非常完整的解决方案,它可以让您完全控制,并且可以将日志写入 mongo 或文件系统中。

更多详情see my answer here

黑火

Blackfire 是 SensioLabs 的 PHP 分析器,Symfony2 的家伙 https://blackfire.io/

如果您使用 puphpet 设置您的虚拟机,您会很高兴知道它受支持 ;-)

【讨论】:

  • sudo pecl install memprof 没有通过make 阶段。给出错误:Makefile:194: recipe for target 'memprof.lo' failed
  • 需要注意的是php-memory-profiler不支持php7。
  • 应该被接受的答案...谢谢你的信息。请注意,虽然 kcachegrind/qcachegrind 是为 CPU 分析而设计的,但是当您分析 php-memory-profiler 吐出的 cachegrind 文件时,您会发现名为 correpsond 的值和字段与内存分析相对应。
  • @HeathN 确实如此。存储库中的 master 分支仅支持 PHP 7,然后有 php5 分支仅支持 PHP5。
【解决方案2】:

我最近遇到了同样的问题,不幸的是找不到任何特定的工具。

但有帮助的是在启用 mem deltas 的情况下以人类可读的格式输出 xdebug 跟踪(一个 INI 设置,xdebug.show_mem_deltas 或我认为的什么?)。然后在输出上运行排序(如果你在 *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 干杯 ;-) 这隐藏了低于 2 级缩进的步骤,你可以很容易地看到整体内存使用率上升的点,并且可以缩小范围通过增加缩进来降低:

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

【讨论】:

    【解决方案3】:

    在 Xdebug 2.0.4 的 http://www.xdebug.org/updates.php 上,他们在“删除的功能”部分中写道:“...删除了对内存分析的支持,因为它不能正常工作...”。因此 xdebug 不会是一个选项

    【讨论】:

      【解决方案4】:

      我个人使用https://github.com/arnaud-lb/php-memory-profiler

      在 PHP 5.6 和 Ubuntu 18 上,以及用于可视化的 Kcachegrind。

      Kcachegrind 还可以,但不是最好的。我希望找到更好的替代方案,即使是在 Mac 或 Windows 上。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          xdebug 输出的图形工具是KCacheGrind

          【讨论】:

          • 我知道 KCacheGrind 和 WinCacheGrind。据我所知,这两种工具都不允许分析内存使用情况。
          【解决方案7】:

          试试webgrind。它以易于阅读的基于浏览器的格式为您提供 CacheGrinder 的概要分析。我使用的是 Mac,它使分析变得轻而易举。

          【讨论】:

          • 不幸的是 webgrind 不报告内存使用情况——只报告执行速度。
          【解决方案8】:

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

          【讨论】:

          • 它是处理内存使用分析还是只处理性能分析?在他们的网站上,我只看到了性能分析。
          • 无法告诉你。这个程序的程序员是一个非常好的人。给他发一封电子邮件并问问自己不会有什么坏处!
          猜你喜欢
          • 2013-05-30
          • 2010-10-31
          • 2010-12-02
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-13
          相关资源
          最近更新 更多