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

2019-06-04 18:26:58 浏览数 (1)

源起

最近基于swoole的一个mvc开发框架做了一个项目,完成之后对其中一个接口例行做了一次压测,本机上得到qps是3600,由于接口功能比较简单,所以又花了点时间用beego和spring boot实现了相同的功能,也压测了一下,最终对比如下: swoole: 3600qps

beego: 2200 qps

spring: 600qps

(ps: 无意比较优劣,应该是用beego和spring boot的姿势不对)

swoole的结果符合预期,后来经过一翻折腾(加了一些逻辑,完善了一些底层框架代码),再一压这个接口,qps下降到了2300

真是一顿操作猛如虎,性能下降35%啊

优化

做为一个有追求的phper,这是不能忍的,必需找到原因并解决之,但光喊口号是不行的,必需有方法,一般我们会通过几种方式分析:

  1. 日志法:通过各种日志,查看耗时,找出相应的问题,但这种方法有几个缺点:
    1. 粒度太粗,不好控制
    2. 侵入性太强,需要人工打点
    3. 性能指标不够,只能分析出大致的耗时,但不能分区i/o, cpu时间乖
  2. xdebug:是我认为目前最牛逼的性能分析工具,可以无侵入式的详细的记录完整的调用链,唯一的遗憾是与swoole不兼容
  3. xhprof: facebook出口的一款性能分析工具,简单易用,问题是:后期不维护了,对现在的php版本以及swoole支持度都不好
  4. 第三方的apm工具: 不可控,也不如前面2位,对swoole支持也不好

除了打日志,好像在swoole下陷入的僵局了,一翻寻觅,发现了一个网站:https://tideways.com/,维护并持续更新xhprof,使之能支持php7,又一翻折腾,发现也支持在swoole下跑

安装 tideways_xhprof

github: https://github.com/shenzhe/php-xhprof-extension

clone代码到本地 执行:

代码语言:javascript复制
 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);

表示开启分析,

中间执行你的业务逻辑

在最后一行输入

代码语言:javascript复制
file_put_contents(
    '/tmp/xhprof/' . uniqid() . '.msg-api.xhprof',
    serialize(tideways_xhprof_disable())
);

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

其中:

代码语言:javascript复制
'/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();

代码语言:javascript复制
tideways_xhprof_swoole_end();

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

----------伟大的分割线-----------

0 人点赞