性能测试介绍
一、性能测试简介
1、性能测试的知识架构
性能测试牵扯到的范围比较广,从其知识架构大致可以分为4块
- 业务及架构知识:了解自己所属产品或项目的业务逻辑及软件架构,业务决定架构,一定不要脱离业务去谈架构和学习框架;
- 工具知识:熟练使用一些性能测试工具,每种性能测试工具都有其适合的应用场景,比如siege适合简单的页面benchmark,jmeter适合复杂场景的性能测试等;
- 系统知识:了解被测试操作系统,了解系统性能指标,可以通过指标指出系统瓶颈;
- 编程知识:熟练使用一门编程语言,可以使用该语言对性能测试进行二次开发或加强,当然如果编程能力不强的话,可以使用jmeter进行愉快玩耍;
从重要程度上看,业务及架构知识和工具知识比系统知识和编程能力要重要;
2、服务端性能测试学习路线图
- 首先学习一种性能测试工具,学会如何模拟真实的业务请求,如何产生负载,如何生成和查看测试报告,如何对报告进行简单的分析;
- 学习业务逻辑和业务架构,学会如何搭建测试环境,业务用到了哪些中间件,这些中间件有哪些性能指标,这些中间件的性能最佳实践等;
- 学习系统知识,了解操作系统的性能指标,学会对操作系统进行监控等;
- 学习编程知识,学会对测试工具做二次开发,对测试数据做二次处理等;
3、客户端性能测试学习路线图
- 了解被测试系统及应用性能指标,学会用指标去度量被测试应用的性能;
- 学习相应的性能测试工具,比如ios的话学会用instrument,通过instrument寻找被测试应用的内存泄漏等;
- 学习编程知识,学会对测试工具做二次开发,对测试数据做二次处理等;
4、工具学习
- 官方文档,通过官方文档去学习;
- 学会搜索遇到问题去google或bing里面搜索,学会用英文关键字搜索,往往更为精确;
- StackoverFlow和github:StackoverFlow适合搜索普适性问题,也就是大多数人会遇到的问题,github可以搜索到一些开源软件的安装问题,比如某些版本死活安装不上,这样就可以去github该工具的issues里面碰碰运气;
3、服务端与客户端性能
在学习性能测试之前,先搞清楚性能测试的两个方向,分别是服务端和客户端
服务端:
服务端主要关注服务器上运行软件的性能,服务器可以理解成是性能和稳定性更好的机器,当服务端的性能出现问题的时候,一般指的是服务器上某些应用遇到了性能问题。
客户端:
客户端性能一般指的是具有图形界面的应用程序的性能,例如某些移动app的性能,也就是客户端应用的性能。客户端应用一般都安装在手机和个人电脑上,当客户端应用出现性能问题时,一般的表现就是应用的操作不流畅,图形界面产生卡顿等,很多时候,客户端的性能是可以很容易被测试人员感受到,因此客户端的性能问题比较容易被发现。
分清问题的类型
一般单机应用出现性能问题,大部分都是客户端问题:
- 单机游戏卡顿
- 画图软件打开图片超慢
- 编辑器打开大于1m的代码文件需要花费1分钟
一般来说下面的一些性能问题,可能是服务端或网络问题:
- 微博api访问速度慢
- 某短信推送访问api访问速度慢
- 某云存储平台的对象存储api访问速度慢
还有一些联网应用出现性能问题,可能是客户端也有可能是服务端或网络问题
- 某聊天软件发送消息慢
- 某邮件客户端收短信都很卡
- 某直播软件声音卡顿
总结:如果是单机应用有性能问题,大部分都有可能是客户端性能问题
如果联网应用在用户不多的情况下性能表现优秀,当在线用户上升时性能出现问题,那么很有可能是服务端问题;
如果联网应用在用户不多的情况下性能表现差劲,那么很有可能是客户端或网络问题;
遇到性能问题时我们需要粗略分析性能问题究竟发生在客户端还是服务端,这样才能为后续的性能问题提供思路和指导。
另外在进行性能测试之前,对测试对象进行简单分析,在与需求方进行沟通后,我们需要确定本次性能测试的主要目标是测试服务器端性能还是客户端性能,一般来说服务器端性能通过加压可以暴露,客户端通过流畅度可以观察到性能问题。
4、服务器性能
如何衡量服务端的性能好坏?
服务端性能的好坏指标都有哪些?
- 访问速度快不快
- 能不能撑住尽可能多的访问量
服务端性能的指标有哪些?
- 并发用户数:能撑多数人;
- 吞吐量 :指在一次性能测试过程中网络上传输的数据量的总和,对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量是一个重点关注的指标,因为它能够说明系统级别的负载能力,另外在性能调优过程中,吞吐量指标也有重要的价值,如一个大型工厂生产效率与生产速度很快,一天生产10W顿货物,结果工厂的运输能力不行,就两辆小型三轮车一天拉2顿的货物,说明运输能力是整个系统的瓶颈。
- 吞吐率 : 单位时间内网上上传输的数据量,也可以指单位时间内处理客户请求的数量。它是衡量网络性能的重要指标,通常情况下,吞吐率用【字节数/秒】来衡量,当然也可以用【请求数/秒】和【页面数/秒】来衡量。不过以不同方式表达的吞吐量可以说明不同层次的问题,例如:以字节数/秒方式表示的吞吐量重要受网络基础设置、服务器架构、应用服务器制约;以请求数/秒方式表示的吞吐量主要受应用服务器和应用代码的制约。
但是从业务的角度看,吞吐率也可以用 业务数/小时或天、访问人数/小时或天、页面访问量/小时或天来衡量;
- 事务
就是用户某一步或几步操作的集合,要保证它有一个完整意义,例如:用户对某一个页面的一次请求,用户对某一系统的登录。那么如何衡量服务器对事务的处理能力,又引出TPS。
事务平均响应时间:比如登录是否够快,搜索产品会不会卡顿
- 事物成功率:在一定的负载下,事务有一些可能会失败,比如12306在人多的时候车票搜索功能不可用,当成功率低于一定值时,我们就可以认为整个修改不可用;
性能测试的基本特点
- 功能正确为前提
- 通常有一定的并发用户
- 考察服务器在一定压力下的性能指标
性能测试的目的
- 验证软件系统是否能够达到预期的性能指标
- 发现软件系统中存在的性能瓶颈,为调优指明方向
- 考察系统的稳定性
服务器的性能指标
服务端的软件都运行在服务器上,如果服务器发生了性能问题,那么服务器的一些硬件指标是能反映出本质问题的;
- 硬件指标:CPU利用率、处理器队列长度、内存利用率、内存交互页面数、磁盘IO状态、网卡带宽使用情况等;
- 中间件指标 : 数据库连接数、数据库读写响应时长、数据库读写吞吐量等; 缓存:静态资源缓存命中率、动态数据缓存命中率、缓存吞吐量等
- 网络指标:网络吞吐量、网络宽带、网络缓冲池大小
总结:性能瓶颈定位的重点在于性能指标的监控和分析;
5、性能测试类型
根据不同的测试目的,性能测试可以分为多种类型,常见的有如下几类:
- Benchmark
- 基准测试(Standard Testing)
- 负载测试(Load Testing)
- 压力测试(Stress Testing)
Benchmark
开发者对性能进行快速验证的方式;
快速感知修改前后性能的变化;
对调优的结果进行快速度量;
基准测试 关键字:单用户
基准测试指的是模拟单个用户执行业务场景时,考察系统的性能指标,验证系统和脚本是否正确;
调优基准:例如 先拿100个用户跑获取基准数据,系统调优后在跑100个用户获得数据进行对比;
获得单用户执行时间等数据:例如:单用户执行时间和1万个用户执行时间对比,误差很小的话,说明系统性能非常好;
负载测试(Load Test) 关键字:预期容量 稳定性测试
模拟系统在正常负载压力场景下,考察系统的性能指标。正常负载,主要是指用户对系统能承受的最大业务负载量的期望值,即预计系统最大应该支持多大用户的并发量。通过负载测试,目的是验证系统是否满足预期的业务压力场景。我们可以把这种测试方法称为容量测试(volume testing)
容量测试分为:带预期和不带预期 例如 :一台服务器要支撑300个用户并发属于【带预期】,看300个并发能否稳定跑一段时间,如果可以表示该系统有300个容量,相反不够300个并发用户跨了,就需要进行调优,调优后让系统能在很长时间撑住300个并发;
不带预期:例如:一台服务器不知道能撑多少并发,就不停给加压直到快跨了,获取快跨前的最大用户数;拿这个最大用户数持续跑一段时间,该用户数就是这台服务器的容量;
稳定性测试也是负载测试的一种(容量压力80%左右并发),稳定性测试的加压策略跟负载测试也很接近,都是对系统模拟出系统能承受的最大业务负载量,差异在于,稳定性测试更关注系统在长时间运行情况下系统性能指标的变化情况,例如系统在运行一段时间后,是否会出现事务处理设备,响应时间增长、业务吞吐量降低、CPU/内存资源增长等问题。
压力测试(Stress Test)关键字:压垮 逐步加压
压力测试是为了发现在多大并发压力下系统的性能会变得不可接受,或者出现性能拐点(崩溃)的情况。在加压策略上,压力测试会对被测系统逐步加压,在加压的过程中考察系统性能指标的走势情况,最终找出系统在出现性能拐点时的并发用户数(该拐点就是最大容量),也就是系统支持的最大并发用户数。
加压最大目的:逐步加压把系统压垮,查看谁先垮为调优指明方向。例如:服务器先垮,就给服务器调优,数据库先垮就给数据库调优。timeout或没有返回就是垮了;
总结:性能测试手段的重点在于加压的方式和策略。
6、性能测试工具
性能工具的组成
- 压力生产器(Virtual User Generator)
- 结果采集器(Result Collector)
- 负载控制器(Controller)
- 系统资源控制器(Monitor)
- 结果分析器(Analysis)
二、siege使用
1、siege简介安装
siege是一个很简单的性能测试工具,它的性能非常非常高因为(c和c++)开发了,一般用来做很简单的性能测试没有什么逻辑功能、就是页面浏览;例如:get请求的页面;
在linux服务器上安装:
a、更新系统 :ap
t-get update && sudo apt-get upgrade --show-upgraded 非root用户加(sudo)
安装软件 :apt-get install lrzsz lrzsz为上传和下载工具 非root用户加(sudo)
b、下载最新版本的siege源码包 : wget http://download.joedog.org/siege/siege-latest.tar.gz
c、解压:tar -zxvf siege-latest.tar.gz
d、解压后cd siege-4.0.2文件夹中
ls查看目录
e、编译 安装输入 : ./configure
root权限 输入 : make & make install
如果没有make命令输入 : apt-get install build-essential
更新系统后,就不用重新安装make编译工具
root用户不用加sudo否则需加 : sudo apt-get install build-essential
which apt-get查看apt-get在哪个目录里面
f、查看siege安装目录
g、查看帮助
siege -h
2、siege的常见参数
3、具体实战
需求1:
- 模拟20个用户同时访问
- 一共跑3个循环
实现:siege -c 20 -r 3 http://ur.tencent.com
测试报告
Transactions: 600 hits --> 服务器的访问数600。20个用户3次循环,为什么是600次? 因为还访问了页面的资源(css,图片,js)等;
Availability: 90.91 % --> socket连接成功率。算法是,如果页面发生timeout,4XX,5XX请求失败,成功率等于(所有请求-失败请求)/总请求数
Elapsed time: 11.71 sec --> 所有请求耗费的时间
Data transferred: 34.26 MB --> 所有请求传输的数据量
Response time: 0.21 secs --> 平均响应时间
Transaction rate: 51.24 trans/sec --> Transactions 600 除以 Elapsed time 11.71 一秒51,24次访问
Throughput: 2.93 MB/sec --> 吞吐量,1秒可以传输2.93mb的数据
Concurrency: 10.82 --> 平均并发的请求数,平均可以并发10.82个请求(没有什么用,但是该值越大越好,越大表示并发能力强)
Successful transactions: 600 --> 成功transactions
Failed transactions: 60 --> 失败transactions
Longest transaction: 7.88 --> 最耗时的请求时间
Shortest transaction: 0.02 --> 最短单个请求时间
需求2:使用siege对多个页面进行加压
http://ur.tencent.com/categories/7
http://ur.tencent.com/categories/7/?page=2
http://ur.tencent.com/categories/7/?page=3
要求:并发5,持续运行1分钟
思路:先把3个url放到文本文件中,创建文件夹 mkdir siege_scripts --> 创建文件 touch urls.txt
使用echo命令(或者vim)向文件添加3行url
echo命令使用:echo "url" >> 文件名
如:
echo "http://ur.tencent.com/categories/7" >>urls.txt
echo "http://ur.tencent.com/categories/7/?page=2" >>urls.txt
echo "http://ur.tencent.com/categories/7/?page=3" >>urls.txt
用echo而不用vim编辑文件?
因为echo可以在sheel脚本中复制该命令,从而实现自动化的事情。用vim每次都需要人工干预;
使用 cat urls.txt 查看 插入正确
执行:执行并发测试测试命令: siege -c5 -t1M -f urls.txt
结果:
需求3:使用siege对下面几个页面进行加压,以便暴露系统的瓶颈,并将结果记录到日志。
http://ur.tencent.com/categories/7
http://ur.tencent.com/categories/7/?page=2
http://ur.tencent.com/categories/7/?page=3
执行:siege -c 5 -t 1M -f urls.txt --log=result.csv
执行成功后:使用cat result.csv查看
测试结果保存到本地:
csv文件可以直接用excel打开
使用命令:sz result.csv 将结果文件拷贝到本地
如果没有sz命令使用 sudo apt-get install lrzsz安装即可 (root用户不用加sudo)
执行 sz .csv文件名 下载文件到本地
rz 上传本地文件到服务器
需求4:压测的时候启用gzip压缩
gzip压缩就是指服务器在返回请求的时候先将请求压缩一下,以减少response的体积,客户端收到response之后会自行解压,这是提升传输速度的一般做法
在请求头中加入 Accept-Encoding:gzip 就可以告诉服务器返回压缩后的response
例子:使用curl工具举例子gzip和不压缩的两种结果
root@VM-250-215-ubuntu:/tian# curl -I http://www.baidu.com 解释:请求头中没有添加压缩
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Tue, 27 Jun 2017 15:24:42 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Connection: Keep-Alive
ETag: "575e1f60-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes 返回的bytes
root@VM-250-215-ubuntu:/tian# curl -H "Accept-Encoding:gzip" -I http://www.baidu.com 解释:请求头中添加gzip压缩
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Tue, 27 Jun 2017 15:26:03 GMT
Content-Type: text/html
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Connection: Keep-Alive
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Content-Encoding: gzip 返回gzip压缩
需求5:对移动站点进行压测
思路:只需要发送相应的user-agent,服务器就会根据这个值判断浏览器是移动版还是桌面端;
该需求只需要发送iphone的user-agent给服务器,服务器就会返回移动站点的请求 ;
下面为网站返回 未添加 user-aget 返回pc端数据
#执行命令: siege_scripts# siege -c1 -r1 http://www.baidu.com
例如:
root@VM-250-215-ubuntu:/siege_scripts# siege -c1 -r1 http://www.baidu.com
[alert] Zip encoding disabled; siege requires zlib support to enable it
** SIEGE 4.0.2
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200 0.02 secs: 111548 bytes ==> GET /
HTTP/1.1 200 0.02 secs: 2947 bytes ==> GET /baidu.html?from=noscript
HTTP/1.1 200 0.02 secs: 91 bytes ==> GET /img/gs.gif
[error] HTTPS requires libssl: Unable to reach ss1.bdstatic.com with this protocol: Transport endpoint is already connected
HTTP/1.1 200 0.17 secs: 93750 bytes ==> GET /r/www/cache/static/jquery/jquery-1.10.2.min_65682a2.js
HTTP/1.1 200 0.02 secs: 705 bytes ==> GET /img/baidu_jgylogo3.gif
HTTP/1.1 200 0.09 secs: 7877 bytes ==> GET /img/bd_logo1.png
Transactions: 600 hits
Availability: 85.71 %
Elapsed time: 0.82 secs
Data transferred: 0.21 MB
Response time: 0.06 secs
Transaction rate: 7.32 trans/sec
Throughput: 0.25 MB/sec
Concurrency: 0.41
Successful transactions: 6
Failed transactions:1
Longest transaction:0.17
Shortest transaction:0.02
#下面是设定user-aget 为iphone5给服务器,返回移动站点数据
执行命令:siege_scripts# siege -c1 -r1 -A"Apple-iphone5C2/1001.525" http://www.baidu.com
例如:
root@VM-250-215-ubuntu:/siege_scripts# siege -c1 -r1 -A"Apple-iphone5C2/1001.525" http://www.baidu.com
[alert] Zip encoding disabled; siege requires zlib support to enable it
** SIEGE 4.0.2
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200 0.02 secs: 2925 bytes ==> GET /
HTTP/1.1 200 0.09 secs: 2340 bytes ==> GET /static/index/u.png
Transactions: 2hits
Availability: 100.00 %
Elapsed time: 0.35 secs
Data transferred: 0.01 MB
Response time: 0.05 secs
Transaction rate: 5.71 trans/sec
Throughput: 0.01 MB/sec
Concurrency: 0.31
Successful transactions: 2
Failed transactions: 0
Longest transaction: 0.09
Shortest transaction: 0.02
PS:总结 pc版百度首页有6个请求,模拟iphone5移动版只有2个请求,并且传输数据更小(0.21MB vc 0.01MB)
JMeter
第一个测试计划:
- 每秒钟增加1个用户去访问百度首页,这样5个用户一共需要5秒钟的时间去加载完毕
- 循环2次,共测试 5 * 2 =10个请求负载
- 共运行5秒钟
实现:
修改测试计划、线程组、HTTP请求默认值
删除ThinkTimels 和 Page Returning 404,舍得线程组
设定http请求,删除断言
循环次数:是对单用户
Ramp-Up Period(in seconds): 设置为0或1表示5个用户一同起来;
Ramp-Up Period(in seconds):用来控制加压策略,可以实现逐步加压或者一下子把全部线程加上来;
HTTP请求中的Advanced
添加 Summary Report
Summary Report报告分析
Samples 请求数总和 = 用户数 * 请求数 * 循环
Average 平均响应时间 = 总请求时间 / 总请求数 总请求时间等于每个请求时间相加,在view中统计;
Throunghput 吞吐量 : 2.1/sec 每秒的吞吐量 每分钟吞吐量 2.1 * 60 = 126 每分钟可以处理126个请求(即服务器1分钟可以处理126个请求)
如何查找最大吞吐量?
通过逐步加压找到最大吞吐量即系统的拐点,例如加压到100个用户时继续加压吞吐量开始下降了,表示100个用户时的吞吐量就是系统能处理的最大吞吐量;
用最大吞吐量可以计算出每分钟最大的请求数;
例如:每天10个小时 10万个请求 求每分钟吞吐量?
1个小时就1万个请求-->1分钟166.67个请求即每分钟166.67的吞吐量;
吞吐量和用户的关系
用户数越大吞吐量越大,加压到最大用户数后吞吐量开始下降,该拐点就是最大用户数;
例如:不停加压开始10个 -->50个--->100个每次记录吞吐量,直到找到最大吞吐量(拐点)也就是最大用户数;
吞吐量的作用:
例如:1分钟可以处理100个请求 --->1小时可以处理6000个请求 * 24小时 就是一天可以处理的请求数,如果是1台机器,我们就可以推算出10台机器可以处理多少,如果只给5台机器,那么就需要通过性能调优来降低机器的使用;
例如:10秒 100个请求 ,每秒吞吐量= 10个请求 10*60 = 600个请求每分钟 1天24小时 600*60*24=7200 标识该机器1天可以处理7200个请求,如果是最大吞吐量
最大用户数的作用:例如:该机器最大用户数为100,需求该系统支持1千人在线操作,就需要10台机器;就知道预算,如果预算只有5台机器,那么就继续优化系统,把吞吐量提升上去,最大用户数要达到200;
录制脚本
create后页面
录制时自动记录如何cookie
Jmeter 安装目录-->bin目录--->打开user.properties 文件尾端添加 CookieManager.check.cookies=false
PS:默认情况下Jmeter只录制符合规范的cookie,添加这一行后任何cookie都会录制下来。