传统软件项目微服务化升级系列-php-性能分析
时间:2023-01-03 06:00:00
进行微服务拆分及改造前我们需要清除的知道改造的目的和性能瓶颈。
本文针对php一般性能瓶颈会集中在以下几个方面:
从表象上看:
响应速度慢
2.同时处理低连接数
3.系统可容纳的用户数低
从资源的角度来看,内部分析基本上是:
1、服务器带宽资源不足(入口服务器带宽、出口服务器带宽)
2.计算资源不足(CPU负载高,等待过程多。
3.存储资源不足(磁盘读写负载高)
4.内存资源不足(内存交换频繁,过程切换慢)
从优化的角度来看,继续深入分析将是:
1.静态资源占用带宽过多,大文件服务占用带宽过多,要求集中,峰值高
2.业务逻辑负载,计算过程复杂,数据量大
3.数据库压力大,数据更新耗时长,数据库单点热点数据压力集中
4、IO等待时间比例大,过程处理效率低
5.程序内存占用量大
因此,我们从解决方案中考虑:
1.业务拆分:根据业务热点动态部署硬件资源
2.静态资源分离,启用CDN
3.合理使用缓存、复杂数据离线计算、缓存结果
4.数据库读写分离或启用分布式数据库、数据库分库表中间件等
5.优化程序处理逻辑
6、IO事件驱动模型集中应用
根据业务选择实现方案。关键思想是拆分和缓存。
常用的性能分析工具有xdebug和xhprof,xhprof更适合生产环境:https://blog.csdn.net/maquealone/article/details/80434699
下面介绍使用情况xhprof进行php业务系统中的瓶颈点是通过性能分析进行性能分析,其主要问题是计算逻辑优化、数据库优化、缓存优化等。
一、安装
注:如未安装php-devel 需要先安装php-dev,如果是php71 72等版本需要使用yum install php71w-devel 类似命令。
二、图形界面
xhprof也可以使用简单的界面xhprof.io。curl-sShttps://getcomposer.org/installer|php
添加参数ay[debug]=1 参见具体错误信息
三、嵌入
支持几种方式
1、直接修改代码:xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
2、配置php.ini参数,嵌入文件:auto_prepend_file = /opt/inject.php
注:如果添加后没有请求记录,请检查php.ini里面还有别的吗?auto_prepend_file句子,把自己的放在最后。
四、自带图形界面
修改inject.phpif(extension_loaded('xhprof')){
$xhprof_config=require__DIR__.'/../xhprof/includes/config.inc.php';
if(!empty($xhprof_config['enable'])&&$xhprof_config['enable']()){
xhprof_enable(XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU);
register_shutdown_function(function()use($xhprof_config){
//保存xhprof数据
if(function_exists("xhprof_disable")){
$xhprof_data=xhprof_disable();
define("DEBUG_LIB","/home/xhprof/xhprof_lib");
include_onceDEBUG_LIB."/utils/xhprof_lib.php";
include_onceDEBUG_LIB."/utils/xhprof_runs.php";
$xhprof_runs=newXHProfRuns_Default();
$uri=$_SERVER['HTTP_HOST'].$_SERVER['PATH_INFO'];
$uri=str_replace('.','\\','|'],'_',$uri);
$xhprof_runs->save_run($xhprof_data,$uri);
}
});
}
}
访问xhprof_html目录下的文件
如果提示访问流程图failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
原始生成流程图需要使用graphviz软件的dot我们可以通过命令yum installgraphviz 进行安装
五、其他性能监测工具
yii2框架自带的debug该模块包含性能分析部分。
xhprof字段意义概述
FunctionName:方法名称。
Calls:调用方法的次数。
Calls%:同级方法总数调用次数中方法调用次数的百分比。
Incl.WallTime(microsec):该方法的执行时间,包括子方法的执行时间。(单位:微秒)
IWall%:执行方法所花费的时间百分比。
Excl.WallTime(microsec):方法本身的执行时间不包括子方法的执行时间。(单位:微秒)
EWall%:执行方法本身所需的时间百分比。
Incl.CPU(microsecs):执行方法的费用CPU时间,包括子方法的执行时间。(单位:微秒)
ICpu%:执行方法的费用CPU时间百分比。
Excl.CPU(microsec):实施方法本身的费用CPU时间,不包括子方法的执行时间。(单位:微秒)
ECPU%:方法本身执行费用。CPU时间百分比。
Incl.MemUse(bytes):该方法占用的内存,包括子方法占用的内存。(单位:字节)
IMemUse%:方法占用的内存百分比。
Excl.MemUse(bytes):方法本身占用的内存不包括子方法占用的内存。(单位:字节)
EMemUse%:方法本身占用的内存百分比。
Incl.PeakMemUse(bytes):Incl.MemUse峰值。(单位:字节)
IPeakMemUse%:Incl.MemUse峰值百分比。
Excl.PeakMemUse(bytes):Excl.MemUse峰值。单位:(字节)
EPeakMemUse%:Excl.MemUse峰值百分比。
xhprof.io界面