云智慧透视宝PHP应用性能监控实现原理
发布日期:2016-7-9 19:7:53
一.PHP应用场景
自1994年创建以来,PHP早已经由小家子气的”Personal Home Page Tools”,演变为”PHP:Hypertext Preprocessor”,同时基于强大的可扩展性与敏捷迭代特性,基本已成为互联网科技公司的必备语言,为推动互联网发展提供着源源不断的强大动力。同时基于PHP的开源软件和开发框架(优秀如WordPress,Laravel,Zend Framework,Yaf,Hiphop等等)也在不断地发展,使得PHP也被除互联网公司外的企业所大规模使用,而进入企业级应用开发语言之列。 二.用户监控需求 PHP的门槛低迭代快使得很多项目,因为种种原因变得架构不清: 1. 开发者水平不足; 2 历史问题,积重难返; 3 项目是从外包团队接手; 4. 反正性能奇差,反正已愈发不可控; 而要发现问题却又因为各种原因不可或者非常难调试,这些原因诸如: 1. 时间太久了,我也忘了怎么写的,要看代码 2. 因为数据不可造,逻辑无法到达,不能重现 3. 项目不是我所在的团队开发,架构及代码,羞涩恶心。 图1: PHP应用系统的执行模型 PHP的运行阶段可以大致分成三个阶段: 1 Compile 2 Parse 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_execute& zend_execute_internal 通过这两个hook的使用,我们可以准确地分析得出一个PHP应用中的类调用、方法调用、方法参数、内存占用和CPU占用,加以分析,便可以准确得出应用系统运行过程中的方法运行栈,API调用地址,SQL语句,CacheKey以及Cache命中等关键信息。 2 zend_compile_file& zend_compile_string 加载分析文件或字符串,本身就会造成十分大的IO,若过多地执行加载,无疑会造成内存和CPU的消耗.通过这两个hook,可取得文件名、执行行数、使用内存和CPU占用时间。 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实现了一种开放式的插件式结构,对每个运行时代码、服务和数据库的监控都是通过相应的插件来实现的。 4、Smart Agent在安装完成后,加载过程中自动发现你的应用组件,如果没有自动监测到PHP环境,也可以手动添加PHPAgent。如上图所示,点击“管理”入口,进入“插件管理”,点击页面下部的“添加服务”,选择PHPAgent后,点击“创建”。 创建完毕后,点击“ON”。(该ON操作只是初始化用户的信息,以便以后采集到的信息能够正确的回传给该用户。) 5、当然,如果对于已经安装完成的PHPAgent,也可以直接在此管理界面上方便地进行升级与降级操作。 6、安装过程脚本默认会使用whereisphp寻找系统内PHP进行安装。 如果编译安装PHP,请赋脚本中APPD_PHP_PATH变量值到PHP bin目录,如:/usr/local/php-5.5.14/bin。 执行PHPAgent/install.sh start安装命令。 7、重启Web Server 安装开启PHP代码监控插件后,需要您手动重启web Server(apache\httpd\Php-fpm等软件) 8、查看PHP应用数据 恭喜!此时配置已经完成,如果应用有正常访问进入,您就可以在“应用”模块中查看应用数据了。 五.透视宝PHP监控功能特点 在功能方面,透视宝无论是在PHP,还是其他如Java、.NET等主流语言的监控上,都包括:查看执行最慢的10个元素,包括元素执行次数、持续时长和占用时长百分比;查看HTTP请求参数,包括请求的响应状态、链接页面、具体的请求参数及返回结果;查看代码执行堆栈的详细树状信息,包括每个方法的计算时间、总耗时和被调用的次数,您能直接看到特殊标识的最慢方法;查看涉及SQL语句的总耗时排序,包括SQL执行总耗时、执行次数和具体的查询语句;第三方API调用。 上图是PHPAgent发现的某应用的资源拓扑与请求响应概述。 上图以散点柱饼图描述了某段时间内一个PHP应用的请求响应时间分布,可以一眼看出有问题的请求是哪些。 对于某一个单次请求事务的拓扑与代码运行栈可以准确地进行分析: 下面是对一个应用中PHPAgent发现的一段时间内对Mysql资源操作的分析。 基于某一个集群的应用,透视宝可以自动进行总拓扑的识别和描绘。 当然,可对已经识别的应用站点拓扑进行分组高亮。 一.PHP应用场景 自1994年创建以来,PHP早已经由小家子气的”Personal Home Page Tools”,演变为”PHP:Hypertext Preprocessor”,同时基于强大的可扩展性与敏捷迭代特性,基本已成为互联网科技公司的必备语言,为推动互联网发展提供着源源不断的强大动力。同时基于PHP的开源软件和开发框架(优秀如WordPress,Laravel,Zend Framework,Yaf,Hiphop等等)也在不断地发展,使得PHP也被除互联网公司外的企业所大规模使用,而进入企业级应用开发语言之列。 二.用户监控需求 PHP的门槛低迭代快使得很多项目,因为种种原因变得架构不清: 1. 开发者水平不足; 2 历史问题,积重难返; 3 项目是从外包团队接手; 4. 反正性能奇差,反正已愈发不可控; 而要发现问题却又因为各种原因不可或者非常难调试,这些原因诸如: 1. 时间太久了,我也忘了怎么写的,要看代码 2. 因为数据不可造,逻辑无法到达,不能重现 3. 项目不是我所在的团队开发,架构及代码,羞涩恶心。 1 图1: PHP应用系统的执行模型 PHP的运行阶段可以大致分成三个阶段: 1 Compile 2 Parse 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 图2: Hook运用示意 PHP运行支撑的Zend Engine早在设计过程中已预留了丰富的Hook,可有效干涉处理过程中的几个关键步骤。云(如阿里云)智慧透视宝PHPAgent的研发实现,当然不能影响应用系统原有的代码,那么最简单有效的方式必然是实现一个PHP扩展,PHPAgent利用了以下几个Hook: 1 zend_execute& zend_execute_internal 通过这两个hook的使用,我们可以准确地分析得出一个PHP应用中的类调用、方法调用、方法参数、内存占用和CPU占用,加以分析,便可以准确得出应用系统运行过程中的方法运行栈,API调用地址,SQL语句,CacheKey以及Cache命中等关键信息。 2 zend_compile_file& zend_compile_string 加载分析文件或字符串,本身就会造成十分大的IO,若过多地执行加载,无疑会造成内存和CPU的消耗.通过这两个hook,可取得文件名、执行行数、使用内存和CPU占用时间。 3. zend_throw_exception_hook 利用异常钩子,可准确地得到应用系统运行过程中出现的异常信息,当然包括异常发生的类\方法位置,参数,异常code和异常message。 4. zend_error_cb 错误钩子则更加直接,可准确得到系统运行过程中出现的任何一个warning,代码错误或者语法错误。 3 图3 :PHPAgent注册与应用Hook流程 4 图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/,点击页面右上角导航的“免费试用”,正确填写免费试用的申请信息后会弹出下面的对话框,同时激活邮件会自动发送到你的邮箱中,按照流程注册帐号即可。 5 2、注册成功后,登录透视宝,点击配置-应用,在配置页面中下载安装Smart Agent。安装成功后,Smart Agent会根据系统配置自动获取主机信息,大致两分钟后,您就可以在“主机→服务器”模块中查看该服务器的CPU、内存、网卡、磁盘及进程等性能数据。 6 3、若要监控应用运行时代码、主机中服务和数据库性能数据,您需进一步安装和配置Smart Agent提供的各种插件,这是因为Smart Agent实现了一种开放式的插件式结构,对每个运行时代码、服务和数据库的监控都是通过相应的插件来实现的。 7 4、Smart Agent在安装完成后,加载过程中自动发现你的应用组件,如果没有自动监测到PHP环境,也可以手动添加PHPAgent。如上图所示,点击“管理”入口,进入“插件管理”,点击页面下部的“添加服务”,选择PHPAgent后,点击“创建”。 创建完毕后,点击“ON”。(该ON操作只是初始化用户的信息,以便以后采集到的信息能够正确的回传给该用户。) 5、当然,如果对于已经安装完成的PHPAgent,也可以直接在此管理界面上方便地进行升级与降级操作。 8 6、安装过程脚本默认会使用whereisphp寻找系统内PHP进行安装。 如果编译安装PHP,请赋脚本中APPD_PHP_PATH变量值到PHP bin目录,如:/usr/local/php-5.5.14/bin。 执行PHPAgent/install.sh start安装命令。 7、重启Web Server 安装开启PHP代码监控插件后,需要您手动重启web Server(apache\httpd\Php-fpm等软件) 8、查看PHP应用数据 恭喜!此时配置已经完成,如果应用有正常访问进入,您就可以在“应用”模块中查看应用数据了。 9 五.透视宝PHP监控功能特点 在功能方面,透视宝无论是在PHP,还是其他如Java、.NET等主流语言的监控上,都包括:查看执行最慢的10个元素,包括元素执行次数、持续时长和占用时长百分比;查看HTTP请求参数,包括请求的响应状态、链接页面、具体的请求参数及返回结果;查看代码执行堆栈的详细树状信息,包括每个方法的计算时间、总耗时和被调用的次数,您能直接看到特殊标识的最慢方法;查看涉及SQL语句的总耗时排序,包括SQL执行总耗时、执行次数和具体的查询语句;第三方API调用。 10 上图是PHPAgent发现的某应用的资源拓扑与请求响应概述。 11 上图以散点柱饼图描述了某段时间内一个PHP应用的请求响应时间分布,可以一眼看出有问题的请求是哪些。 12 对于某一个单次请求事务的拓扑与代码运行栈可以准确地进行分析: 13 下面是对一个应用中PHPAgent发现的一段时间内对Mysql资源操作的分析。 14 15 基于某一个集群的应用,透视宝可以自动进行总拓扑的识别和描绘。 16 当然,可对已经识别的应用站点拓扑进行分组高亮。 17 18 上一条: 搞清四个问题,再对应用程序容器化! 下一条: 是什么让容器扩容那么难的?
|