源起
最近基于swoole的一个mvc开发框架做了一个项目,完成之后对其中一个接口例行做了一次压测,本机上得到qps是3600,由于接口功能比较简单,所以又花了点时间用beego和spring boot实现了相同的功能,也压测了一下,最终对比如下:
swoole: 3600qps
beego: 2200 qps
spring: 600qps
(ps: 无意比较优劣,应该是用beego和spring boot的姿势不对)
swoole的结果符合预期,后来经过一翻折腾(加了一些逻辑,完善了一些底层框架代码),再一压这个接口,qps下降到了2300
真是一顿操作猛如虎,性能下降35%啊
优化
做为一个有追求的phper,这是不能忍的,必需找到原因并解决之,但光喊口号是不行的,必需有方法,一般我们会通过几种方式分析:
-
日志法:通过各种日志,查看耗时,找出相应的问题,但这种方法有几个缺点:
-
粒度太粗,不好控制
-
侵入性太强,需要人工打点
-
性能指标不够,只能分析出大致的耗时,但不能分区i/o, cpu时间乖
-
xdebug:是我认为目前最牛逼的性能分析工具,可以无侵入式的详细的记录完整的调用链,唯一的遗憾是与swoole不兼容
-
xhprof: facebook出口的一款性能分析工具,简单易用,问题是:后期不维护了,对现在的php版本以及swoole支持度都不好
-
第三方的apm工具: 不可控,也不如前面2位,对swoole支持也不好
除了打日志,好像在swoole下陷入的僵局了,一翻寻觅,发现了一个网站:https://tideways.com/,维护并持续更新xhprof,使之能支持php7,又一翻折腾,发现也支持在swoole下跑
安装 tideways_xhprof
github: https://github.com/shenzhe/php-xhprof-extension
clone代码到本地
执行:
phpize
./configure
make
make install
标准的安装过程,产生tideways_xhprof.so,加入到php.ini中
判断有没有安装成功:
php -m |grep xhprof
输出
tideways_xhprof, 表示安装成功
使用 tideways_xhprof
也比较简单
在onRequest回调最开始一行输入:
tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY
| TIDEWAYS_XHPROF_FLAGS_CPU);
表示开启分析,
中间执行你的业务逻辑
在最后一行输入
file_put_contents(
'/tmp/xhprof/' . uniqid() . '.msg-api.xhprof',
serialize(tideways_xhprof_disable())
);
把分析的结果存入到文件中,以待分析
其中:
'/tmp/xhprof/' . uniqid() . '.msg-api.xhprof'
是最终分析文件的地址,可自行修改
然后执行你的接口,最后会在 /tmp/xhprof 文件夹下看到如下的文件:
这些文件记录的就是这个接口整体的分析数据
找出最新的文件,用vim打开一看:
肉眼肯定是没法看,这就需要借助可视化的工具了:
可视化 tideways_xhprof
由于输出的文件格式和之前的xhprof完全一样,所以我这边直接借助了原本xhprof提供的工具
github:https://github.com/phacility/xhprof
最终上面的分析文件可视化后如下:
下一篇,将详细介绍如何安装xhprof可视化工具,以及我们要看什么指标,怎么通过这些指标来指导来做优化,并最终提升的程序的性能
查看原文,可获取我修改版的tideways_xhprof,增加了两个方法,以支持RINIT和RSHUTDOWN中做的一些事情:
tideways_xhprof_swoole_init();
tideways_xhprof_swoole_end();
这样可以更好的支持swoole, readme里有介绍使用方法
----------伟大的分割线-----------
PHP饭米粒(phpfamily) 由一群靠谱的人建立,愿为PHPer带来一些值得细细品味的精神食粮!
饭米粒只发原创或授权发表的文章,不转载网上的文章
所发的文章,均可找到原作者进行沟通。
也希望各位多多打赏(算作稿费给文章作者),更希望大家多多投搞。
投稿请联系:
本文由 桶哥 授权 饭米粒 发布,转载请注明本来源信息和以下的二维码(长按可识别二维码关注)
文章评论