PHP性能调试

非侵入式注入

  • 全局配置
    • php.ini:auto_prepend_file、auto_append_file
  • 基于站点配置
    • nginx:fastcgi_param PHP_VALUE "auto_prepend_file=your_file_path";
    • apache:php_admin_value auto_prepend_file "your_file_path"

XHProf

XHProf是Facebook开发的轻量级的分层性能测量分析工具,其通过在程序中前后打点记录数据,从而在函数级别比较时间、内存、CPU等指标。

安装

  • 依赖安装
	yum install php-pecl-xhprof
	yum install graphviz #图表绘制插件
  • php.ini中调整储存XHProf运行数据的默认目录xhprof.output_dir="/tmp/xhprof"
  • web服务器启用新主机指向xhprof_html目录,用于图表展现服务
    • 函数报表
    • 函数调用图

使用

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); //开始采集数据
// some php logic ...
$xhprofData = xhprof_disable(); //结束采集,返回数组结果


include_once 'xhprof_lib/utils/xhprof_lib.php';
include_once 'xhprof_lib/utils/xhprof_runs.php';
$xhprofRuns = new XHProfRuns_Default();
$source = 'my_source';
$run = $xhprofRuns->save_run($xhprofData, $source);

# 直接访问http://localhost/xhprof_html/index.php 或者如下 单次分析
sprintf('http://localhost/xhprof_html/index.php?run=%s&source=%s', $run, $source);

Tideways

兼容XHProf的分层性能测量分析工具,并仍在持续更新维护中(要求PHP >= 7.0)。

安装

  • 安装基础程序
git clone [email protected]:tideways/php-profiler-extension.git
phpize
./configure
make
sudo make install

配置

[tideways]
extension=tideways.so
tideways.auto_prepend_library=0 #自动注入采样库
tideways.sample_rate=100 #采样频率

使用

tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU);

// some php logic

$data = tideways_xhprof_disable();

XHGui

基于MongoDB的XHProf数据UI接口

特性

  • 支持XHProf、Tideways、Uprofiler
  • 更美观的监控界面
  • 支持数据存储mongo
  • 百分比请求采集
  • 低负载

安装

  • git clone 代码汉化修复版 github.com/laynefyc/xhgui-branch
  • 缓存目录cache权限777
  • composer install --profile --prefer-dist --optimize-autoloader
  • mongo拓展yum install php-mongodb,并config/config.php配置mongo连接
  • web服务器启用新主机指向webroot
server {
    listen   80; 
    server_name profile.doumi.com;

    # root directive should be global
    root   /var/www/xhgui-branch/webroot/;
    index  index.php;

    location / { 
        try_files $uri $uri/ /index.php?$args;
    }   

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }   
}
  • 目标站点注入采样库external/header.php;
  • 为了避免php-fpm缓存导致其他未配置站点也被监控数据,在external/header.php文件头部添加 if(empty($_SERVER['PHP_VALUE'])) return;
  • 部分php版本时区处理有缺陷导致500错误,需要在webroot/index.php首行添加date_default_timezone_set('Asia/Shanghai');
  • mongo索引提升性能
	> use xhprof
	> db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
	> db.results.ensureIndex( { 'profile.main().wt' : -1 } )
	> db.results.ensureIndex( { 'profile.main().mu' : -1 } )
	> db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
	> db.results.ensureIndex( { 'meta.url' : 1 } )
	> db.results.ensureIndex( { 'meta.simple_url' : 1 } )
  • mongo自动清理数据每5天
> use xhprof
> db.results.ensureIndex( { "meta.request_ts" : 1 }, { expireAfterSeconds : 432000 } )

配置

  • profiler.enable回调函数配置采样频率
  • profile.simple_url回调函数配置页面聚合方式

猜你喜欢

转载自my.oschina.net/u/2400083/blog/1606254