通常做性能测试可以分为以下几个步骤.
1、了解被测试应用的协议以及被测系统的组成架构;
2、设计测试压力测试用例,编写压力测试脚本;
3、执行压力测试脚本,生成压力,监控系统;
4、收集并分析数据;
5、得出结论。
下面根据这几个步骤展开讨论。
了解被测系统的协议和组成架构是为了选取对应的压测用户,同时也为设计压测场景用例做准备。各个工具支持不同的协议,市场上使用的测试工具很多,web常用的工具有loadrunner和开源的测试工具Jmeter,以及云端压力测试工具:阿里云PTS,Loadstorm;不同的系统的组成架构,是单机还是分布式的,根据被测系统和熟悉度和测试场景选取合适的压测工具,抓包,监控等的工具。例如常用的web的压测工具:jmeter+badboy+监控工具,是简单,快捷,有效的组合之一。
设计测试压力测试用例,编写压力测试脚本:一般选取最频繁使用的功能,最耗资源的功能,性能测试场景包括单点场景还是组合场景。性能测试用例的设计一定要在了解业务和系统共的基础上,否则测试用例的有效性会大打折扣。如何证明测试结果的有效性,其实是个很难的问题,值得花费时间去认真思考。这个过程涉及到一些很重要的内容,如用户模型的建立。
压力脚本的输出依据选择的测试工具和设计的测试。场景有所不同,有些web的测试脚本可以通过测试工具原有的录制功能,有些测试脚本需要二次开发。不同的测试场景在设计脚本是会出现不同的技术难题,例如验证码的校验,附件上传等。对于这些问题,笔者也没有万全的方法,还在探索中。
执行压力测试脚本,生成压力——>>监控系统——>>收集并分析数据,这三步是同步进行的,在生成数据需要对结果进行分析,分析排除脚本的的问题,有的时候在制作脚本时候的一些疏忽一会对结果产生很大的影响,例如有脚本有这样一个场景,其中有一步是上传附件,但是脚本没有控制好,一个线程里面就上传了1000次相同的附件,所以这个过程就会占用网络等资源,造成测试结果的失真。考虑到环境等不稳定等其他的异常因素的影响,一个脚本最好在不同的时间点重复执行3 左右,如果每次执行的结果是一样,再将此做为最终的结果,确保自身的测试脚本和测试工具不要成为瓶颈。
得出结论,这步中重要的是对性能瓶颈的分析,同时这个问的比较广,要确认具体的性能瓶颈在哪里。
性能的瓶颈成因有:
1、硬件上的瓶颈(CPU,内存);
2、应用软件的瓶颈(web应用服务器,数据库);
3、应用程序的性能瓶颈;
3、操作系统的性能瓶颈;
4、网络设备的性能瓶颈(防火墙,动态负载均衡器,交换机设备);
应用程序本身瓶颈,这个是测试过程中最需要去关注的,需要测试人员和开发人员配合执行,然后定位逐步细化分析,先可以监控一些常见衡量CPU,内存,磁盘的性能指标,进行综合分析,然后根据所测系统具体情况,进行初步问题定位,然后确定更详细的监控指标来分析。
· 下面将****jemter****为主,介绍****http****请求和****java****请求的操作案例
Jmeter简介:Jmeter支持的协议有Http Https FTP Websocket TCP/IP SSL等协议
Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器,网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。
Jmeter的优点是对java协议的良好支持,是jmeter比loadrunner优秀的地方, jmeter安装简单,只需要解压jmeter文件包就可以,不用安装,要是你想执行调试测试脚本。
** A. ****以****http get****请求举例输出****jmeter****测试脚本**
- 添加线程组
(选择可视化界面中左边树中的“测试计划”节点,点击“编辑”菜单---> “添 加”--->”线程组”,添加一”线程组”后,“测试计划”节点下多了“线程组” 节点
2.添加HTTP请求默认值(用来配置公共参数,不是http请求)
设置“HTTP请求默认值”的主要参数: 服务器名称或IP:被测试服务器的ip地址或者名字。在这里设置为 www.baidu.com,端口号:服务器的端口号,443路径:目标的URL路径(不包括服务器地址和端口)
设置“HTTP请求”的主要参数: 方法:选择get get方式可以进行参数的添加,对服务器端发送参数。
- 添加断言:断言就类似LoadRunner中的检查点。对上一个请求返回的信息,做字符串、数据包大小、HTML、XML、图片等做判断,确保返回的信息的准确性。
2.添加监听器
- 单击右键,选择“添加”—〉 “监听器”—〉“聚合报告” 设置“聚合报告”查看结果:
Label:每个JMeter的element的Name值。例如HTTP Request的Name
Samples:发出请求数量。Average:平均响应时间(单位:)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以
- 单击右键,选择“添加”—〉 “监听器”—〉“查看结果树” 查看:当然也可以添加其他的类型来查看结果
通过察看结果树,我们可以看到每个请求的结果,其中红色的是出错的请求,绿色的为通过。
3)点击视图中的“运行”测试即可。
B. ****以****JAVA****请求举例输出****jmeter****测试脚本:
Java请求的性能测试与http请求的性能测试类似,都是给远程应用提供的服务发送请求并施压,得到响应结果及性能数据。不同的是,http调用的是应用提供的http协议的服务,而java请求调用的是应用提供的接口服务,且需要通过编写代码来实现java请求的调用
-
Java测试代码编写
2.引入jmeter的jar包
将{Jmeter_home}\lib\ext目录下的ApacheJMeter_core.jar和ApacheJMeter_java.jar两个jar包复制到测试项目的lib目录下,这两个包是编写java请求性能测试代码必须的
public Arguments getDefaultParameters();设置入参,已设置的参数会显示在jmeter GUI的参数列表中
public void setupTest(JavaSamplerContext context);初始化方法,用于初始化性能测试的每个线程,每个线程前都会执行一次。
public SampleResult runTest(JavaSamplerContext arg0);性能测试的线程运行体,测试执行主体,从arg0中获取参数,并调用被测方法,完成与服务器的交互。该方法是java Sampler实现的重点,执行次数取决于线程数和循环次数。
public void teardownTest(JavaSamplerContext arg0);测试结束时调用,每个线程执行一次。setupTest和teardownTest方法不需要时可以不写。
以上4个方法中只有runTest是必须实现的,其他3个可根据需求去覆盖。这4个方法执行的先后顺序与其前面的序号相对应,分别为:getDefaultParameters()、setupTest(JavaSamplerContext context)、runTest(JavaSamplerContext arg0)、teardownTest(JavaSamplerContext arg0)。下面是调试的案例,如果使用过Junit或者其他测试框架,就可以看出和自动化的案例很相似。
如果需要对多个方法进行性能测试,则需要建多个测试类,多个测试类可以放在同一个包下面,也可以放在单独的包中
3.打成jar包
代码编写好并测试完成后,将项目打成jar包,打包完成后将其放到jmeter的扩展包目录下,即{Jmeter_home}\lib\ext,并将项目的依赖包都放到{Jmeter_home}\lib目录下
4.依据生产http请求的方式生产JAVA请求,这里详细步骤不再描述
· Jmeter****分布式执行
在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能
Jmeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。执行时,Controller会把脚本发送到每台Agent上,Agent 拿到脚本后开始执行,Agent执行时不需要启动Jmeter,只需要把jmeter-server.bat文件打开,它应该是通过命令行模式来执行的。执行后,Agent会把结果回传给Controller,Controller会收集所有Agent的信息并汇总。详情如下图所示:
- 代理机(Agent)配置:
Agent机上需要安装JDK、Jmeter,并且配置好环境变量。
打开Jmeter/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”,把这一行修改为”remote_hosts=192.168.7.126:1088, 1088是端口号,可以随意自定义。
打开jmeter-server.bat文件,就设置完成了,等待控制机(Controller)启动。
- 控制机(Controller)配置:
Controller机上需要安装JDK、Jmeter,并且配置好环境变量。
打开Jmeter/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”,把这一行修改为”remote_hosts=192.168.8.149:1099,192.168.8.174:1099,1099是端口号,可以随意自定义。如果有多台代理机,这里需要把所有的代理机的IP地址和端口号都加入进来。
打开jmeter-server.bat文件,设置完成了。
注意:控制机和代理机的****JDK****版本和****Jmeter****版本要保持一致
l 经常遇到的性能问题:
1. 在高并发的情况下,产生的处理失败(比如:数据库连接池过低,服务器连接数超过上限,数据库锁控制考虑不足等),索引的缺失以及复合索引创建不合理会减慢SQL的查询性能,从而使整个网站变慢。
2. 内存泄露(比如:在长时间运行下,内存没有正常释放,发生宕机等)
3. CPU使用偏离(比如:高并发导致CPU使用率过高)
4. 日志打印过多,服务器无硬盘空间
l 如何定位这些性能问题:
1. 查看系统日志,如果日志记录的全面,很容易通过日志发现问题。比如,系统宕机时,系统日志打印了某方法执行时抛出out of memory的错误,我们就可以顺藤摸瓜,很快定位到导致内存溢出的问题在哪里。
2. 利用性能监控工具,比如:JAVA开发B/S结构的项目,可以通过JDK自带的Jconsole,或者JProfiler,来监控服务器性能,Jconsole可以远程监控服务器的CPU,内存,线程等状态,并绘制变化曲线图。还有其他的监控工具和手段可以结合使用,更快的定位问题的所在
我们需要关注的性能点有:CPU负载,内存使用率,网络I/O等
3. 了解系统参数配置,可以进行后期的性能调优