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

时间:2012-09-11 07:17:36

标签: php performance profiling production-environment

生产环境:在64位Linux上运行带有mod_php 5.3的Apache 2.2的工作机群集前面的负载均衡器/ HTTP反向代理。所有工作机器都运行相同的完全自定义PHP代码,并与单后端PostgreSQL数据库对话。 PHP代码经过优化,可以将CPU用于与数据库通信。数据库机器已经过验证,仍然有很多空闲。

我正在寻找的东西:抽样分析器可以通过PID附加到PHP进程并定期停止进程(例如使用SIGSTOP),通过内存检查收集PHP堆栈继续该过程(例如使用SIGCONT)。停止时间应该是可调节的,但我认为停止间隔应该在1-10毫秒左右。

单个工作机器PHP进程预计在不到100毫秒的时间内运行单个请求。我最感兴趣的是收集那些耗时超过100毫秒的流程的配置文件数据。最好的情况是在请求开始时通知的采样分析器,如果处理请求的PHP进程在100毫秒后仍在运行,则开始以1 ms的间隔收集样本。这样任何正常运行的进程都可以在没有中断的情况下运行到最后,我仍然可以获得有问题的情况的配置文件。

这种PHP的采样分析器是否存在?目的是不使用仪器分析器,因为开销过高而且仪器会混淆统计数据(在那里,完成了)。

我已经知道XHProf和Xdebug但据我所知,两者都是仪器分析器并影响PHP程序的实际操作码。我非常喜欢运行普通PHP操作码的东西。

我知道最接近的工作是使用HipHop运行PHP代码并使用抽样分析器来获取C / C ++代码,但我还没准备好将软件移植到HipHop。在这种情况下,分析结果仅代表HipHop,而不代表mod_php。

1 个答案:

答案 0 :(得分: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不同,只是启用扩展程序似乎根本不会增加任何开销。