赞
踩
性能测试就是通过性能压测工具(jmeter,loadrunner),通过特定方式,对系统施加一定的压力:正常、异常负载以及峰值来对系统实施压力,得到各项性能指标。保证系统的性能需求。
价值和目的:
1.评估系统的能力
2.识别系统的弱点:瓶颈,弱点
3.检查系统的隐藏的问题
4.检验系统的稳定性和可靠性
24*60*60
=86,400秒
TPS = 100000 * 0.8 / 86400 * 0.2 = 80000/17280 = 4.6
TPS=(50000+50000*0.3)/3600=18
提示:通常,没有特殊需求的话
1). 建议CPU不高于80%(±5)
2). 内存不高于80%
3). 磁盘不高于90%
4). 网络不高于80%
卡的比较严错误率不超过0.1%
最大响应时间不能有超过2S
考虑合理
客户:OA,1万员工,并发一万。
产品经理:单台阿里云服务器。支撑1万并发。
项目组领导:3年之后需要达到什么样的性能。
基准测试:
基准测试数据的用途:
1. 为多用户并发测试和综合场景测试等性能分析提供参考依据
2. 识别系统或环境的配置变更对性能响应带来的影响
3. 为系统优化前后的性能提升/下降提供参考指标
负载测试:
压力测试:
稳定性测试:
其他:配置测试,极限测试,浪涌测试
调优人员(开发人员、数据库管理员、系统管理员、网络管理员、性能测试分析人员)相关人员对系统进行调整;
验证-性能测试人员继续进行第二轮、第三轮……的测试,与以前的测试结果进行对比,从而确定经过调整以后系统的性能是否有提升。
系统调优由易到难的先后顺序如下:
启动jemeter的脚本 生成日志和结果的命令
jmeter -n -t /home/test.jmx -l /home/amt/1500.jtl -e -o /home/amt/rs
example:
//绝对路径
/tmp/apache-jmeter-5.4.1/bin/jmeter -n -t /tmp/test_1008.jmx -l /tmp/lyh/1.jtl -e -o /tmp/lyh/rs
/home/test/apache-jmeter-5.4/bin/jmeter -n -t /home/test/rs/text.jmx -l /home/test/1000.jtl -e -o /home/test/rs
//结果打包
tar -zcf lyh.tar.gz /tmp/lyh/*
//解包
-zxf
前提条件:安装JDK
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_151
path:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
JMETER_HOME=F:\Jmeter\apache-jmeter-5.1.1
path:
%JMETER_HOME%\bin
%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar;
JMeter启动有多种方式
java -jar ApacheJMeter.jar
jmeter.bat: windows的启动文件
jmeter.log: 日志文件
jmeter.sh: linux的启动文件
jmeter.properties: 系统配置文件
jmeter-server.bat: windows分布式测试要用到的服务器配置
jmeter-serve: linux分布式测试要用到的服务器配置
vi /etc/profile --在文件内容末尾追加
两种方式并没有太大差异,因为JAVA_HOME的值没有包含特殊字符或空格。但是在更复杂的情况下,使用${}的方式可能会更安全,因为它可以帮助区分变量名和其他文本,避免歧义。
方式一:
export JAVA_HOME=/lyh/java/jdk1.8.0_221 --(自定义jdk安装目录)
export PATH=$JAVA_HOME/bin:$PATH
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JMETER_HOME=/jmeter/jmeter-3.2
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
方式二:使用${}的方式更加规范和安全
export JAVA_HOME=/home/lyh/jre1.8.0_301
export JRE_HOME=${JAVA_HOME}/jre
export PATH=${JAVA_HOME}/bin:$PATH
export CLASSPATH=.:{JAVA_HOME}/lib:${JRE_HOME}/lib
export JMETER_HOME=/jmeter/jmeter-3.2
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
最后一步:启用配置
source /etc/profile
修改jmeter.sh
在大并发的测试中,我们需要的大量的内存来执行压力测试,而JMeter在默认情况下的内存分配非常低,我们需要自己把该项配置的最大堆修改成合适的值
根据负载机的内存来决定该项的值为多少。在前面我们查询了内存为1.6GB,所以我们设置成1GB。一般建议设置为内存的80%。例如一台8GB的负载机,我们可以设置为6GB。
vim jmeter.sh
找到JVM-ARGS,复制该行,去除注释,将512m修改为合适的大小
chmod 777 target_file -- 赋予权限 tar xzvf target_file -- 解压 unzip apache-jmeter-5.4.1.zip --解压 tar -zcf 1.tar.gz /tmp/lyh/* --压缩打包 source /etc/profile -- 使配置文件生效 java -version -- 检查java版本 jmeter --version -- 检查jmeter环境 free -h -- 查看Linux内存 uname -a -- Linux系统架构 yum install -y ibus-libpinyin --安装拼音 rz -be target_file -- 上传文件夹 mkdir -- 创建文件夹 sz --下载命令 zip -r -q 目标名称 被打包目录/文件 --打包压缩 mv test1-njzj\(1\).jmx test1-njzj.jmx --修改名字 mv test1-njzj.jmx /web/jmeter/ --移动目录 chown root:root test1-njzj.jmx --修改权限 chmod a+x test1-njzj.jmx --修改权限
跳板机 创建好了 直接在跳板机中 ssh ip 直接跳转到压力机
登录脚本 跳板机自动登录账号密码
$ ssh 113.xxx.200.90
password: xxxc
压力机使用 rz -be,将本机文件上传到压力机上
rz -be 是一个Linux命令,用于从本地计算机上传文件到远程服务器。
这些命令通常在基于终端的SSH会话中使用,用于文件传输。
scp 文件 user@压力机ip:压力机目录
[参数] 可以是一些选项,比如 -r 表示递归复制整个目录。
[来源文件] 是指要传输的文件或目录。
[目标位置] 是指文件或目录将要保存到的位置。
scp "C:\Users\Administrator\Desktop\1.jmx" user@172.17.8.8:/home/user/lyh/
ftp 命令是用于在计算机网络中进行文件传输的标准网络协议。它允许用户在客户端和服务器之间传输文件。
ftp [选项] [主机名]
一旦连接到 FTP 服务器,你可以在 FTP 命令提示符下输入各种命令来执行文件传输操作。以下是一些常用的 ftp 命令:
这只是 ftp 命令的一些基本用法示例。实际上,ftp 命令提供了更多的选项和功能,如设置传输模式(二进制或文本)、被动模式、重命名文件等。你可以通过在 ftp 命令提示符下输入 help 或 ? 来获取更多帮助信息,了解所有可用的命令和选项。
需要注意的是,由于 ftp 是明文传输协议,不提供数据加密,因此在安全性要求较高的情况下推荐使用更加安全的协议,如 sftp(基于 SSH)或 ftps(基于 SSL/TLS)来进行文件传输。
某支付系统,需要用1000个不同的用户登录,并使用添加不同的测试金额数据访问支付接口?
添加线程组
添加配置元件 - CSV数据文件设置,读取CSV文件数据中的用户名密码
添加HTTP请求 - 登录,引用CSV数据文件设置中的变量
添加HTTP请求 - 支付,使用counter函数传入不同金额的测试数据
添加查看结果树
提示:
参数介绍:
作用:向服务器发送http及https请求
第一个HTTP请求中,URL错误,导致服务器产生了重定向,提供了新的URL路径
JMeter会自动发送第二个HTTP请求(使用第一个HTTP请求中返回的URL路径)
点击最外层HTTP请求时,显示的内容与最后一个HTTP请求的请求和响应数据一致
要修改取样器结果的编码格式
断言:让程序自动判断预期结果和实际结果是否一致。
(1)什么时候可以使用响应断言?
(2)使用“响应断言”的操作步骤?
添加方式:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 断言 --> 响应断言
场景:
请求:https://www.baidu.com
检查:让程序检查响应数据中是否包含“百度一下,你就知道”
操作步骤:
1.添加线程组
2.添加HTTP请求
3.添加响应断言
4.添加断言结果
5.添加查看结果树
失败场景:
注意:Equals和Substring模式是普通字符串,而不是正则表达式
即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理
(1)什么时候可以使用JSON断言?
(2)使用“JSON断言”的操作步骤?
作用:对HTTP请求的JSON格式的响应结果进行断言
添加方式:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 断言 --> JSON断言
场景
检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”
1.添加线程组
2.添加HTTP请求
3.添加JSON断言
4.添加断言结果
5.添加查看结果树
断言失败场景:
JsonPath 是一种用于查询和提取 JSON 数据中特定元素的语法。它类似于 XPath,但适用于 JSON 格式的数据。 以下是 JsonPath 的一些常见语法: 1. `$`:表示根节点。使用 `$` 可以指向整个 JSON 结构。 2. `.`:表示当前节点。可以使用 `.key` 或 `.['key']` 来指向当前节点下的某个属性。 3. `..`:表示递归下降。可以使用 `..key` 来匹配深层嵌套结构中的某个属性。 4. `*`:表示通配符。可以使用 `*` 来匹配任意节点。 5. `[]`:表示筛选器。可以使用 `[expression]` 来筛选符合条件的节点。例如,`[0]` 表示选择数组的第一个元素,`[key='value']` 表示选择具有指定键值对的节点。 6. `[,]`:表示多个筛选器。可以使用逗号分隔多个筛选器,表示并集操作。例如,`[0,1]` 表示选择数组的前两个元素。 7. `[:start:end:step]`:表示切片操作。可以使用冒号分隔起始索引、结束索引和步长来选择数组的子集。例如,`[1:3]` 表示选择数组的第二个和第三个元素。 这些只是 JsonPath 语法的一部分,更多复杂的语法和功能可以根据具体需求进行学习和使用。
(1)什么时候可以使用断言持续时间?
(2)使用“断言持续时间”的操作步骤?
添加方式:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 断言 --> 断言持续时间
操作步骤
1.添加线程组
2.添加HTTP请求
3.添加断言持续时间
4.添加断言结果
5.添加查看结果树
场景
检查:让程序检查响应时间是否大于500毫秒
持续时间(毫秒):在将每个响应标记为失败之前允许的最大毫秒数
关联:
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。 JMeter可以通过“后置处理器”中的一些组件来处理关联。
(1)什么时候可以使用正则表达式提取器?
添加方式:
测试计划 --> 线程组–> HTTP请求 --> (右键添加) 后置处理器 --> 正则表达式提取器
场景
请求:网址1 ,获取token值
请求:网址2,把获取到的token作为请求参数
1.添加线程组
2.添加HTTP请求-网址1
3.添加正则表达式提取器
4.添加HTTP请求-网址2
5.添加查看结果树
- Apply to: 指定正则表达式提取器应用的范围,可以选择“Main sample and sub-samples”(主样本和子样本)或者“Main sample only”(仅主样本)。 - Field to check: 指定在响应的哪个部分应用正则表达式。可以选择“Body”(响应正文)、“Body (unescaped)”(未转义的响应正文)、“URL”(URL)、“Response headers”(响应头部)等。 - 引用名称 Name of created variable: 用于指定提取的内容将被保存到的变量名。 下一个请求要引用的参数名称,如填写title,则可用${title}引用它 - 正则表达式 ():括起来的部分就是要提取的。 .:匹配任何字符串。 +:一次或多次。 ?:不要太贪婪,在找到第一个匹配项后停止。 比如,如果您想要提取 HTML 中的链接内容,可以使用类似<a href="(.*?)">的正则表达式。 - 模板: 用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。 如:$1$表示解析到的第1个值 $1$、$2$ 等来表示对应捕获组的内容 - 匹配数字: 指定当有多个匹配时,提取哪一个。 可以使用 0 表示随机选择一个匹配,也可以指定具体的匹配序号。 0代表随机取值,-1代表全部取值,1代表取第一个值 - 缺省值: 如果参数没有取得到值,那默认给一个值让它取。
案例1:获取匹配返回的第五个数据
方法1:添加正则表达式 —— 获取第5个地址
方法2:
添加正则表达式 —— 获取所有匹配的地址数据
添加Debug Sample
添加HTTP请求 - 百度,引用第5个地址信息,格式:${变量名_索引}
,索引从1开始
添加方式:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 后置处理器 --> XPath提取器
场景
请求:网址1 ,获取title值
请求:网址2,把获取到的title作为请求参数
1.添加线程组
2.添加HTTP请求-网址1
3.添加XPath提取器
案例:
//a : 找出所有的a标签
//a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)
//b[@name='kw']: 在HTML页面中,找出b标签(有一个属性为name,且name的值为kw)
案例2:获取网页中的title标签,
使用://title
4.添加HTTP请求-网址2
5.添加查看结果树
(1)什么时候可以使用JSON提取器?
添加方式:
场景
1.添加线程组
2.添加HTTP请求-天气
3.添加JSON提取器
4.添加HTTP请求
5.添加查看结果树
Names of created variables:存放提取出的值的参数
JSON Path Expressions:JSON路径表达式
(1)什么是参数化?
把测试数据组织起来,用不同的测试数据调用相同的测试方法。
(2)4种参数化方式有何不同?如何选择适当的方式?
添加路径:线程组>配置元件>用户自定义变量
添加用户自定义变量
http请求应用变量名
添加方式:测试计划 --> 线程组–> 前置处理器 --> 用户参数
场景
操作步骤
1.添加线程组
2.添加用户参数
3.添加HTTP请求
4.添加查看结果树
添加方式:测试计划 --> 线程组–> 配置元件 --> CSV 数据文件设置
场景
请求:https://www.baidu.com
要求:循环3次,每次请求时附带参数username,password,code的值不相同
操作步骤
1.定义CSV数据文件
2.添加线程组
3.添加CSV 数据文件设置
参数详解(CSV 数据文件设置)
4.添加HTTP请求
5.添加查看结果树
计数函数,一般做执行次数统计使用;
位置:在菜单中选择–> 工具 --> 函数助手对话框
${__counter(FALSE,)}
查看结果
当有依赖关系的两个请求(一个请求的入参是另一个请求返回的数据),放入到不同的线程组中时,就不能使用提取器保存的变量来传递参数值,而是要使用Jmeter属性来传递。
(1)什么时候需要使用JMeter属性?
函数实现:
1. __setProperty函数:将值保存成jmeter属性
2. __property函数:在其他线程组中使用property函数读取属性
备注:setProperty函数需要通过BeanShell取样器来执行(BeanShell取样器作用:执行函数和java脚本)
读取pro_city
场景
操作步骤
1.添加线程组1
2.添加HTTP请求-天气
3.添加JSON提取器
4.添加BeanShell取样器(将JSON提取器提取的值保存为Jmeter属性)
5.添加HTTP请求(读取Jmeter属性)
6.添加查看结果树
为什么要录制脚本?
应用场景:
在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本
开启windows操作系统的浏览器代理
开启后,windows操作系统中所有的http请求都会发送给设置的代理服务器。
在jmeter当中添加非测试元件HTTP代理服务器,并进行配置
加HTTP代理服务器:测试计划(右键)->非测试元件->HTTP代理服务器
配置代理服务器的参数
参数解析:
State: 1. 设置端口:代理服务程序端口程序 2. 启动按钮 Test Plan Creation: 1. 目标控制器:录制的脚本放到那个容器 2. 分组: 1). 不对样本分组:对所有录制的取样器不分组。 2). 在组间添加分组:在取样器分组之间添加以名为 "---"的控制器。 3). 每个组放入一个新的控制器:每个分组放到一个新的简单控制器下。 4). 只存入每个组的第一个样本:只要每个分组的第一个请求会被录制。 5). Put each group in a new transaction controller: (每个分组创建一个事务控制器,那个分组的所有取样器都保存在控制器下。) Requests Filtering: 包含模式:url匹配正则表达式,包含此项 如:.*localhost.* 排除模式:url匹配正则表达式,不包含此项 如:.*.css .*.jpg .*.jpeg .*.png .*.js
用作请求的参数化
例如:登录时需要的用户名,可以从数据库中查询获取
清理垃圾数据
例如:添加商品(商品名/编号等不能重复),再执行该脚本不能成功,需要在下次执行前删除该商品数据
准备测试数据
例如:通过数据库来准备大量(几十万条)的性能测试数据。
用作结果的断言
例如:添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致
主要参数:
Variable Name: mysql数据库连接池名称(JDBC请求时要引用)
Database URL: jdbc:mysql://localhost:3306/books
jdbc:mysql:(MySQL固定格式)
//127.0.0.1:(数据库ip地址)
3306:(MySQL默认端口,如改变,请如实填写)
books:要连接的数据库名称
JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL驱动包位置固定格式)
Username: root(连接数据库用户名,如实填写)
Password:(MySQL数据库密码,如实填写,如果密码为空不写)
主要参数:
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
Query:填写的sql语句未尾不要加“;”
Parameter values:参数值
Parameter types:参数类型
Variable names:保存sql语句返回结果的变量名
Result variable name:创建一个对象变量,保存所有返回的结果
Query timeout:查询超时时间
Handle result set:定义如何处理由callable statements语句返回的结果
Cannot create PoolableConnectionFactory (Access denied for user ‘root’@‘localhost’ (using password: YES))
解决:用户名密码不正确
使用查询出的数据库变量,发出接口请求
逻辑控制器: 可以按照设定的逻辑控制取样器的执行顺序
If控制器用来控制它下面的测试元素是否运行
添加方式:测试计划 --> 线程组–> (右键添加) 逻辑控制器 --> 如果(If)控制器
需求
操作步骤
添加线程组
用户定义的变量
添加If控制器,判断name是否等于bob,判断name是否等于jack
JS语法形式:
函数形式:
添加HTTP请求,用来访问
添加查看结果树
作用:通过设置循环次数,来实现循环发送请求
位置:测试计划 --> 线程组–> (右键添加) 逻辑控制器 --> 循环控制器
循环10次
思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
控制的作用域不同:线程组控制是线程组下的所有请求,循环控制器控制逻辑控制器下的所有请求;
线程组属性控制组内所有取样器的执行次数,而循环控制器可以控制组内部分取样器的循环次数,后者控制精度更高
如果线程组循环次数为M,循环控制器循环次数为N:
循环控制器下的HTTP请求运行:M*N次
线程组下的其他HTTP请求运行:M次
作用:
一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。
位置:测试计划 --> 线程组–> (右键添加) 逻辑控制器 --> ForEach控制器
需求
操作步骤
添加线程组
用户定义的变量
添加ForEach控制器
添加HTTP请求
添加查看结果树
案例:
为什么要使用同步定时器?
(1)什么时候需要使用同步定时器?
同步定时器:
阻塞线程(累积一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。
提示:在JMeter中叫做同步定时器,在Loadrunner中又叫集合点
SyncTimer的目的是阻塞线程,直到阻塞了n个线程,然后立即释放它们。
同步定时器相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,所以可以用来做大数据量的并发请求
位置:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
参数介绍:
案例:
模拟1000个用户同时访问百度首页,统计高并发情况下运行情况
操作步骤
添加线程组,设置线程数=1000
ramp-up时间应该设置多少?需要确保 1000 个用户在设定的时间点(比如电商秒杀活动开始时)同时发起请求。因此,你可以将 Ramp-Up 时间设置为 0,这样所有的用户线程将会立即启动。
由于我们希望所有的用户都在同一时刻发出请求,所以不需要考虑逐渐增加用户的启动时间。将 Ramp-Up 时间设置为 0 将使得所有的用户线程立即启动,并且在同步定时器的作用下,在指定的时间点同时发起请求。
添加HTTP请求
添加同步定时器,并发数线程数为 1000,表示等待所有 1000 个线程都到达同步点
添加查看结果树
添加监听器-聚合报告
介绍:
为什么要使用常数吞吐量定时器?
(1)什么时候需要使用常数吞吐量定时器?
添加方式:测试计划 --> 线程组–> HTTP请求 --> (右键添加) 定时器 --> Constant Throughput Timer
场景
一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
添加线程组,循环次数设置成永远
添加HTTP请求
添加常数吞吐定时器
设置目标吞吐量:每个用户每分钟发送的请求数
计算方法:目标吞吐量= 要求QPS * 60 / 线程数
(1)一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
(2)2个用户针对 (服务器的QPS要求:20QPS (20 次/s)) 的频率访问百度首页,持续一段时间,统计运行情况
添加查看结果树
添加监听器-聚合报告
案例:
(1)系统登录错误3次后,锁定1分钟,等待1分钟后重新输入正确的用户名密码登录成功
JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。
server_port
,比如:server_port=2001
server.rmi.ssl.disable=true
remote_hosts
remote_hosts=192.168.182.100:1099,192.168.182.101:1099
,
连接,
隔开server.rmi.ssl.disable=true
1、请求:https://www.baidu.com
2、一台控制机和两台执行机,做分布式;要求控制机启动,两台执行机执行,反馈结果操作步骤:
(1)什么时候需要使用分布式?
(2)JMeter分布式测试的原理?
(3)JMeter分布式的配置和使用?
为什么需要测试报告?
位置: 测试计划->右键->监听器->聚合报告
JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息。
命令
参数描述:
-n:非GUI模式执行JMeter
-t [jmx file]:测试计划保存的路径及.jmx文件名,路径可以是相对路径也可以是绝对路径
-l [result file]:保存生成测试结果的文件,jtl文件格式
-e:测试结束后,生成测试报告
-o [html report folder]:存放生成测试报告的路径,路径可以是相对路径也可以是绝对路径
注意:result.jtl和report会自动生成,如果在执行命令时result.jtl和report已存在,必须用先删除,否则在运行命令时就会报错
查看测试报告
打开index.html
它包括Over Time(时间变化) 、Throughput(吞吐量) 、Response Times(响应时间)
为什么需要计算性能测试TPS?
案例:
根据数据统计,在2019年第32周,日均PV为4.13万,需要计算TPS
计算公式:
数据分析:
1 * 24 小时
= 24 * 3600 秒
套入公式:
结论:
二八原则就是指80%的请求业务在20%的时间内完成
并发TPS = 有效请求数 * 80% / 有效时间 * 20%
当运营数据统计越精确时,计算出的并发TPS与实际的越接近
数据分析:
根据这些数据统计图,可以得出结论:
结合二八原则计算公式 : TPS = 总请求数 * 80% / (总时间*20%) :
并发TPS = 峰值请求数 / 峰值时间 * 系数
专门用于满足极端的用户业务场景下的性能需求
满足峰值请求时间段内的负载量,系数取决于项目组对于未来业务量的评估,相当于冗余量
比如订单最高峰在在21点-22点之间,一小时的订单总数大约为8853个
计算压力测试的并发数:TPS = 峰值请求数/峰值时间 * 系数
需要在测试环境模拟用户峰值业务操作(压力测试)的并发量为:
TPS = 8853 请求数 / 3600秒 * 3(系数) = 7.38 请求数/秒
某购物商城,经过运营统计,正常一天成交额为100亿,客单价平均为300元,交易时间主要为10:00-14:00,17:00-24:00,其中19:00—20:00的成交量最大,大约成交20亿。
现升级系统,需要进行性能测试,保证软件在上线后能稳定运行。
请计算出系统稳定性测试时的并发(负载)量,及保证系统峰值业务时的并发(负载)量
稳定性并发量:
并发TPS = 有效请求数 * 80% / 有效时间 * 20%
并发TPS = (100E/300 * 80%) / (3600 * 11 * 20%)
压力并发量:
并发TPS = 峰值请求数 / 峰值时间 * 系数
压力TPS = (20E/300) / (3600 * 1) * 系数
说明:先下载JMeter插件管理工具包,再用此包下载JMeter插件
安装如下指定的插件
说明:阶梯线程组
作用:
添加方式:测试计划 --> 线程(用户)–> Concurrency Thread Group
参数:
重点:
Target Concurrency:目标并发(线程数)
Ramp Up Time:加速时间
Ramp-Up Steps Count:加速步骤计数
Hold Target Rate Time:运行时间
Time Unit:时间单位(分钟或者秒)
了解:
Thread Iterations Limit:线程迭代次数限制(循环次数)
Log Threads Status into File:将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件)
每秒完成事务数:作用是统计各个事务每秒钟成功的事务个数
添加方式:测试计划 --> 线程组–> 监听器–>Transactions per Second
每秒字节吞吐量:作用是查看服务器吞吐流量(单位/字节)
添加方式:测试计划 --> 线程组–> 监听器–>Bytes Throughput Over Time
JMeter 中的 Concurrency Thread Group 和 Stepping Thread Group 是两种不同的线程组,它们在功能和使用方式上有所区别。
Concurrency Thread Group(并发线程组):
Stepping Thread Group(步进线程组):
总结:
选择使用哪种线程组取决于你需要模拟的测试场景和需求。如果你需要灵活地控制并发用户数量,并且用户数量可能会动态变化,则可以选择 Concurrency Thread Group。如果你需要逐步增加或减少负载,并观察系统在不同负载下的性能表现,则可以选择 Stepping Thread Group。
作用:
用来监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据添加
方法:
线程组->监听器->jp@gc - PerfMon Metrics Collector
注意:
使用之前需要在服务器端安装监听服务程序并启动
(1)解压缩: unzip ServerAgent2.2.3.zip
(2)进入ServerAgent目录,赋权限:
cd ServerAgent-2.2.3
chmod -R 777 *
(3)启动ServerAgent程序
./startAgent.sh
启动监控后:
jtl结果写入查看
ServerAgent 是一款用于性能测试的工具,它通常使用默认的端口 4444 进行通信。如果您没有修改默认配置,则 ServerAgent 将会在 4444 端口上运行,并等待来自 JMeter 的连接。
如果您已经启动了 ServerAgent 并希望验证它是否正在侦听 4444 端口,请使用以下命令:
netstat -tlnp | grep 4444
该命令将显示所有正在侦听 4444 端口的进程。如果 ServerAgent 正在运行并已正确配置,则应该看到类似于以下内容的输出:
tcp 0 0 0.0.0.0:4444 0.0.0.0:* LISTEN 12345/java
其中,12345
是 ServerAgent 进程的 PID。
在实际的性能测试中,会遇到各种各样的问题,比如TPS压不上去,导致这种现象的原因很多,作为测试人员应配合开发人员进行分析尽快找出瓶颈的所在。
常见性能瓶颈分析:
每个程序运行都需要占用CPU,那么单CPU的机器是如何同时运行多个程序的?
时间片即CPU分配给各个程序的时间,每个程序被分配一个时间段,称作它的时间片,即该程序允许运行的时间
CPU时间:单位HZ,
CPU使用率:表示一段时间内,正在使用的CPU时间段 / 总的CPU时间段 * 100%
CPU使用率分为用户态、系统态和空闲态
查看CPU使用率的命令:top
测试关注点:
查看总量:top
查看虚拟内存的使用量:vmstat
Swap:
测试关注点:
磁盘IO瓶颈:影响性能的是磁盘的读写速度(Input和Output速率),不是磁盘大小。
查看磁盘IO使用的命令:iostat -x 1 1
测试关注点:
网络瓶颈:影响性能的是网络的传输速度,与网络的总带宽进行对比,接近总带宽,说明网络存在瓶颈。
查看网络使用的命令:sar -n DEV 1 2
测试关注点:
补充介绍:
show variables like ""
set global 参数名 = 值
show variables like 'slow_query_log'
: 慢查询日志开启状态[ON:开启,OFF:关闭]show variables like 'slow_query_log_file'
: 慢查询日志存放位置show variables like 'long_query_time'
: 慢查询时长设置(超过该时长才会被记录,单位:秒)mysql> set global slow_query_log='ON'
; #开启慢查询日志mysql> set global slow_query_log_file='/data/slow_query.log'
; #设置慢查询日志存放位置mysql> set global long_query_time=1
; # 设置慢查询时间标准,设置之后会在下次会话才生效数据库连接池:
事先建立好连接,当程序请求sql执行时,直接分配空闲连接,使用完成后释放连接。节省了SQL语句执行前后连接的建立和关闭的时间。
数据库连接池定义:
数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
作用:
可以提高对数据库操作的性能
当客户请求数据库连接时
测试关注点:
查看 MYSQL 最大连接数:
查询当前数据库已建立连接数:
MySQL主要有两种锁:表级、行级。
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。
测试关注点(初步确定死锁):
show open tables where in_use>=1 查询当前是否锁表
show processlist:查看执行时间最长的线程,找到对应sql,找到表
JVM内存:Java 虚拟机在执行 Java 程序的过程中所管理的不同的内存数据区域。可简单分为:堆内存和非堆内存
JVM堆内存的管理机制(JAVA垃圾回收机制):
常见的内存问题:
测试关注点:
堆内存使用量持续增长 —— 可能是内存泄漏
Full GC比较慢,执行时会停止程序一些事务的处理。
因此Full GC频率不能过高(低于10分钟)
如果Full GC之后,堆中仍然无法存储对象,就会出现内存溢出 —— 程序出现crash(崩溃)
在JAVA程序启动时,添加启动参数
进入本地jdk安装目录bin目录,找到jvisualvm.exe并启动
右键“远程”选择“添加远程主机”,并输入主机IP
右键主机选择“添加JMX连接”,并输入JMX端口
连接成功后在主机下会有对应的连接显示,双击查看监控信息
压测机影响性能测试结果的原因主要是:
解决方案:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。