搜索
首页后端开发php教程云智慧透视宝PHP应用性能监控实现原理

云智慧 Neeke

 

一。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资源操作的分析。

 

 

 

 

 

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

 

 

 

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

 

 

 

 


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

Laravel中的通知Laravel中的通知Mar 04, 2025 am 09:22 AM

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),