十年之前,我们国内的网页设计师、程序员大部分都使用ASP等语言进行Web编程,但是随着网络环境的改变以及网站形态的变化,越来越多的网站陆续从ASP转向PHP,目前国外的Google、Facebook,国内的淘宝、百度等大型网站,都使用了PHP语言进行前端实现。
这样的趋势变化,与本身PHP语言的优势有很大的关系。一来是因为PHP语言具备跨平台的优势,无论是Linux还是Windows都可以进行兼容。比如我们玩虚拟主机、VPS服务器的站长都知道,如今Linux服务器成本更低,也容易找到更多的主机提供商,而且在Linux平台中PHP项目兼容性更好,且成本更低。二来PHP语法简单,有成熟的开源软件和框架支持。众所周知的WordPress、Zencart、Magento等知名开源软件都是采用PHP架构的,而相对ASP等其他语言虽然有开源软件,但是基本上是个人兴趣爱好开发的,后续版本的跟进与维护比较差。
第一、代码质量成为PHP应用性能瓶颈
需求的暴涨导致从业人员的大幅增加,如今国内的PHP程序员也越来越多,技术水平参差不齐,虽然能够完成某些功能和项目,但由于代码质量不高,项目执行效率往往大打折扣。然而很多时候,我们更重视功能的实现,而忽视了代码性能的问题,比如笔者经常看到有些网友抱怨代码执行效率低是服务器CPU、内存的性能和稳定性问题,殊不知其实是PHP执行效率出现问题导致的。
A – 开发者能力差异和技术不严谨
在国内,我们大部分从业开发者并不是科班出身,可能是后期自学或者根据公司项目的需要然后逐渐形成的具有个人和公司特点的书写代码习惯,使然基本的功能能够实现,但是代码规范化、优化性能并不是很好,这就需要我们用到监控工具检测项目不足之处。
B – 项目外包转接
我们很多公司的项目初期或者过程中都是外包团队或者其他同事完成的,在我们经手后会看到各种的不习惯的书写方式,这个时候我们就需要快速的调整和完善相互的兼容问题,可以用到监控工具实现。
C – 历史版本问题
与上面一点有些类似,因为项目的不断推进和调整,可能会出现历史版本的重叠,PHP功能实现效率执行度不高。
经常看到有人认为的”PHP是解释型语言”其实是不严谨的,PHP不是不编译,而是每次执行都编译,除此之外最严重的问题即是较难实现并行运算(注意只说”较难”,使用PHP进行并行计算的方案不止一个)。基于Op Code的存在,已经诞生了大量cache工具扩展,可以有效提升PHP应用的执行性能,如OpCache,Apc,Apcu,Xcache等等。
对于使用PHP开发的网站、接口、应用系统而言,性能的瓶颈点会在什么地方呢? 做过PHP应用性能优化的朋友们都知道,递归、循环、资源操作、资源释放等都是常见的瓶颈点,这些经常会造成阻塞或锁。
可以得出CPU 、内存 、各种I/O、各种网络带宽等的消耗是性能瓶颈点中的重中之重,我们可以简单归结为:外部服务(如第三方API),资源读写,代码异常。
处理这些问题的通用作法是使用Xhprof,Xdebug或PHP-trace等工具来找出,并配合架构师或高级工程师经验来处理,方法包括单例、事务、按需加载、短事务、及时释放等等(对于大多数公司与开发人员来讲,碰到性能问题更多的作法是盲目的猜测与挠头),但这些方法有哪些不足呢?
一眼可知,只能在测试或生产环境,产生问题并明确之后进行处理.测试环境还好,但如果是生产环境,事后处理虽能补救,但大多数面对的都是因功能受损造成的投诉或更严重的业务损失。
能够在生产环境第一时间发现或规避可能的性能问题;准确记录已知或未知故障现场。这两点,则成为应用性能管理的迫切需求。
传统的方法往往要耗费很多时间,而且对技术要求非常高,水平一般的程序员往往很难独自搞定。所以笔者建议大家试试透视宝这款产品,与我们熟悉的监控宝一样来自云智慧,这是一款应用性能管理软件,可以对应用底层的代码执行效率进行全面的监控,帮助程序员快速发现影响应用执行速度的性能瓶颈,轻松实现代码的调整和优化。
第二、透视宝PHP监控原理与优势
云智慧透视宝通过对PHP代码执行的深入研究实现,在不影响应用系统原有代码执行性能的情况下,实现PHP代码性能监控最简单有效的方式是通过PHP扩展,而云智慧透视宝的PHPAgent正是利用了以下几个Hook:
A - zend_compile_file & zend_compile_string
加载分析文件或字符串,本身就会造成非常大的IO,如果过多地执行加载,无疑会造成内存和CPU的消耗.通过这两个hook,可以取得文件名、执行行数、使用内存和CPU占用时间。
B - zend_execute & zend_execute_internal
通过这两个hook的使用,我们可以准确地分析得出一个PHP应用中的类调用、方法调用、方法参数、内存占用和CPU占用,加以分析,便可以准确得出应用系统运行过程中的方法运行栈,API调用地址,SQL语句,Cache Key以及Cache命中等关键信息。
C - zend_throw_exception_hook
利用异常钩子,可以准确地得到应用系统运行过程中出现的异常信息,当然包括异常发生的类\方法位置,参数,异常code和异常message。
D - zend_error_cb
错误钩子则更加直接,可以准确得到系统运行过程中出现的任何一个warning,代码错误或语法错误。
PHPAgent注册与应用Hook流程(上图)
zend_execute hook的应用示意(伪代码)
上图大致解释了PHPAgent是如何运用zend_execute hook进行数据采集的: 先取得方法名,同时通过规则过滤引擎,判断哪些是需要关注或不关注的(类\方法的黑白名单),然后通过AGENT_BEGIN宏记录方法开始时间,方法名,行数,内存起点与参数,在执行原有zend_execute之后,再通过AGENT_END宏记录结束时间,内存止点。
通过上述Hook的应用,已经可以得到我们所关注的PHP代码执行性能指标数据:类\方法执行顺序,执行时间,内存占用,接口\DB等资源连接,SQL语句和执行时间等。
经过严格的压力测试和生产环境部署实践,PHPAgent对原有应用系统的性能影响在5%以内。经过一些参数调配,可以将性能影响降到更低,这些参数包括:是否启动异常钩子、是否启动错误钩子、是否启用数据采样、是否启用栈追踪、是否使用黑白名单(URL\Header\Cookie\Request Params)、是否启用UDP发送代理、关注请求时间响应阈值、关注方法时间响应阈值。
对于我这样没有太多经验的PHP开发者来说,透视宝具备面向多平台和多语言的应用监控与代码诊断,比如我们常用的PHP语言项目,可以帮助我们快速的开发、部署和维护应用,可以帮助我们检测应用存在的性能风险以及执行效率低的代码和SQL执行语句,此外,还可以帮助我们提升代码的书写习惯和编程水平。
第三、透视宝PHP监控性能的实现与部署
普通的站长和开发者在使用PHP开源软件和框架的时候,也可以使用透视宝进行应用的性能的检测,以便于我们优化应用的执行效率。要知道,很多时候服务器性能的变化,并不一定是服务器的稳定性问题,而是应用程序的执行效率问题。
透视宝的使用非常简单,而且目前是免费注册和使用的,接下来我们通过具体的注册和部署过程,来体验一下透视宝这款APM产品的实际应用。
A – 新注册透视宝账户
透视宝官网地址:http://www.toushibao.com/
通过上面的地址可以直接进入透视宝官方网站,看到下图所示。
然后,点击右上角”免费使用”,开始注册。
根据上图填写注册信息,注册我们的个人账户,通过电子邮件激活。PS:如果我们有监控宝账户的,可以直接用我们监控宝账户登录(云智慧旗下的产品账户是通用的)。
B – 监控应用部署
因为我们是新注册账户,所以登录后台看到的当前没有应用,我们需要看到上图,点击”配置-应用”,进行创建应用。
1、选择系统类型
根据我们自身项目主机环境选择,我这边是用到的Linux服务器,所以我选择Linux。
2、下载和安装Smart Agent
然后根据提示进度,我们下载Linux版本Smart Agent,这里有一个不好,好像无法Wget直连下载到服务器,还需要下载到本地然后拖过去,效率有点低,希望官方有所改进。
将Smart Agent下载到当前服务器的/root/目录中(官方有文档是data目录),或者我们自己找一个目录,也不要乱放,使用unzip命令进行解压。
cd /root/smart_agent #进入smart_agent目录
chmod u+x ./*.sh ./plugins/*/*.sh #授权
./plugins/SendProxy/SendProxy.sh start #安装
./SmartAgent.sh start #安装
然后我们就需要进入smart_agent目录对应上面的脚本进行安装,这里我们需要注意的root目录是我自己这边测试用到的,如果我们使用的其他目录根据自己的实际调整(下图)。
我们可以看到执行2个安装文件之后是OK提示说明一切没有问题。
3、查看服务器性能监控
安装完毕之后,我们就可以到透视宝后台菜单的”服务器”查看当前服务器的状态。
我们可以看到当前服务器的IP对应的是哪台服务器,以及当前服务器的内存使用率、CPU使用率、CPU负载,以及进程数等负载信息。
4、Smart Agent配置
简单的查看主机的运行负载信息肯定不能满足我们的需要,这就需要在主机上进一步设置透视宝的Smart Agent探针,实现更为复杂的监控功能,我这里需要监控的是PHP运行,根据透视宝文档的介绍,我们继续配置。
这里是根据我们系统的服务器环境选择的,如果是Apache,那就需要安装Apache插件,如果我们是Nginx环境,那就需要安装Nginx插件,且与前者不同的是,还需要多一个配置方法。可以参考这里:http://www.toushibao.com/help/help_operation/171
我使用的是Apache环境,那就只要简单一点,直接安装ApacheApp就可以。
安装(apacheModule实例)需要一个过程,我们看到状态等待安装完毕,然后才能继续下一步。
5、PHP监控插件配置
Smart Agent在安装完成后,加载过程中自动发现你的应用组件,如果没有自动监测到PHP环境,也可以手动添加PHP Agent。如下图所示,点击“管理”入口,进入“插件管理”,点击页面下部的“添加服务”。
点击添加服务后,选择PHPAgent,点击“创建”
创建完毕之后,我们在在列表中找到PHPAgent进行安装。
安装后检查是否启动,如果没有启动,我们点击按钮(ON)启动。
如果我们采用的是编译安装PHP,请赋脚本中APPD_PHP_PATH变量值到PHP bin目录,如: /usr/local/php-5.5.14/bin,且需要执行PHPAgent/install.sh start才可以生效。
这样,我们安装完毕之后,需要重启WEB环境才可以生效。
等待几分钟后,我们就可以在”应用”中看到已经存在的应用部署列表。
第四、透视宝PHP监控功能特点
在功能方面,透视宝无论是在PHP,还是其他如Java、.NET等主流语言的监控上,都包括:查看执行最慢的10个元素,包括元素执行次数、持续时长和占用时长百分比;查看HTTP请求参数,包括请求的响应状态、链接页面、具体的请求参数及返回结果;查看代码执行堆栈的详细树状信息,包括每个方法的计算时间、总耗时和被调用的次数,您能直接看到特殊标识的最慢方法;查看涉及SQL语句的总耗时排序,包括SQL执行总耗时、执行次数和具体的查询语句;第三方API调用。
1、PHPAgent发现的某应用的资源拓扑与请求响应
2、散点柱饼图描述了某段时间内一个PHP应用的请求响应时间分布
我们可以通过上图,直接准确的看到哪些有问题的请求。
3、对于某一个单次请求事务的拓扑与代码运行栈可以准确地进行分析
4、对一个应用中PHPAgent发现的一段时间内对Mysql资源操作的分析
5、基于某一个集群的应用,透视宝可以自动进行总拓扑的识别和描绘。
当然,我们依旧可以对已经识别的应用站点拓扑进行分组高亮。
总结,目前透视宝支持PHP、Java、.NET、Python等多种语言环境,无论是程序开发人员进行脚本兼容性和代码性能排查,还是服务器运维人员快速发现应用系统性能瓶颈,透视宝都是准确发现问题、解决问题、提升工作效率的好帮手。