设为首页 收藏本站
查看: 991|回复: 0

[经验分享] xDebug + webgrind 对 php 程序进行性能分析

[复制链接]

尚未签到

发表于 2017-12-30 13:18:11 | 显示全部楼层 |阅读模式
环境
  macOs Sierra
  php 7.0.8
  MAMP Pro 集成环境

背景
  最近有一个需要在微信朋友圈上线的 h5,本人做了一个抽奖的接口,也没多想,直接上 php ci(CodeIgniter)框架。
  按照腾讯方的要求,需要 ab 测试,在总请求数 15000,并发 500 下平均响应时间小于 200ms
  谁知道等开发完毕,ab 跑完,响应时间直飚近 400ms。
  所以接下来借助 php 强大的 xDebug 扩展和 webgrind 来查看代码调用耗时情况

1、添加 php 的 xDebug 扩展
  因为 MAMP Pro 自带 xDebug 扩展,所以直接开启就好:
DSC0000.png


2、php.ini 配置中开启 Profiler(性能跟踪器)
  Profiler工作方式类似于函数追踪,是在脚本程序运行时自动将性能记录文件保存下来。
[php.ini]

  

xdebug.profiler_enable = 1  

  
xdebug.profiler_enable_trigger = 1
  

  

3、下载 webgrind
  因为 xDebug 的 Profiler 生成的性能记录文件的格式,不是给人看的:
DSC0001.png

  所以需要下载图形界面的分析工具,Linux KDE 可以用 KChaceGrind,windows 下可以用 winChaceGrind ,Mac 上没有发现合适的桌面端软件,所以用 Web 版的 webgrind 是最好的选择。
  Github 地址:https://github.com/jokkedk/webgrind
  下载后直接放在本地服务器根目录直接访问就行:

  http://localhost/webgrind


4、使用方法
  把需要分析的 url 后面接上 ?XDEBUG_PROFILE,例如:

  http://localhost/XXX/index.php/PriceApply/getPrice?XDEBUG_PROFILE

  然后刷新 webgrind 网页,新的数据会出现:
DSC0002.png

  下面介绍下 webgrind 的一些参数含义:
DSC0003.png

  第一个选项:webgrind 把所有被调用函数/方法首先做一个排序,由高到低显示。然后取出前 N 个,使他们耗时比率之和在 90-100% 之间。

  要注意的是,最好不要选择100%,这样将会显示所有被调用的函数/方法,如果是一个代码复杂的页面,那么webgrind偶尔会被卡死。并且通常我们只要关注耗时前几 > 名的函数即可。

  第二个选项:选择 profile 文件。默认是分析最新一次的 xdebug 记录。如果之前设置好路径和记录机制那么我们就会发现下拉列表里有很多选项。
  第三个选项:显示百分比/毫秒/微秒。
  彩色进度条:蓝代表 php 内置函数,灰代表 require/include,绿代表类方法,橙黄代表过程函数 (用户自定义函数)
DSC0004.png

  invocation count - 表示整个 php 页面从载入到执行完毕呈现,各种函数被调用的总次数
  
total self cost - 表示函数自身消耗
  
total inclusive cost - 表示此函数从开始到执行完毕所用消耗 ,包括自身消耗和调用其他函数消耗
  点击一个父函数名后出现展开:
  Calls - 此函数中调用并执行的所有函数/方法名、次数及耗时
  
Total Call Cost - 被此父函数调用时,执行的总耗时
  
Count - 被此父函数调用时,执行的次数

5、分析数据
DSC0005.png

  如上图,最耗时的并不是我认为的抽奖模块,而是 ci 框架本身 + 数据库
  让我再进一步瞧瞧:
DSC0006.png

  如上图,在 load_class 项目里,最耗时的涉及 ci 框架重要模块的加载,包括URL、Hooks、Config、Router、Output模块,这些都是 ci 框架易用性的保障,除了Hooks 可以在 config 文件里禁用,绝大多数应该不能关闭。
DSC0007.png

  再来看 DB 项,最耗时的是数据库的初始化
DSC0008.png

  最后一项,是 ci 的系统核心层,最耗时的是 model 的构造过程,仍是初始化

结论
  借用《主流 PHP 框架性能评测》(https://gold.xitu.io/entry/578ef4d6d342d30058e17d98) 文中的数据分析图(柱状图越高性能越好)
DSC0009.png

  框架有利有弊,利是方便开发,易用稳定,弊端可能就是不管你的实际需求,初始化加载很多用不到的功能。
  所以:
  在涉及微小型的接口开发,建议采用原生 php 。
  在涉及复杂型接口时,采用框架的同时,适当开启 php 缓存,比如 APC 和 OPcache,都可以让性能得到一些提升,弥补使用框架的不足。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429673-1-1.html 上篇帖子: 飞旋的留恋 下篇帖子: PHP is_numeric 检测变量是否为数字或数字字符串
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表