领域探索-PHP性能分析工具

来源:互联网 发布:angulartouch.min.js 编辑:程序博客网 时间:2024/05/29 18:04

领域探索·PHP性能分析工具

一、ApacheBench(ab)压力测试工具

1.1 简介

ab的全称是ApacheBench,是 Apache附带的一个小工具,专门用于 HTTPServerbenchmarktesting,可以同时模拟多个并发请求。

主页地址:http://httpd.apache.org/docs/2.0/programs/ab.html

centos安装abyuminstall httpd-tools

ApacheBench命令原理ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它是针对http的访问测试,因此,既可以用来测试Apache的负载压力,也可以测试nginxlighthttptomcatIIS等其它Web服务器的压力。

1.2 使用

ApacheBench参数说明

格式:ab[options] [http://]hostname[:port]/path

参数说明:

-n requests Number of requests toperform //在测试会话中所执行的请求个数(本次测试总共要访问页面的次数)。默认时,仅执行一个请求。

-c concurrency Number of multiplerequests to make //并发请求数(默认是一次一个)

-t timelimit Seconds to max. wait forresponses //测试任务的最大时间限制(单位:秒),其内部隐含值是-n 50000。它可以实现对服务器接口的测试在固定时间内完成,默认时,没有时间限制。
-p postfile File containing data toPOST //包含了需要POST的数据的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt(配合-T
-T content-type Content-type headerfor POSTing//POST数据所使用的Content-type头信息,如 -T“application/x-www-form-urlencoded” (配合-p
-v verbosity How much troubleshooting info to print
//
设置显示信息的详细程度– 4或更大值会显示头信息,3或更大值可以显示响应代码(404,200), 2或更大值可以显示警告和其他信息。-V显示版本号并退出。
-w Print out results in HTML tables//
HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i Use HEAD instead of GET//
执行HEAD请求,而不是GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3″ (repeatable)//-Ccookie-name=value
对请求附加一个Cookie:行。其典型形式是name=value的一个参数对。此参数可以重复,用逗号分割。
提示:可以借助session实现原理传递 JSESSIONID参数(JAVA服务器默认传递sessionid的名称为:JSESSIONID),实现保持会话的功能,如
-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″

-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Insertedafter all normal header lines. (repeatable)

-A attribute Add Basic WWW Authentication, the attributes are acolon separated username and password.
-P attribute Add Basic Proxy Authentication,the attributes are a colon separated username and password.//-Pproxy-auth-username:password
对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(,是否发送了401认证需求代码),此字符串都会被发送。
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message) //-attributes
设置属性的字符串.缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现HTTP/1.x;仅接受某些预想的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即你可能是在测试ab而不是服务器的性能。

常用参数-n -c

示例:ab -n 1000 -c 100http://cq01-rdqa-dev008.cq01.baidu.com:8512/test.php // -n 1000表示1000次请求,-c 100表示100次并发

1.3 实例

1)固定参数

ab -n 100 -c 10 http://cq01-rdqa-dev008.cq01.baidu.com:8512/test.php?uid=5372539&count=10

 

Requests per second:    1521.70 [#/sec] (mean)

最关心的指标之一:吞吐率(相当于LoadRunner中的每秒事务数,后面括号中的 mean表示这是一个平均值)。

 

Time per request:       6.572 [ms](mean)

最关心的指标之二:指的是用户平均请求等待时间(相当于LR中的平均事务响应时间,后面括号中的 mean表示这是一个平均值)。

 

Time per request:       0.657 [ms](mean, across all concurrent requests)

最关心的指标之三:指的是服务器平均请求处理时间。

 

2)可变参数的POST请求

ab -n 100 -c 10 -p./1.txt-T 'application/x-www-form-urlencoded'http://cq01-rdqa-dev008.cq01.baidu.com:8512/evaluate.php"

-p 参数表示POST的数据

1.txt文件内容:

uid=5372539&count=50

uid=5372539&count=100

uid=5372539&count=100

uid=5372539&count=100

uid=5372539&count=100

二、XHProf性能分析工具

2.1 简介

XHProf (A Hierarchical Profiler For PHP)是一个轻量级的分层性能测量分析器,是C实现的PHP Zend扩展,最初是facebook的程序员写的,是分层的函数调用级别的分析函数执行的时间、CPU计算时间、内存消耗的PHP性能分析工具。

2.2 使用

1)安装XHProf

wget http://pecl.php.net/get/xhprof-0.9.2.tgz

tar zxvf xhprof-0.9.2.tgz

cd xhprof-0.9.2

mkdir /data/xhprof/logs/

cp -r xhprof_html xhprof_lib <directory_for_htdocs>

cd extension/

/usr/local/webserver/php/bin/phpize

./configure --with-php-config=/usr/local/webserver/php/bin/php-config

make

make install

2)修改php.ini

[xhprof]

extension=xhprof.so

3)安装Graphviz

http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz

tar zxf graphviz-2.28.0.tar.gz

cd graphviz-2.28.0

./configure

make

make install

 

备注:./configure prefix=/home/users/tongzhen/smbiz/local/lib/graphviz--with-png=yes --disable-swig

4)应用XHProf

xhprof类: ZxXhprof.php[下载]

{

ZxXhprof::xhprofStart();

//程序段

……

ZxXhprof::getXhprofData('plan');

}

2.3 实例

详情见github:https://github.com/tongzhenredy/bfwphpapp

VHOST配置(示例:root直接指向bfwphpapp的上层目录):


访问链接:

http://github.baidu.com/bfwphpapp/resqueshow/app.php?target=mod_statrequest

 

xhprofui_detail表结构:

DROP TABLE IF EXISTS `xhprofui_detail`;

CREATE TABLE `xhprofui_detail` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `url` varchar(2048) NOT NULL,

  `host` varchar(256) NOT NULL,

  `uri` varchar(256) NOT NULL,

  `xhprof_id` varchar(128) NOT NULL,

  `xhprof_data` longtext,

  `xhprof_time` varchar(32) NOT NULL,

  `ct` int(11) NOT NULL,

  `wt` int(11) NOT NULL,

  `mu` int(11) NOT NULL,

  `pmu` int(11) NOT NULL,

  `cpu` int(11) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

工具使用说明:https://github.com/tongzhenredy/bfwphpapp/blob/master/README.md

该工具将原本记录到日志中的数据(xhprof原生数据记录到日志中),按用途区分统一存储到了mysql数据库中,可以实时监控生产环境下实时的接口耗时数据统计,功能分为单次请求统计和分时请求统计。

1)单次请求统计,可以按照需求按接口类别以时间为维度记录到各个接口的耗时情况,统计指标有:接口耗时总时间,内存使用、峰值内存使用以及CPU时间,同时从列表中可以查看各个接口函数耗时的实时统计。(包含基础的统计和分析功能)

示例图【图片点击可放大】:

 

 

查看详情【图片点击可放大】:

 




2)分时请求统计,可以实现对生产环境下数据的统计对比展现,按时间区分过去一小时、6小时、24小时,2天、一周和今天以及昨天对比的数据。(下图为页面样式,因之前的测试数据是201507月份,暂看不到下方的曲线图)

【图片点击可放大】

 

 

三、专业的压力测试工具

3.1 Jmeter

3.1.1 简介

Apache JMeterApache组织开发的基于Java的压力测试工具。

Apache JMeter 可以用于对静态的和动态的资源(文件,ServletPerl脚本,java对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器,网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

http://jmeter.apache.org

3.1.2 使用

下载:http://jmeter.apache.org/download_jmeter.cgi(需要安装JDK并配置路径)

windows下打开:解压下载包后,在对应的jmeter路径中,找到解压路径\bin\jmeter.bat

入门教程:http://jingyan.baidu.com/article/19192ad814d00fe53e570736.html

 

常用名词:

1、线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在测试计划->添加->线程组来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-UpPeriod(in seconds)、循环次数,其中Ramp-UpPeriod(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up =200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载;

2、取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很种,如:HTTP请求;

3、断言:对取样器返回的请求结果给出判断,是否正确;

4monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。


JMeter 的主要测试组件总结如下:

1测试计划是使用 JMeter进行测试的起点,它是其它 JMeter测试元件的容器。

2线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。

3monitor负责收集测试结果,同时也被告知了结果显示的方式。

4、逻辑控制器可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。

5、断言可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。

6、配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。

7、前置处理器和后置处理器负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。

8、定时器负责定义请求之间的延迟间隔。

3.1.3 实例

1)带参数的测试计划

示例脚本:updatePlan.jmx

 

附加参数文件内容样式:plan0318.txt(“\t”分隔)

18624478,18628036,18651520,18652579,18751940

19555197,19581856,19582012

 

3.2 LoadRunner专业级性能测试

3.2.1 简介

LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。

LoadRunner是一款专业级的性能测试软件(收费),一般是QA同学进行压力测试最为权威的并被广泛认可的工具,作为开发的同学需要了解一些LoadRunner的运行基本原理。

 

3.2.2 工作原理

 

LoadRunner由四大组件组成:VuGen、控制器、负载发生器和分析器。

 

1VuGen发生器:捕捉用户的业务流,并最终将其录制成一个脚本:(1)选择相应的一种协议;(2)在客户端模拟用户使用过程中的业务流程,并录制成一个脚本;(3)编辑脚本和设置Run-TimeSettings项;(4)编译脚本生成一个没有错误的可运行的脚本。

 

2、控制器(Controller):(1)设计场景,包括手动场景设计和目标场景设计两种方式;(2)场景监控,可以实时监控脚本的运行的情况。可以通过添加计数器来监控Windows资源、应用服务器和数据库使用情况。

 

场景设计的目的是设计出一个最接近用户实际使用的场景,场景设计越接近用户使用的实际情况,测试出来的数据就越接近真实值。

 

3、负载发生器(LoadGenerators):模拟用户对服务器提交请求。

 

通常,在性能测试过程中会将控制器和负载发生器分开;当使用多台负载发生器时,一定要保证负载均衡(指在进行性能测试的过程中,保证每台负载发生器均匀地对服务器进行施压)。

 

4、分析器(Analysis):主要用于对测试结果进行分析。

 


 

总结:

在实际应用中,我们最为关心的是接口的平均响应时间和吞吐量的值,这部分指标是可以通过ab工具或者jmeter等专业工具压力测试得到结果的,但是具体到应用中各个功能的实现中的性能瓶颈xhprof工具绝对是不二选择,可以通过查看函数执行的流程定位到耗时严重的模块,这个耗时统计是基于函数级别的,对制定优化方案左右非常大,同时对优化前和优化后接口指标的评估还是需要像类似jmeter这类专业工具在相同参数和应用环境下来完成的。

 

 

0 0
原创粉丝点击