[转]【swoole4.0】一次qps提升之旅(一)

jackxiang 2019-4-9 10:21 | |
背景:PHP在跨版本升级时一些扩展没跟上,跨的步子不是小而是不够大,跟不上的问题只好swoole来帮其迈步大一些,但是毕竟相关配套还是没有来得及跟上,有观望的,有踟蹰不前的,有换Go的,总之,这个过程是艰难,王导的这篇文章就是一个对swoole的性能再次作优化的一个不错的分享,君子身非异也,善假于物也,说白了就是工具配套很重要的,希望周边的扩展能跟上,特转之。

源起
最近基于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



最终上面的分析文件可视化后如下:
https://mmbiz.qpic.cn/mmbiz_png/LHDiahSVnXhs4fa6cxh7fpapG6H17PNhg6IlUhPtFdfd2Owb70WRtt31Ecg4gRTJODxXgt4xjeSRtOqerNcVvoA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

下一篇,将详细介绍如何安装xhprof可视化工具,以及我们要看什么指标,怎么通过这些指标来指导来做优化,并最终提升的程序的性能



查看原文,可获取我修改版的tideways_xhprof,增加了两个方法,以支持RINIT和RSHUTDOWN中做的一些事情:

tideways_xhprof_swoole_init();

tideways_xhprof_swoole_end();
这样可以更好的支持swoole,  readme里有介绍使用方法

原文:https://mp.weixin.qq.com/s/uekLWuXz5i2OBDsnYhwShw

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/10156/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-4-9 10:38
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]