昨天服务出了问题,生产环境代码需要优化
一般我们会通过几种方式分析:
日志法:通过各种日志,查看耗时,找出相应的问题,但这种方法有几个缺点:
粒度太粗,不好控制
侵入性太强,需要人工打点
性能指标不够,只能分析出大致的耗时,但不能分区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
也比较简单,在onReques
t回调最开始一行输入:(表示开启分析)
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