V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudwise
V2EX  ›  监控宝

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

  •  
  •   cloudwise · 2015-11-17 17:16:52 +08:00 · 1944 次点击
    这是一个创建于 3329 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一。 PHP 应用场景
    自 1994 年创建以来, PHP 早已由小家子气的” Personal Home Page Tools ”,演变为” PHP: Hypertext Preprocessor ”,同时基于强大的可扩展性与敏捷迭代特性,基本已经成为互联网科技公司的必备语言,为推动互联网发展提供着源源不断的强大动力。
    同时基于 PHP 的开源软件和开发框架(优秀如 WordPress , 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   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.