生产环境:在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.
最佳答案 虽然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不同,只是启用扩展程序似乎根本不会增加任何开销.