PHP: 如何在生产环境中运行采样分析器?

5
生产环境:在64位Linux上运行Apache 2.2和mod_php 5.3的工作机群集前面有一个负载均衡器/HTTP反向代理。所有工作机器都运行相同的完全定制PHP代码并与单个后端PostgreSQL数据库通信。PHP代码经过优化,以花费CPU时间来交换数据库。已验证数据库机器仍有很多空闲时间。 我需要的内容:抽样分析器可以通过进程ID附加到PHP进程,并定期停止进程(例如使用SIGSTOP),通过内存检查收集PHP堆栈,然后继续进程(例如使用SIGCONT)。停止周期应可调整,但我认为停止间隔应该约为1-10毫秒。
单个工作机PHP进程预计始终在100毫秒以下运行单个请求。我最感兴趣的是收集那些需要超过100毫秒的进程的配置文件数据。最好的情况是,抽样分析器会在请求开始时被通知,如果处理请求的PHP进程在100毫秒后仍在运行,则开始以1毫秒间隔收集样本。这样,任何正常运行的进程都将在没有中断的情况下运行到结束,并且我仍将获取有问题的配置文件。 是否存在此类针对PHP的抽样分析器?意图是不使用插装分析器,因为开销太高,而且插装会弄乱统计数据(已经有了这种经历)。
我已经知道XHProf和Xdebug,但据我所知,两者都是插装分析器,并影响PHP程序的实际操作码。我非常希望有一些可以运行正常PHP操作码的东西。
我所知道的最接近的方法是使用HipHop运行PHP代码并使用C/C++代码的抽样分析器,但我还没有准备好将软件移植到HipHop。在那种情况下,配置文件结果只代表HipHop,而不代表mod_php。

自己注意:结合http://inventorsparadox.blogspot.fi/2012/02/how-to-dump-php-stack-from-gdb.html和http://poormansprofiler.org/,可能可以创建一个工具来实现这一点... - Mikko Rantalainen
3
似乎XHprof支持采样,但文档很差,采样率固定为100毫秒,这有点粗糙:http://php.net/manual/en/function.xhprof-sample-disable.php - Mikko Rantalainen
你是否曾经找到了一个不错的解决方案?我发现自己有类似的需求(巧合的是,几乎和你描述的一模一样)。 - Basic
1
我发现在我的文章(http://inventorsparadox.blogspot.com/2012/02/how-to-dump-php-stack-from-gdb.html)中启动gdb的开销在我们的生产服务器上(大约有100个PHP进程)运行时相当显著。在高CPU负载情况下会导致减速,因此我很少使用它。我阅读了poormansprofiler.org,但发现自己无法理解awk代码。不过这个概念很好。另一方面,xhprof看起来很有前途 - 你试过吗? - YudhiWidyatama
抱歉,我之前没有完全阅读就发表评论了,忘记我的xhprof评论吧。每1毫秒收集样本?我认为你对于非实时操作系统要求过高了。每个请求在RDBMS访问下都在100毫秒内完成?单个扇区磁盘寻道可能需要10毫秒。因此,十个扇区的散乱读取可能会花费100毫秒,假设数据尚未在磁盘缓存中。所以我的第一个猜测是你可能想使用显式数据缓存(例如apc或memcache),或使用内存数据库,甚至可能使用SSD进行存储,这可以降低响应时间变化。 - YudhiWidyatama
显示剩余6条评论
2个回答

2

虽然启用XHProf(通过调用函数而不仅仅是启用扩展)会增加请求的开销,但具体取决于使用哪些标志。最近我进行了测量,发现只启用XHPROF_FLAGS_MEMORY是最小化开销的最佳选择:

http://rpubs.com/msonnabaum/xhprof_overhead

我刚刚在少量请求上运行了XHProf,如下所示:

<?php
function xhprof_enabled() {
  if (mt_rand(1, 300) == 1) {
    xhprof_enable(XHPROF_FLAGS_MEMORY);
  }
}

但与xdebug不同的是,仅启用该扩展似乎并不会增加任何开销。


1
据我所知,XHProf甚至不能提供完整的堆栈信息(只能告诉你“我们当前在这个函数中,不知道为什么”),因此无法满足要求。 - AndreKR
@AndreKR 一旦你了解了这个函数,你就可以将 debug_backtrace 放入你的代码中。这只是一个小问题 :) - undefined

-1

我不会在生产环境上运行任何分析工具。测试服务器是用来运行分析工具和负载测试的。


4
相反,这正是 Facebook 创建 XhProfLive 的原因:用于在生产环境下进行性能分析。并非每个人都需要此功能,对于非常小的项目,我同意你的看法。但对于大型项目,性能分析在生产环境中具有很大的价值。 - Frank Farmer

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