Jmeter测试 -- 进阶
后置处理器
-
json提取器
-
如果你的响应体为json格式,那么优先选用json提取器
-
如果想要提前请求中内容、响应的头部内容、或者响应体格式非json格式,这些使用 优先选择 正则提取器
-
json提取式
- $.节点名称.二级节点名称 ----- 绝对路径
- $…末梢节点名称 -------相对路径(推荐)
- 一个json提取器写多个json提取式
- 用 英文分号 ;
- 此时,一定要写 默认值(default value)
-
-
正则提取器
- 写正则式: 左边界(正则式)右边界
- 万能正则式: .*? ====除换行符不能匹配,其他都能匹配
- . 匹配除换行符以外的所有字符
- * 匹配0次或多次——贪婪
- + 匹配1次或多次——懒惰
- ? 匹配0次或1次
- \d [0-9] 匹配数字
- \w [a-zA-Z0-9_] 字母和数字
- 正则表达式中 []{}
- 正则可以用于日常日志、文本中查找 perl
- 一个正则提取器,写多个正则提取式:
- 分隔符用 (.*?)
- 写正则式: 左边界(正则式)右边界
-
关联:
- 前面接口的动态数据信息,提取出来,作为后面接口的传入参数
- 当接口,使用cookie来管理信息时,请使用cookie管理器,而且,第一次使用时,不要去修改任何cookie管理器信息。
- 只要使用到登录接口,以及登录之后才能使用的接口,就添加cookie管理器。不管你的项目是否使用cookie。
- 使用默认的cookie管理器,先不要去配置如何信息。
-
DDT数据驱动性能测试 (一)
- 性能测试,因为要使用多用户并发,请求的时间也要几分钟到几十分钟,所以总请求量,可能会很大。
- 准备测试数据
- 测试数据文件
- 准备测试数据
- 最典型的应用: 使用一批测试账号登录
- 把一批测试账号,放在一个纯文本文件中管理。
- 文本文件:txt,csv,json,xml,yml,dat(lr中管理数据文件)
- 把一批测试账号,放在一个纯文本文件中管理。
- 性能测试,因为要使用多用户并发,请求的时间也要几分钟到几十分钟,所以总请求量,可能会很大。
-
csv数据文件设置:
- 支持的文件: 文本文件, 不局限于 txt\csv
- 配置元件
- 注意事项:
- 1、文件名称:可以是txt、csv等文本文件,都可以,但是,我们推荐使用txt,能不用csv,就不用csv。
- 获取速度 txt相对要快
- 编码:txt文件,默认编码,utf8; csv文件,默认编码,不是utf8
- 因为csv文件,默认不是utf8格式,使用,在文件中包含中文时,使用其中的数据,会出现中文乱码。
- 如果工作中,看到jmeter读取csv文件内容,乱码。
- 原因:csv的编码不是utf8,而csv数据文件设置中,选择了utf8,导致编码不一致。
- 解决:把csv文件,用记事本打开,选择编码为utf8保存
- 默认使用的是绝对路径,当路径出错时,会导致整个线程组,都不执行。
- 解决?
- 相对路径:
- 相对点: 默认是jmeter的bin文件夹,也可以是jmeter脚本的保存路径。
- 写法:(推荐)./ 开头 根上相对路径 -----这种写法可以支持跨平台
- 相对路径:
- 解决?
- 用csv来准备数据,能用csv数据文件设置时,坚决不用 ${__CSVRead(,)}函数。
- 1、文件名称:可以是txt、csv等文本文件,都可以,但是,我们推荐使用txt,能不用csv,就不用csv。
csv数据文件设置 DDT数据驱动性能测试(一)
-
基本脚本如何写
-
1、文件名:
- 绝对路径
- 相对路径 ====推荐 ./ 开头 相对地址默认 jmeter的bin
- 也可以以脚本保存的路径作为 相对起始点
- 建议,大家把 jmx 与 数据文件 放在同一个路径下
- 如果csv文件路径出错, 导致 单前整个线程组,不会运行
- 文件,尽可能使用txt格式,能不用csv的,就不用
- 使用csv文件,要特别注意:编码
-
2、变量名称: 可以写多个,多个之间用“,” 固定使用逗号
-
3、是否允许带引号: 一对英文双引号
-
4、 遇到文件结束符再次循环
- true: 运行次数超过总数量行数时,会从头开始取值
- False:运行次数超过总数量行数时,还会继续运行,但是取不到值
- 管理取值的情况
-
5、 遇到文件结束符停止线程
- 管理运行状态
-
使用csv数据文件设置,默认配置的情况下,
- 当多用并发时,、
- 第1th,第一次取值,取第1行,
- 第2th,第一次取值,取第2行
- 第3th,第一次取值,取第3行
- 当多用并发时,、
DDT数据驱动性能测试(二)
DDT数据驱动性能测试(三)
kyj 易捷支付项目
性能测试脚本中,会使用逻辑控制器,但是,使用了逻辑控制器,并不是混合场景。
混合场景,是 不同数量的并发用户,发起不同接口请求。
- 逻辑控制器
- 循环控制器
- 常用在 重复运行多次
- foreach控制器
- 常用于,使用 带有 _ 下滑线变量引用
- python
- for x in [] 给你一个西瓜,西瓜已经被切分为多股
- foreach控制
- for x in range() 给你一个西瓜,但是,不切成
- 循环控制
- 循环控制器
var_1 var_2 var_3 var_4
${f}
-
if 条件控制:
- 默认的情况下, 条件框中,要使用 __jexl3 or __groovy 函数的计算结果为true False
- ----- 直接告诉你结果为真或假
- 如果不勾选 Interpret condition as variable express 是把 条件框中的 表达式 当做js脚本,进行计算,计算的结果为真,则执行下面请求
- ----是要你自己去算,算出来是真或假
- 默认的情况下, 条件框中,要使用 __jexl3 or __groovy 函数的计算结果为true False
-
事务控制器
逻辑控制 ------ jmeter脚本性能转换
- 用jmeter写脚本,可以去做接口测试、自动化测试、性能测试
- 但是,接口测试、自动化测试脚本,不能直接用于性能测试,需要进行性能转换,才能用于性能测试
- 性能测试脚本,可以直接用于接口测试、自动化测试。
- 性能测试,要尽可能的降低jmeter工具自身对资源消耗
- 接口测试、自动化测试脚本,一定会添加断言,断言的目的是判断,是否有bug,断言这个元件在执行时,资源消耗,来自jmeter工具的资源,这个时间和资源的消耗,都是本机的,不是服务器消耗的时间和资源。-----我个人观点里面,是不要加断言。
- Beanshell元件,写脚本时,只考虑功能能实现即可,不会过多去考虑,元件使用的时间、资源消耗。
- 性能测试中, Beanshell所有元件,能不用则不用,如果,一定要写java代码来处理的 JSR223、 _ _ j e x l 3 ( , ) 、 {\_\_jexl3(,)}、 __jexl3(,)、{__groovy(,)}
- 元件的选择:
- JSR223
- DDT
- 运行模式: GUI 图形界面模式,===只用于编辑调试脚本
- 真正性能测试用 CLI模式 —无图形界面模式
- 性能测试,要尽可能的降低jmeter工具自身对资源消耗
循环控制
foreach控制
if条件控制
-
默认勾选: Interpret condition as variable
- 条件框中的,结果为true、false要使用jexl3 和 groovy
-
不勾选:Interpret condition as variable
- 条件框中, 运算过程(表达式)的结果为true、false
-
事务控制器:
- 在jmeter中,默认一个取样器,就是一个事务
- 事务控制器,控制其子集取样器(n),合并为一个事务
- 事务: TPS 服务器每秒处理的事务数
- 在事务控制器下,挂载多个取样器,想要把多个取样器合并为1个事务,必须勾选“Generate parent sample”
- 性能测试中,是否要勾选“Generate parent sample”?
- 性能测试,要先做单接口的性能测试,然后再做多接口的性能测试。
- 在做多接口合并的时候,需要勾选。
- 在性能测试中, 需要先用单个取样器,做出某个接口的性能测试指标,然后再出多个接口的性能指标, 然后再使用事务控制器,勾选Generate parent sample,做出业务的性能指标, 把所有 业务都出来,再合并,做出整个系统的性能指标
- 如果领导要你做某个业务的性能指标,哪你,需要先梳理出,这个业务所有的接口,然后对这个业务所有的接口进行性能测试,得到性能指标,然后,再使用事务控制器,合并取样器,最终才得到 业务的性能指标。
- 真正做性能测试时,所有的监听器,都要禁用
聚合报告 、汇总报告
- 在性能测试中,看聚合报告,有前提条件:
- 1、没有网络瓶颈
- 因为,在很多时候,我们在看聚合报告时,会把 吞吐量的值 等价为 TPS的值
- 怎么判断有没有网络瓶颈?
- 聚合报告最后两列,是 吞吐率 吞吐率 与我们的带宽是有关系, 吞吐率,是可以看出是否存在网络带宽问题?
- 20Mb 100Mb
- 1Mb = 1 x 1024kb = 1024kb/8 = 128KB/s
- 企业服务器,一般电商类的产品,也就几m带宽
- 2、并发用户数不变
- 负载测试时,并发用户数会随着时间变化,而变化,就不能看聚合报告。
- 1、没有网络瓶颈
- 每一行:都是一种事务
- 每一列:
- 样本: 在过程的过程中,所有的并发用户数,在一段时间中的总请求量
- 单独看样本,是无法知道并发用户数、 执行时长
- 10r x 60s x pl = 472 pl=0.78 tps
- 平均值…最大值: 响应时间 单位是 毫秒ms
- 90%: 所有的样本中,有90%的样本时间是小于等于这个时间的
- 样本: 在过程的过程中,所有的并发用户数,在一段时间中的总请求量
事务控制 + 聚合报告
-
jmeter中,默认一个取样器,发起一次请求就一个事务
-
多个取样器要合并为一个事务,添加事务控制器
-
聚合报告:
- 1、没有网络瓶颈 吞吐量 tps
- 2、并发用户数不变 聚合报告中的数据,是一个平均数
- 每一行,代表一种事务
-
Critical Section Controller 临界控制器 ----比较特殊,用的少
- 严格控制请求顺序
- 锁名称: 默认是一个固定锁名称
- 相当于把性能测试中的并行执行,强制转换为 串行
- 如何让锁变成动态锁,生成多把锁?
- 锁名称变成一个动态名称
- global_lock_${__threadNum}
-
Once Only Controller 仅一次控制器
- 仅一次控制器: 意思是,一个线程用户只执行一次
- 理解?
- 并发用户是10,不管你设置循环多少次,其下挂载的取样器,每个都只会执行10次
- 并发用户是10,不管你运行多长时间,其下挂载的取样器,每个都只会执行10次
- 理解?
- 仅一次控制器: 意思是,一个线程用户只执行一次
吞吐量控制器
-
总的吞吐量
-
控制百分比, 使用多个吞吐量控制器,使他们的之和100
-
不推荐大家用吞吐量控制器
- 总请求量 = 并发用户数 * 时间 * 频率
-
随机控制器:
- 随机挑选其下挂载的取样器中1个执行
-
随机顺序控制器:
- 其下的所有取样器都会被打乱顺序执行
性能测试脚本开发
-
1、写测试脚本
-
2、可能需要添加 逻辑控制器(事务控制器)
- 如果只有一个取样器,就不需要添加事务控制
- 事务控制器,多个取样器合并时,才用
-
3、性能场景设计
- 普通
- 负载
- 压力
- 混合
- 面向目标
- 波浪…
-
其他协议脚本开发
- http协议
- soap、jdbc、websocket、mq、dubbo
-
现在的项目,一般,不会局限于一种协议
soap = http + xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getSupportCityDataset xmlns="http://WebXml.com.cn/">
<theRegionCode>31123</theRegionCode>
</getSupportCityDataset>
</soap:Body>
</soap:Envelope>
{"theRegionCode":"31123"}
soap 协议接口
混合场景: 不同并发用户数,使用不同接口发起请求
A: 30 -----吞吐量控制
B: 20
C: 10
-
jdbc: java调用数据库的语言
- 调用数据库时,需要使用jar + 数据库信息
- jmeter是用java开发,可以直接执行java代码
-
找jar包?
- kyj项目,数据库的版本,mysql5.7
- 服务maven的仓库,搜索 数据库
- 找到你需要的版本,点击版本
- Files jar 下载这个jar包
- 此时,就下载到你本地了
- 把下载的jar包,放到jmeter的lib文件夹中
- 重启jmeter,此时,jmeter就可以写jdbc请求了
- 有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有这个jdbc取样器,但是,不能发起请求。
- 第三方‘库’
-
注意:
- mysql版本8 与 mysql版本5.7 jar有差异吗?
- 现在企业中,用的mysql数据库,一般都是 mysql5 和mysql8 5的版本,一般都是5.7.x
- mysql5的版本,jar包,可以选择大于等于你数据库版本的任意jar包。
- mysql8版本,那么你选择的jar包,要大于等于你版本号,一般情况,选择版本号相同的
- mysql8与mysql5的驱动class不一样
- mysql版本8 与 mysql版本5.7 jar有差异吗?
写脚本
-
添加 配置元件 > JDBC Connection Configuration
- 填写数据库的:ip、port、dbname、user、password、pool、字符集 、驱动类…
- variable name for created pool: 自定义一个线程池变量名
- 规则: 字母、数字、下划线
- database Connection Configuration
- database URL: 填写数据库的ip、端口、dbname, 但是,不同的数据库URL地址写法不一样
- mysql: jdbc:mysql://serverip:port/dbname
- MYSQL数据库默认端口:3306, 我们kyj项目用数据库端口是:3337
- jdbc driver class: 不同的数据库,这个驱动class不一样
- mysql: com.mysql.jdbc.Driver 只适用于mysql5版本,是选择
- mysql8是手写:com.mysql.cj.jdbc.Driver
- mysql: com.mysql.jdbc.Driver 只适用于mysql5版本,是选择
- username
- password
- database URL: 填写数据库的ip、端口、dbname, 但是,不同的数据库URL地址写法不一样
-
jdbc request:
- 连接池: 一定要与JDBC Connection Configuration中配置的连接池名称要一致
- sql query:
-
sql分页: page*2 page*3
- limit 1,10 limit 11,10 limit 21,10
- limit ${}, 10
- offset 1 limit 5
先写脚本,再讲注意事项
1、 连接池,一定要写,一定要与 JDBC Connection Configuration 配置一致
2、jmeter中,写sql可以不写封号, 不要想着在一个sql query中写多个sql,要写多个sql就用多个jdbc request。 默认也是不支持一个sql query中写多个sql
3、sql语句,CRUD
query type: select statement 、 update statement、 prepared select statement 、 prepared update statement
带有 prepared开头,是脚本中,可以带有参数
- sql中带参数的写法: 两种
- 直接在sql中,进行变量引用 ${var} 但是不推荐
- 用 ? 变量占位符 ====推荐
variable:变量名
variable names:
result variable name
sqlite:关系型数据库, 内存关系数据库,不需要安装、也可以没有账号密码,它的存储文件file .db
jmeter运行过程中,动态数据,写入sqlite数据库, 生成测试数据库 csv、txt
回顾
-
数据库jdbc
-
jar 丢在jmeter的lib文件夹中
-
jdbc conection configuration: 连接池、URL、driverclass、 user、password
- 不同的数据库 url 写法不一样: mysql jdbc:mysql://serverip:port/dbname
- driver class 不同的数据库,也是不一样 mysql com.mysql.jdbc.Driver mysql8 com.mysql.cj.jdbc.Driver
-
DDT数据驱动性能测试 jmeter + sqlite
-
DDT数据驱动性能测试, csv\txt
-
csv\txt文件中的数据,怎么来的?
- 手工造
- 数据库导出
- 是否可以用jmeter把数据库中的数据导出来
- 性能测试环境的数据库中,已经有一批账号,我想把用户表中的账号导出
-
使用jmeter导出数据库中的数据
- jdbc request 查询数据
SELECT id,mobile,gqid, token FROM cb_account where `password` = 'e10adc3949ba59abbe56e057f20f883e' AND LENGTH(mobile)=11 LIMIT 100 OFFSET 1000
- 把数据保存到本地 txt
- 保存响应到文件
- 填写文件名称前缀
- 勾选: Don’t add number to prefix
- 勾选: Don’t add content type suffix
- 运行脚本, 保存文件,在jmeter的bin文件夹下
- 保存响应到文件
- 现在遇到一个问题,就是反复执行,都是覆盖原来的文件,永远都只得到1份数据,没有把多次请求的数据合并,想要得到多次数据的合并的结果,还需要手工
-
-
建一个表
- 想到去用sqlite数据库
- 内存关系型数据库
- 不需要自己去安装,
- sqlite的jar包,放到jmeter的lib文件夹,重启jmeter
- Connection Configuration:
- pool:
- url: jdbc:sqlite:自定义一个dbfile文件名.db
- class: org.sqlite.JDBC
- user\password: 不需要填写
- jdbc request 创建表
- 想到去用sqlite数据库
create table if not exists 'vip11_user'(
id TEXT,
mobile TEXT,
gqid TEXT,
token TEXT
)
脚本执行之后,发现,在jmeter的bin文件夹下面有一个db文件
我从项目的mysql数据库中,获取数据,保存了几份数据?
1份是在sqlite数据库中, =====DDT数据?
1份txt文件中 =====你可以去做最传统的csv数据文件设置的原始数据文件
问题1:数据库中的这份数据,是否可以用于性能测试?
如果sqlite数据库中的这份数据可以用于性能测试, 与 csv 这份数据,有没有优劣?
设置属性,我需要设置n多个属性,这n多个属性是否占用资源,与csv比较有什么有优劣?
如果设置2w个,是不是就要2w个属性?====是的,是的要占用资源
vs csv: 打开文件,整个文件大小占用资源 =====这占用的资源,数据 + 管理数据需要的资源 > 属性资源
读写csv文件,是不是 要大量的磁盘IO(换入换出操作)
问题2: 保存响应到文件,可以直接保存为csv文件吗?
默认情况,保存文件,用\t进行列分隔,所以,保存文件,txt,xlsx, 不能为csv,因为csv是用逗号分隔
哪如果我一定要用csv文件怎么办? 取舍,放弃txt,xlsx 怎么做? jmeter.properties
jmeter.save.saveservice.default_delimiter = ,
问题3: 现在的数据来源是项目的数据库中来的,有没有其他方式生产账号?
我做性能测试,可以不准备测试数据,或者是使用无限量的数据可以吗?
先调用注册接口,同时,写一份到本地sqlite数据库中。
sqlite数据库,不支持多线程
我注册一批账号,这批账号,在被测项目的数据库中,存在,那么就可以用于后续的登录相关的测试,这批账号,又在我本地,sqlite中保存了一份,以后我要用,我直接从本地数据库中取出来就可以用
kyj.ova dubbo.ova kong.ova
- 数据库管理DBMS:
- 关系型数据库: msyql、sqlite 、Oracle、postgrasql、db2、sqlserver、access…
- 安装这些操作系统: windows、linux、mac都可以
- 非关系型数据库: redis 、mongodb、memcache…
- 时序数据库: influxdb、 prometheus
- 关系型数据库: msyql、sqlite 、Oracle、postgrasql、db2、sqlserver、access…
websocket 、mq、dubbo三个协议
- 启动websocket项目
- 云盘中下载 virt-dubbo.ova 项目机
- vmware 打开这个项目机器
- ./stwebsocketserver.sh 启动项目
- python3编写的
- 端口8189
- 协议 ws
websocket
-
基于TCP的网络
-
全双工协议:可以客户端 <----> 服务器
- 服务器主动向客户端发送消息:
- 微信有网络时,马上就有消息推送
- app,有网络是,主动推送下来的消息(不是端口)
- 最典型的一个应用:app,心跳机制(保活)
- http: 自能,客户端向服务器发起请求,服务器收到请求后,进行处理, 原路返回
- web测试,登录一段时间未操作,再来操作,登录超时
- 服务器主动向客户端发送消息:
-
websocket:
- ws
- wss: ws + ssl 证书 进行数据加密传输
-
http协议簇 :
- http
- https: http + ssl 进行数据加密传输
-
http协议的数据,是不是可以通过抓包工具,抓包,websocket,也可以通过抓包工具
-
jmeter如何来测试websocket协议?
- jmeter中要引入插件, jmeter本身的取样器中,不支持websocket协议
- 插件管理.jar jmeter-plugins-manager-1.6.jar
- jar包 jmeter的lib\ext文件夹中, 这个文件夹下放第三方开发的jar
- 再启动jmeter
- jmeter的菜单 > 选项 > plugin manager的入口(没有放plugin的jar包时,没有这个入口)
- 点击入口,出现插件管理弹窗
- Installed plugins 已安装
- Available plugins 可用的,但是需要你手动去安装
- 搜索: websocket
- 勾选 WebSocket Samplers by Peter Doornbosch
- 点击 右下角 apply changes and restart jmeter
- upgrades 可以升级
写脚本
-
取样器
- websocket close 关闭websocket
- websocket open connection 建立一个websocket
- websocket ping/pong 测试websocket协议
- websocket single read sampler 客户端从服务器端口获取
- websocket single write sampler 客户端向服务端发请求(不会获取响应)
- websocket request-response sampler 同时具备向服务端发请求 和 获取响应功能
-
WebSocket Single Write Sampler
- connect:
- user exist connection 使用已经建立连接
- setup new connection 新建一个连接
- Data:
- 数据: text 文本 binary 二进制
- request data
- connect:
-
监听:
- 绿色,只是代表网络成功, response code 并不一定等于200
- 它的响应码: 1xx、2xx、3xx
- 红色,失败,
- 绿色,只是代表网络成功, response code 并不一定等于200
-
websocket项目
- python3编写
- 服务: websocketd
-
websocket vs socket 是一个东西吗?
- 不是一个东西
- websocket 一个通信协议
- socket 代码层面之间调用
MQ: 消息队列的总称
- kfaka
- rabaitmq
- MQTT
- 队列: FIFO fist in fist out 顺序队列,循环队列
- 发布与订阅
1、sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、sudo yum-config-manager --add-repo https://repos.emqx.io/emqx-ce/redhat/centos/7/emqx-ce.repo
3、curl https://repos.emqx.io/install_emqx.sh | bash
systemctl start emqx
MQTT
-
支持 http协议
-
支持websocket协议
-
支持mq协议
-
jmeter下载mqtt的协议插件
- MQTT Protocol Support 如果下载失败,左边有红色, 再次点击 apply changes and restat jmeter
dubbo: 微信服务器框架协议, 不对外暴露接口
远程rpc服务调用, server服务 + 注册中心+ 消费者
把server部署到 3台机器 ====3server (10个方法[adduser]) ------注册到注册中心 zookeeper(3台机器ip/port,10个方法地址)
管理者 monitor
消费者(可以是的代码,一般情况下是开发人员写的代码)
-
接口 vs 方法:
- 根据不同的协议,向外暴露,供外部调用
- 方法,不需要特定协议,一般不对外暴露, 代码之间的 方法直接调用
-
我们这个项目的zookeeper的端口: 20181
- zookeeper的默认端口: 2181
-
jmeter测试dubbo
- jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar 丢到jmeter的lib\ext
- dubbo取样器中,register seting
- 选择zookeeper
- 机器ip:20181
- Interface setting 点击 get provider list
性能测试工具
-
性能测试工具: 企业中主流性能测试工具: jmeter
- jmeter: java开发的开源,线程、学习很低,接口、自动化、性能测试、第三方性能测试从jmeter扩展
- loadrunner: 商业 loadrunner(录播), 要付费购买并发用户数,脚本是c语言,性能比较好,性能指标值比较准确,性能测试的标杆
- wrk: 快速响应性能测试工具,但是,不能做很复杂事情
- ab: 快速响应性能测试工具,但是,不能做很复杂事情
- ngrinder: 做性能侧开平台、性能工程的平台(groovy、jython)
- python + locust: python语言进行性能测试
-
wrk:
# 全空系统,初始化安装的一些软件
yum install git vim gcc wget unzip -y
# 使用git下载wrk的源码
git clone https://gitee.com/mirrors/wrk.git
# 安装make 防止系统没有make这个命令
yum install make -y
cd wrk
make
# 验证 wrk是否安装成功
./wrk -v
[root@centos7 wrk]# ./wrk -t4 -c100 -d60s --latency https://www.baidu.com/
Running 1m test @ https://www.baidu.com/
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 330.39ms 165.67ms 1.87s 85.44%
Req/Sec 77.72 34.75 200.00 66.05%
Latency Distribution
50% 270.19ms
75% 353.73ms
90% 562.05ms
99% 944.58ms
18472 requests in 1.00m, 276.92MB read
Socket errors: connect 0, read 4, write 0, timeout 5
Requests/sec: 307.47
Transfer/sec: 4.61MB
- ab ApacheBench
- php语言项目,apache中自动了这个工具
- centos、Ubuntu中安装的工具名不一样
# centos
[root@centos7 wrk]# yum install httpd-tools -y
# ubuntu
apt-get -y install apache2-utils
-
ngrinder
- ngrinder-controller 管理(管理界面、管理配置)
- 测试脚本: 自动生成、 + 手动修改(groovy 、jython)
- groovy: java的衍生语言(有python基础的同学,去学习)
- jython: java+ python ===python的脚本丢jvm虚拟机中运行
- ngrinder-agent 代理, 压力机
- 目标机器====被测项目
- ngrinder-controller 管理(管理界面、管理配置)
-
ngrinder 性能测试开平台的优先选择
-
ngrinder 部署
-
依赖java运行环境, jre、jdk
-
ngrinder的版本,选择使用3.x版本,不要使用低于3的版本
-
ngrinder 3.x版本,jdk必须是1.8及以上,不能低于1.8
-
下载的包是war包
-
首先想到 tomcat
- 速度比较慢, 大概要2分钟左右,才能启动正常
-
ngrinder-controller使用微服务框架spring-boot开发,
java -jar ngrinder-controller-3.5.2.war
----推荐 -
默认端口: 8080
-
http://ngrinder_ip:8080/ admin admin 语言可以选择中文
-
-
创建脚本
-
菜单栏 脚本 》 创建脚本
-
脚本名称: 选择语言: groovy、jython 、groovy maven project, 别名
-
选择请求方法,填写URL地址
-
高级选项: Content-Type: application/json 请求体
-
配置ngrinder-agent
- web管理的登录名, 下载代理 这种方法下载的代理agent的配置文件,已经修改,不需要再次修改
- 如果不是这种方法下载,那么就要修改 agent.conf配置文件中controller的ip地址
- 解压包 tar -xvf ngrinder-agent-xxxxx.tar
- agent部署在非被测服务器上
- 启动
# sh 结尾的linux文件 ./run_agent.sh # 交互模式运行 ./run_agent_bg.sh # 后台运行 ./run_agent_internal.sh # 第一次是初始化运行
- 性能测试:
- 菜单 》 性能测试
- 目标主机: 被测服务器的ip地址 ------千万不要忘记
- web管理的登录名, 下载代理 这种方法下载的代理agent的配置文件,已经修改,不需要再次修改
ngrinder进行性能测试,是 进程 + 线程的组合模式
ngrinder:
- maven+groovy 进行脚本开始, ngrinder的版本要等于3.5.2
- ngrinder最新版本, 3.5.5 有兼容性问题 管理台界面会打不开
- ngrinder 建议使用3.5.2
=====
-
性能测试场景设计
-
如果公司要求你去做性能测试,
=====“需求”, 活动页面,要你做性能测试, 看是否能满足1000个人同时访问。
需求2: 商定,对接的接口,要满足 50tps。—这样的场景怎么设计
需求3: 秒杀活动,我要看,秒杀时,服务器能否支持500个人同时秒杀。
-
6种常见设计方法
- 普通性能场景设计
- 阶梯性能场景(负载测试场景)
- 压力测试场景
- 面向目标场景(lr很容易,但是jmeter,没有系统讲解,不知道怎么做)
- 混合场景设计(混合,if条件)不同数量的人,向不同的接口发起请求
- 有时间规律场景
-
普通性能场景
-
线程组
-
线程数: 模拟的并发用户数量
- 线程数,有没有限制呢?
- jmeter本身是没有对线程数做限制
- 但是, jmeter启动这些并发用户数时,需要消耗资源,受电脑cpu的主频限制,一台电脑不可能创建无限量的线程数
- 实际的情况,http协议的脚本,线程数,大概能 1500左右 2000个可能产生,但是可能会出错,1000左右比较保守,可能能产生。
- 也就是说,1台电脑,http协议脚本,保守估计是可以参数1000个并发用户数
- 如果你想模拟超过1000并发用户数,你可能需要考虑 分布式
- 线程数,有没有限制呢?
-
ramp-up时间
-
启动所有线程数启动的时间(线程数在合理的范围)
- 在ramp-up时间结束点,所有的人会产生
- 在ramp-up时间内,是否均匀产出并发用户数,是不确定
- 在启动时间内,产生的并发用户数,一产生,就去发起请求
- 启动了并发用户,就会去发起请求,不同时间产生的并发用户数,与前面产生的并发用户数,调用的接口可能不一样
- jmeter做性能测试,更多时候,使用的是,广义并发
- ramp-up时间要大于等于1
-
线程数 + ramp-up时间,怎么设置才比较合理?
- 500以内并发用户, ramp-up 2~4s
- 500-1000 ramp-up 5s
- >1000 ramp-up 5-8s
一个原则: ramp-up时间在总执行时间中,占比要很低
一般的情况,一个性能测试的总执行时间 几十秒钟 ~ 几十分钟
-
-
循环次数
- 默认必须大于等于1
- 循环次数,就是每个并发用户数要去执行的请求数量
- 复习框 永远 一直循环,直到你点击停止,才会
- 这个停止会有问题吗?
- 会有问题,会导致请求报错,或卡死
- 这个停止会有问题吗?
- 永远 应该怎么用呢?
- 要与 调度器 一起使用
- 必须把两个勾 都勾选
- 调度器:
- 持续时长
- 启动延迟
- 要与 调度器 一起使用
- 场景:
- 30个并发用户,持续运行300s
- 聚合报告: avgRT: 1.364s 90%RT:1.63s avgTPS: 21.9
- 结论:
- 90%RT:1.63s 可以看到,这个响应时间是比较长,已经超过了我们用户能容忍的范围了,用户满意度指数1.5s,说明我们的接口响应比较慢。
- 30个人, avgTPS: 21.9 tps<user 那么,每个人1秒钟发不了1个请求,所以,我们次数 30个并发用户数,已经超过了我们项目这个接口能承受最大并发用户数了。
- 可以简单得到一个结论: 服务器注册接口最大并发用户数小于30的
-
-
-
-
负载测试性能场景
- 负载测试: 逐步增加并发用户数
- 插件,
- 插件管理: jpgc 安装这个插件
- 用 5秒钟 增加10个并发用户数,持续运行30秒
完全不知道项目的性能瓶颈范围时,我们怎么设置 0~ 100
已经找到一个范围了,怎么设置?
注册接口的最大并发用户数 29
阶梯线程组: 负载测试
-
负载测试: 逐步增加并发用户数
- 增加的这个量,一定相同吗?
- 增加的量(步长),可以相同,也可以不相同
- 相同只是一种特殊请求 stepping threads group
- 不相同的增量,不能用stepping threads group
- 增加的量(步长),可以相同,也可以不相同
- 增加的这个量,一定相同吗?
-
在阶梯线程组,执行过程中,我们的并发用户数是时刻发生变化
-
阶梯线程组设计的规律:
- 缓起步,快结束
- 快结束: 并不是瞬间结束
- 缓起步,快结束
-
聚合报告:
- 阶梯线程组可以看聚合报告吗?
- 聚合报告中的数据,都是 平均值
- 在负载场景(阶梯场景),不看聚合报告
- 聚合报告是可以看到 失败率
- 阶梯线程组可以看聚合报告吗?
-
普通性能场景
-
阶梯性能场景(负载)
- 最大并发用户数
- kyj: 29
- 最大并发用户数
-
压力测试场景
- 压力测试: 长时间
- 29 * 20% = 6
- 29 * 80% = 24
- 时间
- 普通线程组
- 阶梯线程组
- 压力测试: 长时间
-
性能测试报告:
- 性能测试时,能不启用监听器,则不启用
- 真正做性能测试,怎么做呢?
- CLI-mode 无图形界面模式 命令行
- GUI-mode 仅仅用于编写调试脚本
- 没有监听器,我们怎么知道性能测试结果?
- jmeter的html报告,与是否启用添加监听器无关
- 真正做性能测试,怎么做呢?
- 性能测试时,能不启用监听器,则不启用
-
面向目标性能场景Arrivals Thread Group 多少tps
-
需求: 期望我项目的接口,都要能满足50tps?
- 算 50tps: 50 个事务每秒
- 50 t/s 1分钟: 50*60s = 3000 事务 1小时 3000 * 60 = 180000 事务
- 1小时要处理18w个请求 10小时 180w 24h 432w个请求
- 50 t/s 1分钟: 50*60s = 3000 事务 1小时 3000 * 60 = 180000 事务
如果你们公司的产品,日均访问量约为千万, 50tps基本已经能满足要求了
- 算 50tps: 50 个事务每秒
-
需求:要做一个秒杀, 能支持1000个人同时秒杀,我们的系统不能奔溃
- 可不可以理解为: 1000个人访问我们系统,持续运行,系统不能崩溃
- 用户对秒杀的理解,我要在1秒钟内收到处理结果, 1000tps
-
-
面向目标:Concurrency Thread Group
-
有时间规律: 波浪型Ultimate Thread Group 终极线程组
- 第二行,起始时间 要 大于等于 前一行的所有时间之和
Arrivals Thread : 达到多少率 tps
Concurrency Thread: 达到多少人 并发数
课后思考:
我有一个jmeter脚本,我期望,某个时间点开始运行,运行一段时间之后,暂停,然后再过一段时间又运行?怎么设计?
回顾
- 面向目标场景
- Arrivals Thread Group 可以面向tps
- Concurrency Thread Group 可以设置面向多少并发用户数
- 波浪型场景
- Ultimate Thread Group ===波浪型场景
- 在添加第二行时,初始化时间点,要大于等于上一行的所有时间之和====才能设计出 波浪型场景
- 阶梯线程组: stepping thread group线程组,负载测试场景
- 这种线程组,只能设计出,stepping 是相同的情况
- 想要设计,步长相同,或不相同的阶梯线程组,可以使用Ultimate Thread Group
问题: 我的脚本,期望在启动之后,运行一段时间,暂停,然后过一段时间之后,再运行?
1、jenkins中的定时任务 √ 但是,这种方式,需要大家掌握Jenkins中定时任务的配置
2、Ultimate Thread Group 下一波浪的起始时间大于 前一个波浪的所有时间之和
普通性能场景====普通线程组
负载性能场景=====stepping thread group 阶梯线程组 Ultimate Thread Group
压力测试场景 ====时间比较长
面向目标 ======
终极线程组 =======Ultimate Thread Group 模拟有时间规律的场景
可以模拟出压力测试场景吗?
新内容
- 混合场景: 不同数量的并发用户数,向不同接口发起请求—这种才是真正的混合场景,才真正符合企业产品实际情况
- “假”混合场景:在一个线程组中,添加逻辑控制器,控制我们脚本的运行,这种,是把脚本混合了, 但是于生产的情况还是有差异。
- 会用到前面讲的什么技术
- 跨线程组传参
- 线程组1 40
- 线程组2 20
- 线程组3 10
在做性能测试时,不要连续去执行性能测试,在前一轮性能测试结束的时候,要休息一会,等待服务器的压力释放,再开始下一轮性能测试,不然,因为前面的性能测试导致服务器压力过大,未释放,从而影响后续性能测试结果。
- 性能监控:
- 性能测试工具: 用什么工具来做性能测试
- 性能测试场景设计: 用什么方法模拟我们性能测试需求
- 性能监控:监控我们性能测试过程,收集性能测试过程中数据,拥有性能分析----主要时收集被测服务器的资源使用情况
- 被测服务器的资源:
- 硬件资源: cpu、内存、io、网络
- 软件资源: tomcat、jvm、数据库、连接池、中间件…
- 被测服务器的资源:
监控:硬件资源, 第二步,再监控 软件资源
最简单,最容易上手的方式:
nmon: 监控服务器硬件资源,这是一个独立的服务器资源监控工具
SeverAgent: 这个工具,可以和jmeter集成,在jmeter的GUI界面可以看到数据。
监控工具是监控被测服务器的,所以监控工具要安装在被测服务器上,
监控工具,本身也有资源消化,所以,选择监控工具,要尽可能选择资源消耗比较少的工具
把ServerAgent zip包上传到被测服务器,解压
unzip ServerAgent-2.2.3.zip
进入解压后的文件夹
./startAgent.sh ----启动命令, 绑定的端口是 4444
这个端口,在云服务器中,可能不允许对外开放这个端口
4444这个端口,在阿里云服务器中,是不允许开放这个端口
./startAgent.sh --udp-port 0 --tcp-port 5689
–udp-port 0 意思是,关闭UDP数据传输方式
–tcp-port 自定义端口, 自定义一个开放tcp数据传输的端口
PerfMon Metrics Collector
回顾
-
混合场景设计
- 跨线程组传参: 使用jmeter的动态属性
- 混合场景: 不同数量的并发用户,发起不同接口
-
性能监控工具: ServerAgent
- 这个工具,可以监控windows、linux系统的项目
- 注意: ServerAgent服务的默认端口 4444 这个端口,在一些云服务器中,不允许对外开放,所以,我们在启动ServerAgent这个服务的时候,需要指定服务的端口
./startAgent.sh --udp-port 0 --tcp-port 5689
端口的范围一般是多少?理论上 设置为 1024 ~ 65535之间
-
ServerAgent
- 在监听器的使用时,不同的单位,选择用多个监听器,不建议放在1个监听器中
- ConnectExpection:连接被拒
- 服务已经停止
- 网络不通
- 千万不要再简单用ping命令
- 要检查服务能否连通: telnet ip地址 服务端口
- 如果telnet不通,是什么情况?
- 1、防火墙没有开放这个端口 ----第1步,就坚持防火墙
- 如果防火墙是关闭的
- 2、服务没有启动、要么就是你的端口错误
- 特例: 云服务器,web管理台,要再web管理台中开放端口
- 1、防火墙没有开放这个端口 ----第1步,就坚持防火墙
- 如果telnet不通,是什么情况?
- 特点:
- 1、非常容易上手
- 2、可以监控window、linux
- 3、服务器硬件资源监控
- 4、可以结合jmeter来使用
-
nmon
-
这个工具,虽然不是我们课程中的重点监控工具,但是,再企业中,应用范围是比较广
-
nmon:这个工具,只能监控,linux服务器(不能监控windows)
- 这个工具,是一个独立工具,不依赖我们性能测试工具的
- 这个工具,进行服务器资源监控时,本身资源消耗很少,收集的监控数据比较全。
-
nmon有三种运行模式:
- 屏幕交互模式
- 数据收集模式—这一种用的比较多
- 定时执行模式
-
nmon的使用
-
获得nmon工具
- 首先,要知道你的服务器是什么系统
# 查看 centos系统的发现版本 cat /etc/redhat-release # 查看 debain家族 ubuntu ls -l /etc/*release* cat *** # 看到系统架构 x84_64 uname -a
-
执行nmon进行监控
- 屏幕交互模式
./nmon_x86_64_centos7
- cmdrtn q推出
- 数据收集模式
./nmon_x86_64_centos7 -f
- ./nmon_x86_64_centos7 -f -s3 -c50
- hostname_yyMMdd_hhmm.nmon
- 分析
- 打开nmon analyser v66.xlsm 带有宏文件 默认wps是不支持宏的
- nmon analyser v66.xlsm 要用mic office打开
- 分析
- 定时执行模式
./nmon_x86_64_centos7 -x
- 屏幕交互模式
-
-
实操
-
grafana + influxdb + jmeter ===可以与jmeter集成
-
jmeter脚本
- 终极线程组, 阶梯线程组。
-
Ultimate Thread Group: 如何设计 阶梯线程组
-
规律:
- 我要添加第二行配置,我期望结束时间时重合
- 所以,我们第1行的结束时间要远远大于后面时间之和
- 如果我想添加3个阶梯
规律:
1、下一行的初始化时间 = 上一行的initial + startup + 你期望运行多长时间之后启动第二个波浪的时间
2、每一行的 initial + 持续运行时间hold load 要相等 ----这样,我才能保证,在相同时间点来结束
- 我要添加第二行配置,我期望结束时间时重合
-
-
grafana + influxdb +jmeter
- 为什么先讲这个?
- 原因: 这个可以和jmeter集成,可以把jmeter进行性能测试过程中的数据,写入influxdb数据库中,通过grafana前端平台来展示出来。
- vs jmeter + severAgent: ServerAgent也可以和jmeter集成,但是,它只能在jmeter的gui界面中展示,脱离了jmeter的gui界面,就不能看到数据,也不能回看数据。
- 为什么先讲这个?
-
grafana:专门用于数据展示的前端平台,通过浏览器来访问
- 它自身没有数据存储功能
-
influxdb:时序数据库
- 数据库: 持久化存储数据的管理系统dbms
- 时序数据库:时间序列 这个数据库中,存放的数据,肯定有时间字段 根据时间来存数据, 根据时间排序
- 时间:时间戳, 时间戳是一个连续的数字段
-
jmeter:
- 进行性能测试,产生数据, 数据要写入influxdb数据库
-
实操:
- 1、kyj项目启动, -----确保项目是启动
- 2、jmeter调试脚本, ----确认脚本没有问题
- 3、在jmeter中,添加 后端监听器
- 后端监听器配置
- 选择 后端实现器: xxx.influxdb.xxxxx
- influxdbUrl 要修改为自己的infxludb数据库的ip地址
- 后端监听器配置
- 4、安装influxdb数据,以及创建一个jmeter库
- 能不能安装在被测服务器中?====不能安装在被测服务器上。要求安装在非被测服务器上。
- 非被测服务器的要求: jdk要大于等于1.8
- influxdb数据库的版本,建议使用1.x (不能是用2.x )
yum install influxdb-1.7.0.x86_64.rpm -y
执行完,把influxdb数据库已经安装成功- influxdb数据库默认端口 8086
- 启动inflxudb数据库
influxd
—启动命令
- 进入数据库要创建jmeter库
- 在另外一个终端中执行:
influx
- 查看当前所有的数据库,我想知道当前influxdb数据库中,有哪些库:
show databases;
我们看到没有jmeter库,我们就需要去创建一个库 - 创建jmeter库:
create database jmeter;
- 在另外一个终端中执行:
- 5、jmeter进行性能测试,把数据写入influxdb数据库中。
- 6、安装grafana
yum install grafana-7.4.3-1.x86_64.rpm -y
- 7、启动:systemctl restart grafana-server
- 8、配置:
- 访问grafana: http://grafana-server-ip:3000 admin admin
- 点击 add data source
- 选择influxdb 进入配置页面
- 一定要配置 url http://influxdb数据库的IP:8086
- database: jmeter
- save & test
- import 前端模板: 5496
- DBname选择自己上一步添加的数据源名称
granfana + prometheus + …
回顾
-
grafana + influxdb + jmeter
- grafana: 前台 + 配置模板
- influxdb: 时序数据库 存储数据 根据时间进行数据存储
- influxdb: 版本 1.x 不建议用2.x
- 启动influxdb1.x: influxd
- 进入influxdb的客户端模式: influx
- jmeter来产生数据
- jmeter的后端监听器中配置 —配置jmeter的数据写入influxbd数据库
- grafana的管理平台配置 -----grafana + influxbd 组合在一起
- 启动grafana:systemctl restart grafana-server
- 默认端口:http://grafana_ip:3000 admin admin
- add data source
- 选择influxbd
- URL地址:http://inflxudb_ip:8086
- 启动grafana:systemctl restart grafana-server
-
grafana + prometheus + node_exporter
- grafana
- prometheus: 时序数据库, 存储数据的
- node_exporter: 收集数据(收集监控数据)
- node_exporter 收集linux系统资源利用数据
- 这个解决方案中,node_exporter 是可变的,是根据你要收集哪些数据来进行选择
-
安装prometheus
- 开源,直接解压就可以使用
- tar.gz包,解压,然后启动 `./prometheus
- 默认端口: 9090 http://prometheus_ip:9090
- prometheus可以设置预警
- 开源,直接解压就可以使用
-
安装node_exporter------安装在被测服务器上
- 解压tar.gzbao 然后启动
./node_exporter
- 默认端口:9100 http://node_exporter_ip:9100
- 解压tar.gzbao 然后启动
-
配置prometheus + node_exporter结合
- 修改prometheus配置文件: prometheus.yml
- job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] - job_name: 'kyj_node_exporter' static_configs: - targets: ['192.168.3.41:9100','192.168.3.57:9100']
-
grafana 中配置展示Prometheus中的数据
- 登录
- add data source 选择 prometheus
- URL: http://prometheus_ip:9090
- import 模板
-
grafana + prometheus 不能放在被测服务器上,可以在同一台非被测服务器上,也可以分开在不同机器上
-
真正做性能测试怎么执行:
- JMETER-GUI模式 图像界面模式,只是用于 脚本开发以及调试脚本
- CLI模式: no gui 无图像界面模式
- jmeter -n
- -n no gui
- -t testplan 测试计划 jmx脚本文件
- -l result 结果写入文件 jtl格式,不存在的文件
- 因为命令行模式中,没有追加、覆盖功能,只能写在一个空文件
- jmeter.save.saveservice.output_format=csv 这个配置要为csv
- -e 转换
- -o 输出 到一个空文件夹
执行命令: 只能在进入jmeter的bin文件夹下执行, 因为我们没有配置jmeter的环境变量,所以jmeter这个命令不是系统命令,所以,要执行,必须在jmeter的bin文件夹下才能执行
命令执行的端口:4445 ~ 4455 10个端口 自动寻找这个端口区间
html报告中取点时间间隔默认是1分钟 6w毫秒,如果觉得太长,可以修改 reportgreerator.properties中jmeter.reportgenerator.overall_granularity=60000
grafana + influxdb + jmeter
- 重点: grafana + prometheus + …
- zabbix : 难点
- grafana + zabbix
- zabbix: 成熟的企业级服务器资源监控平台
- zabbix 本身前端 + 数据库 + 数据收集
- 不局限于性能测试。
- 可以独立监控 硬件资源 + 软件资源
- 在企业中,主要是 运维人员对生产环境进行监控
- 可以配置预警
- 组成有多个
- 最主要的 zabbix-server zabbix-agent(收集、安装被测服务器)
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
yum install zabbix-server-mysql zabbix-agent -y
yum install centos-release-scl -y
vim /etc/yum.repos.d/zabbix.repo
[zabbix-frontend]
enable =1
yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum install mysql-community-server -y
systemctl restart mysqld
vim /etc/my.cnf
# 添加validate_password_policy配置 0(LOW),1(MEDIUM),2(STRONG)
validate_password_policy=0
# 关闭密码策略
validate_password = off
# 设置字符集
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
# 再次重启mysqld
systemctl restart mysqld
改mysql的root密码
grep "password" /var/log/mysqld.log
# 复制密码
mysql -uroot -p回车
黏贴上面复制密码 回车
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 开启远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
systemctl restart mysqld
# 初始化zabbix的数据库
mysql -uroot -p回车
密码:123456
# 创建数据库
create database zabbix character set utf8 collate utf8_bin;
# 创建zabbix账号并赋予权限
create user zabbix@localhost identified by 'zabbix123';
grant all privileges on zabbix.* to zabbix@localhost;
quit;
# 初始化表结构和数据
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
输入密码: zabbix123
修改zabbix_server的配置文件
vim /etc/zabbix/zabbix_server.conf
DBPassword=zabbix123
修改zabbix前端配置
vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf
把第2、3行前面的# 去掉
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
listen.acl_users = apache,nginx
# 去掉最后一行前面 ;
#把 时区 Asia/Shanghai
集群: 多台机器一起向外提供服务能力
分布式: 分摊发起方的压力,产生更大的压力向服务器发起请求
-
分布式的配置:
- 多台机器
- 有条件:
- jdk 大版本要一致
java -version
大版本号要相同,小版本号可以不相同 - jmeter版本要一致
- jmeter的插件要一致
- 有没有要求操作系统?
- 没有 可以使用不同操作系统
- jdk 大版本要一致
-
配置助攻机器:
- jmeter.properties
- server_port=自定义一个端口
- server.rmi.port= 与上面相同的端口
- server.rmi.ssl.disable=true 不开启加密认证传输
- ./jmeter-server -Djava.rmi.server.hostname=192.168.3.36
- jmeter.properties
-
控制机配置
- jmeter.properties
- remote_hosts 添加助攻机器ip:端口,多个时,用英文逗号分开
- server.rmi.ssl.disable=true
- mode=Standard —使用标准模式,开启之后,才能实时看到助攻机器的数据
- jmeter.properties
总结:
特别注意事项:
1、你用的分布式的局域网不能太大
2、我们做分布式,千万千万不要用wifi网络
zabbix
分布式
回顾
-
zabbix:
- selinux权限
- nginx配置:nginx默认端口就是 80
- centos 7 + zabbix + mysql + nginx
- zabbix: server、agent
- server: mysql、 fronted前端要能被访问,需要配置nginx,端口80
- zabbix: server、agent
-
分布式环境部署
-
分布式,是分摊我们发起方的压力,要消耗发起方的资源的,助攻机器不能是被测项目机器
-
前提条件
- jdk的大版本要一致
- jmeter的版本要一致 5.1.1 —本地jmeter打包,传给助攻机器
- 插件要一致、csv文件要用相对路径
- 对于操作系统没有要求
-
操作步骤:
- 本地jmeter打包,上传到助攻机器上
- 如果助攻机器是linux机器: 给jmeter的bin文件夹中的文件赋予执行权限
- 可能在后续使用中,会报证书异常:
- 原因是因为没有证书,----我们在http代理录制的时候,生成了一个证书
- 可能在后续使用中,会报证书异常:
- 想把 linux机器 作为助攻机器,修改jmeter.properties配置文件为助攻机配置文件,修改之后,这台机器才会成为助攻机器
-
配置
-
助攻机器的配置
- server_port 自定义一个端口
- server.rmi.port 和上面一致的端口
- server.rmi.ssl.disable=true 关闭加密认证传输
启动助攻机器:./jmeter-server -Djava.rmi.server.hostname=助攻机器的ip
主控机器上执行 telnet 助攻机器ip 端口 -----检查主控机器和助攻机器网络是否通畅
-
主控机器的配置
- jmeter的bin文件夹中的jmeter.properties文件
- remote_hosts=助攻机器ip:端口
- server.rmi.ssl.disable=true
- mode=Standard 开启
- 保存
- 启动服务:gui模式
- jmeter的bin文件夹中的jmeter.properties文件
-
-
扩展:
- 1、只要助攻机器是启动的,主控和助攻之间的网络是通畅,那么我们主控是可以给助攻发任何指令
- 2、主控机器上的脚本发生变化,助攻机器没有变,远程启动助攻机器执行脚本时,时按照最新的主控机器脚本来执行
- ===助攻机器slave上一切行为,都是安装主控机器的指令执行。
- 3、有多台机器作为助攻机器时,活跃线程数,多条; 响应时间曲线,是不做任何处理,原样展示;tps曲线,原样展示。
- 4、CLI命令行模式 -r参数
- 有一个特别注意:网络
==========
自己动手 10分
-
-
性能测试CICD
-
Jenkins + jmeter + ant 解决方案
- 为什么选择它?
- CICD:持续集成 持续交付 把在制作品,尽可能快速,推送给用户 凤凰项目
- Jenkins 只是CICD一个工具devops
- 功能测试: 用它来打包,部署环境
- 自动化测试: 打包代码,运行代码,进行自动化测试
- 性能测试: 打包性能脚本,进行性能测试,获得性能报告
- ant: 代码的编译、测试、执行----- 做什么事情,选择最成手,就是最好
- 最重要的文件: build.xml
- maven: pom.xml
- graddle
- 它有什么作用?
- 打包性能脚本,进行性能测试,获得性能报告
- 为什么选择它?
-
安装Jenkins
- msi ====windows
- war=====tomcat
- jdk
- webapps下面方war
- 8080
- jenkins:
- http://ip:8080/jenkins
- 出现空白页面 要去国外源上下载必要的文件
- 插件页面:选择插件
-
回顾
- CICD: Jenkins + jmeter + ant
- Jenkins: 持续集成 持续交付的典型工具
- ant: 打包、编译、测试
- 重点难点:build.xml文件配置
- jmeter: 性能测试脚本 jmx
- svn、git
- jenkins安装:
- jdk:1.8
- tomcat + Jenkins.war +os(windows\linux\mac)
- 默认端口: 8080
- 用户名/.jenkins
- jenkins 改成国内源
- 安装ant插件
- Jenkins的访问地址: http://jenkins_ip:8080/jenkins
- 确保 ant插件已经安装
- 配置ant本地路径
- 新建item
- 构建: invoke ant
- 高级配置: 一定要选择你的jmeter的extas文件夹中的build.xml
- 构建: invoke ant
- 配置本地ant
- 配置ANT_HOME 环境变量
- 修改jmeter的jmeter.properties 中,有个output_format
- jmeter.save.saveservice.output_format=xml
- jmeter的extras文件夹中 ant-jmeter-1.1.1.jar 拷贝到ant的lib文件 ----发邮件
- build.xml
- project: 有且仅有一个
- default=all 默认情况下,会执行任务名称为all的任务,all的任务,它包含了test、report、mail 也就是说,默认情况下,会执行测试入围、生成报告任务、发送邮件任务。
- 在jenkins的item中配置 构建 invoke ant中 也有targets, 如果这个targets没有填,那么就根据build.xml文件中default值来执行,如果有填,就执行你填写的任务。如果targets 如果想要填多个,点击右侧 下三角图标,然后 回车换行的方式填写多个。
- project: 有且仅有一个
- jenkins构建
- 开始构建之前:
- 先启动项目
- 检查jmx中的启用的线程组场景设计的
- 开始构建之前:
CICD
动手 CICD
全链路
知识梳理
jmeter脚本开发
jmeter的场景设计
jmeter的监控
前面内容的回顾
-
jmeter工具来写脚本
-
jmeter性能场景设计
-
性能监控和监控平台
- zabbix
-
jmeter工具写性能测试脚本:
-
jmeter
- 运行环境:jre、jdk
- 目录
- 获取帮助 ----
- 存放第三方插件的路径:jmeter的lib\ext
- bin: jmeter.properties
- gui元件
- 线程组: 性能测试时,性能场景设计
- 取样器: 不同协议选择不同的取样器,写脚本
- 监听器: 查看响应的数据
- 配置元件:优先级是最高,最先被执行
- http消息头
- 用户定义变量
- 前置处理
- 在取样器执行执行被执行
- 用户参数
- 后置处理器
- 在取样器执行之后被执行
- json提取器、正则提取器
- 取样器
- 逻辑控制器
- if控制器、循环控制、foreach控制、事务控制器
- 断言
-
用户定义变量 vs 用户参数的区别:
-
用户定义变量:它是全局变量,在启动时,获取一次值,在运行过程中,不会动态获取值
- 全局变量,是可以跨线程组,但是,它的值一直都不会变
-
用户参数:局部变量,在启动时,获取一次值,在运行过程中,还会动态获取值
- 不能直接跨线程组传参
-
用户属性:这个属性是jmeter工具的标签,可以在jmeter整个工具中被使用
-
静态属性: 写在 .properties 结尾的文件中的配置
- jmeter属性(有静态属性, 也有动态属性)
- 系统属性(只有静态的)
-
动态属性
- 设置属性函数:setProperty
- 获取属性函数:property P
函数 需要大家自己去回顾一下
-
-
csv数据文件设置:
- 元件? ==== 配置元件
- 它获取到的值,可以被跨线程组
-
-
-
jmeter中可以直接写哪些开发语言的脚本? ===== Java 、groovy、 jython (python2.7)、js
-
http代理服务器=----录制脚本
-
关联: 前面接口返回的动态值,作为后续接口的传入参数值
-
http、soap、websocket、mq、dubbo、jdbc
-
DDT数据驱动性能测试
- 准备测试数据,用测试数据驱动性能测试
- csv\txt + csv数据文件设置
- jdbc: 把我们需要的、动态生成的一些测试数据,写入数据库(sqlite \ mysql),也可以同时写入txt
jmeter写的性能测试脚本,可以简单转换为功能、自动化测试脚本,但是,反过来不行。
-
场景设置
- 普遍线程组: 线程数 + ramp-up + (勾选循环次数永远 + 调度器)
- 聚合报告:
- 时间的单位:ms
- 吞吐量:看吞吐量的两个前提条件? —是一个平均值,常把它的值当作tps的值
- 并发用户数不变
- 没有网络瓶颈
- 吞吐率:计算出,是否有网络瓶颈,你的带宽是否村成为瓶颈
- 每一行: 都是一种 事务
- 事务、jmeter的取样器、jmeter的接口有什么区别?
- 在jmeter中,默认一个取样器,只能写一个接口,也是一种事务
- 但是,事务可以是多个接口(多个取样器),通过事务控制器,合并成为一个事务
- 事务、jmeter的取样器、jmeter的接口有什么区别?
- 聚合报告:
- 阶梯线程组:用于获取最大并发用户数
- 插件: jpgc
- stepping thread group
- 每次递增的并发用户数,是一个固定值
- 监听器:
- 活跃线程数图
- 随着时间变化响应时间图
- tps
- 图的看法: 在相同并发用户数时,响应时间平均线, tps的平均线
- 终极线程组
- 设置: 有时间规律的请求场景
- 也可以设置 阶梯线程
- 面向目标
- 可以面向多少tps
- 可以设置是否能支持多少并发用户数
- 混合场景
- 不同数据量的人,使用不同的接口,向服务器发起请求
- 普遍线程组: 线程数 + ramp-up + (勾选循环次数永远 + 调度器)
-
性能监控:
- ServerAgent 可以和jmeter集成,在jmeter中看到监控数据
- 只能看到硬件资源监控
- nmon: 可以不依赖于任何一款性能测试工具。
- 更多时监控硬件资源
- 在使用前,先确认你的服务器发行版本
- 三种模式
- grafana + influxdb + jmeter集成 ====监控平台
- influxbd 时序数据库
- 版本: 1.x
- grafana 前端
- jmeter: 数据写入influxdb
- 后端监听器
- influxbd 时序数据库
- grafana + prometheus 监控平台 ==========重点学习
- prometheus: 时序数据库
- prometheus.yml 配置
- node_exporter 数据收集 硬件资源数据
- prometheus: 时序数据库
- zabbix
- 成熟企业服务器监控平台
- jenkins 持续集成
- cli模式
- 分布式
- ServerAgent 可以和jmeter集成,在jmeter中看到监控数据
---------再次讲解 zabbix
http://zabbix_ip Admin/zabbix
zabbix server 没有启动 selinux 配置需要修改
vim /etc/selinux/config