Karp 的技术博客

昨天服务出了问题,生产环境代码需要优化

一般我们会通过几种方式分析:

日志法:通过各种日志,查看耗时,找出相应的问题,但这种方法有几个缺点:
粒度太粗,不好控制
侵入性太强,需要人工打点
性能指标不够,只能分析出大致的耗时,但不能分区i/o, cpu时间乖

xdebug:目前最牛逼的性能分析工具,可以无侵入式的详细的记录完整的调用链,遗憾的是与swoole不兼容
xhprof: facebook出口的一款性能分析工具,简单易用,问题是:后期不维护了,对现在的php版本以及swoole支持度都不好
第三方的apm工具: 不可控,也不如前面2位,对swoole支持也不好
找到一个网站:https://tideways.com/,维护并持续更新xhprof,使之能支持php7 也支持在swoole下跑

安装 tideways_xhprof

# 克隆扩展
$ git clone https://github.com/shenzhe/php-xhprof-extension 
$ cd php-xhprof-extension/ 

# 没发现phpize 
$ phpize --version      

# 全局查找 phpize
$ locate phpize        

# 生成php扩展   ./configure 文件
$ /opt/remi/php72/root/usr/bin/phpize

# 配置检查 提示 --with-php-config=  全局查找php-config 
$ locate php-config

# 生成 makeFile 
$ ./configure --with-php-config=/opt/remi/php72/root/usr/bin/php-config

# 开始构建
$ make && make install

# 扩展所在目录  /opt/remi/php72/root/usr/lib64/php/modules/

# 检测扩展安装是否ok but 没找到卓展
$ php -m |grep -i xhprof

# 全局搜索php.ini 
$ locate php.ini

#  vim 查看果然没有配置 手动添加 `extension = /opt/remi/php72/root/usr/lib64/php/modules/tideways_xhprof.so`

$ vim /etc/opt/remi/php72/php.ini 

# 再次检查扩展 已安装成功
$ php -m |grep -i xhprof

# 检查扩展版本
$ php --ri tideways_xhprof

tideways_xhprof

Version => 5.0.0
Clock Source => clock_gettime


Tideways is a PHP Profiler, Monitoring and Exception Tracking Software.

The 'tideways_xhprof' extension provides a subset of the functionality of our commercial Tideways offering in a modern, optimized fork of the XHProf extension from Facebook as open-source. (c) Tideways GmbH 2014-2017, (c) Facebook 2009

Register for a free trial on https://tideways.io

使用 tideways_xhprof

也比较简单,在onRequest回调最开始一行输入:(表示开启分析)

if (function_exists('tideways_xhprof_enable') && function_exists('tideways_xhprof_swoole_init')) {

    // todo XHPROF 监控 代码
    @tideways_xhprof_swoole_init();

    @tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU);
}

# code... 中间执行你的业务逻辑

# 在最后一行输入
file_put_contents(
    '/tmp/xhprof/' . date('Ymd_Hi_s').'.msg-api.xhprof',
    serialize(tideways_xhprof_disable())
);
tideways_xhprof_swoole_end ();

把分析的结果存入到文件中,以待分析

其中:'/tmp/xhprof/' . date('YmdHis').'.msg-api.xhprof'

是最终分析文件的地址,可自行修改 (分析文件不要有_等符号)

然后执行你的接口,最后会在 /tmp/xhprof 看到 20211103.msg-api.xhprof 文件, serialize 格式也不是肉眼能看懂的,还是需要 xhprof 的图形界面工具。

https://github.com/phacility/xhprof/tree/master/xhprof_html

参考地址 : https://github.com/shenzhe/php-xhprof-extension/blob/master/README.md#in-swoole

swoole xhprof

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2021年11月03日 03:11
4

目录

来自 《Swoole 使用 Xhprof 调试 HTTP服务》