云智慧透视宝 PHP 应用性能监控实现原理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudwise
V2EX    监控宝

云智慧透视宝 PHP 应用性能监控实现原理

  •  
  •   cloudwise 2015-11-17 17:16:52 +08:00 2181 次点击
    这是一个创建于 3666 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一。 PHP 应用场景
    自 1994 年创建以来, PHP 早已由小家子气的” Personal Home Page Tools ”,演变为” PHP: Hypertext Preprocessor ”,同时基于强大的可扩展性与敏捷迭代特性,基本已经成为互联网科技公司的必备语言,为推动互联网发展提供着源源不断的强大动力。
    同时基于 PHP 的开源软件和开发框架(优秀如 WodPress , Zend Framework , Laravel , Yaf , Hiphop 等等)也在不断地发展,使得 PHP 也被除互联网公司之外的企业所大规模使用,而进入企业级应用开发语言之列。
    二。用户监控需求
    我们知道, PHP 的门槛低迭代快使得很多项目,因为种种原因变得架构不清:
    1. 开发者水平不足;
    2. 项目是从外包团队接手;
    3. 历史问题,积重难返;
    4. 反正性能奇差,反正已经愈发不可控;
    而要发现问题却又因为各种原因不可或很难调试,这些原因诸如:
    1. 时间太久了,我也忘了怎么写的,要看代码
    2. 因为数据不可造,逻辑无法到达,不能重现
    3. 项目不是我所在的团队开发,架构以及代码,羞涩恶心。

    图 1: PHP 应用系统的执行模型

    PHP 的运行阶段可以大致分成三个阶段:
    1. Parse
    2. Compile
    3. Execute
    其中 Compile 过程将会产生 Op Code 和 Class Table , Function Table ,然后交给 Execute 最终执行。 Op Code 是中间码,被 Zend Engine 调用执行。
    不难看出,其实 PHP 与 Java 类似,都是产生中间码,运行在各自的”虚机”上,可是为什么 PHP 的性能较 Java 、.NET 、 Go 而言差别这么大呢?
    一句话讲,大家普遍认为的” PHP 是解释型语言”其实是不严谨的, PHP 不是不编译,而是每次执行都编译,除此之外最严重的问题即是较难实现并行运算(注意只说”较难”,使用 PHP 进行并行计算的方案不止一个)。基于 Op Code 的存在,已经诞生了大量 cache 工具扩展,可以有效提升 PHP 应用的执行性能,如 OpCache,Apc,Apcu,Xcache 等等。
    对于使用 PHP 开发的网站、接口、应用系统而言,性能的瓶颈点会在什么地方呢? 做过 PHP 应用性能优化的朋友们都知道,递归、循环、资源操作、资源释放等都是常见的瓶颈点,这些经常会造成阻塞或锁。
    可以得出 CPU 、内存 、各种 I/O 、各种网络带宽等的消耗是性能瓶颈点中的重中之重,我们可以简单归结为:外部服务(如第三方 API),资源读写,代码异常。
    处理这些问题的通用作法是使用 Xhprof,Xdebug 或 PHP-trace 等工具来找出,并配合架构师或高级工程师经验来处理,方法包括单例、事务、按需加载、短事务、及时释放等等(对于大多数公司与开发人员来讲,碰到性能问题更多的作法是盲目的猜测与挠头).但这些方法有哪些不足呢?
    一眼可知,只能在测试或生产环境,产生问题并明确之后进行处理.测试环境还好,但如果是生产环境,事后处理虽能补救,但大多数面对的都是因功能受损造成的投诉或更严重的业务损失。
    能够在生产环境第一时间发现或规避可能的性能问题;准确记录已知或未知故障现场。这两点,则成为应用性能管理的迫切需求。
    三。透视宝 PHP 监控实现原理


    图 2 Hook 运用示意
    PHP 运行支撑的 Zend Engine 早在设计过程中已经预留了丰富的 Hook ,可以有效干涉处理过程中的几个关键步骤。
    云智慧透视宝 PHPAgent 的研发实现,当然不能影响应用系统原有的代码,那么最简单有效的方式必然是实现一个 PHP 扩展, PHPAgent 利用了以下几个 Hook:
    1. zend_compile_file & zend_compile_string
    加载分析文件或字符串,本身就会造成非常大的 IO ,如果过多地执行加载,无疑会造成内存和 CPU 的消耗.通过这两个 hook,可以取得文件名、执行行数、使用内存和 CPU 占用时间。
    2. zend_execute & zend_execute_internal
    通过这两个 hook 的使用,我们可以准确地分析得出一个 PHP 应用中的类调用、方法调用、方法参数、内存占用和 CPU 占用,加以分析,便可以准确得出应用系统运行过程中的方法运行栈,API 调用地址,SQL 语句,Cache Key 以及 Cache 命中等关键信息。
    3. zend_throw_exception_hook
    利用异常钩子,可以准确地得到应用系统运行过程中出现的异常信息,当然包括异常发生的类\方法位置,参数,异常 code 和异常 message 。
    4. zend_error_cb
    错误钩子则更加直接,可以准确得到系统运行过程中出现的任何一个 warning,代码错误或语法错误。


    图 3 PHPAgent 注册与应用 Hook 流程

    图 4 zend_execute hook 的应用示意(伪代码)
    上图大致解释了我们是如何运用 zend_execute hook 进行数据采集的: 先取得方法名,同时通过规则过滤引擎,判断哪些是我们关注或不关注的(类\方法的黑白名单),然后通过 AGENT_BEGIN 宏记录方法开始时间,方法名,行数,内存起点与参数,在执行原有 zend_execute 之后,再通过 AGENT_END 宏记录结束时间,内存止点。
    通过上述 Hook 的应用,已经可以得到我们所关注的指标数据: 类\方法执行顺序,执行时间,内存占用,接口\DB 等资源连接,SQL 语句和执行时间等。
    经过严格的压力测试和生产环境部署实践,PHPAgent 对原有应用系统的性能影响在 5%以内.经过一些参数调配,可以将性能影响降到更低,这些参数包括:
    1. 是否启动异常钩子
    2. 是否启动错误钩子
    3. 是否启用数据采样
    4. 是否启用栈追踪
    5. 是否使用黑白名单(URL\Header\Cookie\Request Params)
    6. 是否启用 UDP 发送代理
    7. 关注请求时间响应阈值
    8. 关注方法时间响应阈值
    四。透视宝 PHPAgent 监控部署流程
    透视宝 PHPAgent 遵守 SmartAgent 插件规范,那么一切从 SmartAgent 的安装部署开始。
    1 、登录云智慧透视宝官网: https://www.toushibao.com/ ,点击页面右上角导航的“免费试用”,正确填写免费试用的申请信息后会弹出下面的对话框,同时激活邮件会自动发送到你的邮箱中,按照流程注册帐号即可。

    2 、注册成功后,登录透视宝,点击配置-应用,在配置页面中下载安装 Smart Agent 。安装成功后, Smart Agent 会根据系统配置自动获取主机信息,大致两分钟后,您就可以在“主机→服务器”模块中查看该服务器的 CPU 、内存、网卡、磁盘及进程等性能数据。

    3 、如果要监控应用运行时代码、主机中服务和数据库性能数据,您需要进一步安装和配置 Smart Agent 提供的各种插件,这是因为 Smart Agent 实现了一种开放式的插件式结构,对每个运行时代码、服务和数据库的监控都是通过相应的插件来实现的。

    3 。 Smart Agent 在安装完成后,加载过程中自动发现你的应用组件,如果没有自动监测到 PHP 环境,也可以手动添加 PHPAgent 。如上图所示,点击“管理”入口,进入“插件管理”,点击页面下部的“添加服务”,选择 PHPAgent 后,点击“创建”。
    创建完毕后,点击“ ON ”。(该 ON 操作只是初始化用户的信息,以便以后采集到的信息能够正确的回传给该用户。)
    4 。当然,如果对于已经安装完成的 PHPAgent ,也可以直接在此管理界面上方便地进行升级与降级操作。

    5 。安装过程脚本默认会使用 whereisphp 寻找系统内 PHP 进行安装。
    如果编译安装 PHP ,请赋脚本中 APPD_PHP_PATH 变量值到 PHP bin 目录,如: /usr/local/php-5.5.14/bin 。
    执行 PHPAgent/install.sh start 安装命令。
    6 。重启 Web Server
    安装开启 PHP 代码监控插件后,需要您手动重启 web Server ( apache\httpd\Php-fpm 等软件)
    7 。查看 PHP 应用数据
    恭喜!此时配置已经完成,如果应用有正常访问进入,您就可以在“应用”模块中查看应用数据了。



    五。透视宝 PHP 监控功能特点
    在功能方面,透视宝无论是在 PHP ,还是其他如 Java 、.NET 等主流语言的监控上,都包括:查看执行最慢的 10 个元素,包括元素执行次数、持续时长和占用时长百分比;查看 HTTP 请求参数,包括请求的响应状态、链接页面、具体的请求参数及返回结果;查看代码执行堆栈的详细树状信息,包括每个方法的计算时间、总耗时和被调用的次数,您能直接看到特殊标识的最慢方法;查看涉及 SQL 语句的总耗时排序,包括 SQL 执行总耗时、执行次数和具体的查询语句;第三方 API 调用。

    上图是 PHPAgent 发现的某应用的资源拓扑与请求响应概述。

    上图以散点柱饼图描述了某段时间内一个 PHP 应用的请求响应时间分布,可以一眼看出有问题的请求是哪些。

    对于某一个单次请求事务的拓扑与代码运行栈可以准确地进行分析:



    下面是对一个应用中 PHPAgent 发现的一段时间内对 Mysql 资源操作的分析。








    基于某一个集群的应用,透视宝可以自动进行总拓扑的识别和描绘。




    当然,可以对已经识别的应用站点拓扑进行分组高亮。






    应用程序一出错,你就抓狂。

    PHP 作为应用最广泛的程序设计语言之一,怎可少得了一个监控。

    透视宝 PHP 探针 监控全面开放试用,不用你就亏了!

    免费申请入口: http://cloudwise.mikecrm.com/f.php?t=otD9zM

    试用心德可发送到: [email protected] 有奖励哦~~~







    应用程序一出错,你就抓狂。

    PHP 作为应用最广泛的程序设计语言之一,怎可少得了一个监控。

    透视宝 PHP 探针 监控全面开放试用,不用你就亏了!

    免费申请入口: http://cloudwise.mikecrm.com/f.php?t=otD9zM

    使用感言可发送到: [email protected] 有奖励哦~~~
    1 条回复    2015-11-17 17:21:16 +08:00
    skydiver
        1
    skydiver  
       2015-11-17 17:21:16 +08:00
    为什么图片都这么模糊,看得眼睛疼
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2230 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:57 PVG 23:57 LAX 07:57 JFK 10:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86