进行微服务拆分及改造前我们需要清除的知道改造的目的和性能瓶颈。

本文针对php项目进行性能分析,一般性能瓶颈会集中到以下几个地方:

从表象上看是:

1、响应速度慢

2、同时处理连接数低

3、系统可容纳的用户数低

往内分析从资源上看基本上会是:

1、服务器带宽资源不足(入口服务器带宽、出口服务器带宽)

2、计算资源不足(CPU负载高、等待进程多)

3、存储资源不足(磁盘读写负载高)

4、内存资源不足(内存交换频繁、进程切换慢)

继续往深层次分析,从优化角度上看会是:

1、静态资源占用过多带宽、大文件服务占用过多带宽、请求集中、峰值大

2、业务逻辑负载、计算过程复杂、数据量大

3、数据库压力大、数据更新耗时长、数据库单点热点数据压力集中

4、IO等待时间占比大,进程处理效率低

5、程序内存占用大

所以我们从解决方案上考虑重点考虑:

1、业务拆分:根据业务热点进行动态的进行硬件资源的调配

2、静态资源分离,启用CDN

3、合理运用缓存、复杂数据离线计算、缓存结果

4、数据库读写分离或启用分布式数据库、数据库分库分表中间件等

5、优化程序处理逻辑

6、IO集中型应用使用事件驱动模型

再具体的根据业务选择实现方案。关键思想是拆分、缓存。

下面介绍使用xhprof进行php性能分析,通过性能分析找到业务系统内的瓶颈点,这个步骤主要发现的问题是计算逻辑优化、数据库优化、缓存优化等。

一、安装

备注:如果没有安装php-devel 会需要先安装php-dev,如果是php71 72等版本,需要使用yum install php71w-devel 类似命令。

二、图形化界面

xhprof自带简单的界面,也可以使用xhprof.io。curl -sS https://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_once DEBUG_LIB . "/utils/xhprof_lib.php";
include_once DEBUG_LIB . "/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_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 install graphviz 进行安装

微服务软件性能设计文档 微服务性能瓶颈_子方法

五、其他性能监控工具

yii2框架自带的debug模块包含性能分析部分。

xhprof字段含义概要报告字段含义

Function Name:方法名称。

Calls:方法被调用的次数。

Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。

Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)

IWall%:方法执行花费的时间百分比。

Excl. Wall Time(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界面

微服务软件性能设计文档 微服务性能瓶颈_微服务软件性能设计文档_02