PHP:如何在生产中运行采样探查器


PHP: How to run sampling profiler in production?

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

我想要的是:采样探查器,它可以通过PID连接到PHP进程并定期停止进程(例如使用SIGSTOP),通过内存检查收集PHP堆栈并继续进程(例如,使用SIGCONT)。停车时间应该是可调节的,但我认为停车间隔应该在1-10毫秒左右。

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

是否存在这种针对PHP的采样探查器我们的目的是不使用检测探查器,因为开销太高,而且检测会混淆统计信息(已经完成了)。

我已经知道XHProf和Xdebug,但据我所知,它们都是检测分析器,并影响PHP程序的实际操作码。我更喜欢运行普通PHP操作码的东西。

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

尽管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不同的是,仅仅启用扩展似乎根本不会增加任何开销。

我不会在生产环境中运行任何探查器工具。测试服务器用于运行评测程序和负载测试。