性能测试知识


后置处理器

  • 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(,)}函数。

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脚本,进行计算,计算的结果为真,则执行下面请求
      • ----是要你自己去算,算出来是真或假
  • 事务控制器

逻辑控制 ------ jmeter脚本性能转换

  • 用jmeter写脚本,可以去做接口测试、自动化测试、性能测试
    • 但是,接口测试、自动化测试脚本,不能直接用于性能测试,需要进行性能转换,才能用于性能测试
    • 性能测试脚本,可以直接用于接口测试、自动化测试。
      • 性能测试,要尽可能的降低jmeter工具自身对资源消耗
        • 接口测试、自动化测试脚本,一定会添加断言,断言的目的是判断,是否有bug,断言这个元件在执行时,资源消耗,来自jmeter工具的资源,这个时间和资源的消耗,都是本机的,不是服务器消耗的时间和资源。-----我个人观点里面,是不要加断言。
        • Beanshell元件,写脚本时,只考虑功能能实现即可,不会过多去考虑,元件使用的时间、资源消耗。
          • 性能测试中, Beanshell所有元件,能不用则不用,如果,一定要写java代码来处理的 JSR223、 _ _ j e x l 3 ( , ) 、 {\_\_jexl3(,)}、 __jexl3(,){__groovy(,)}
          • 元件的选择:
            • JSR223
            • DDT
          • 运行模式: GUI 图形界面模式,===只用于编辑调试脚本
            • 真正性能测试用 CLI模式 —无图形界面模式

循环控制

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、并发用户数不变
      • 负载测试时,并发用户数会随着时间变化,而变化,就不能看聚合报告。
  • 每一行:都是一种事务
  • 每一列:
    • 样本: 在过程的过程中,所有的并发用户数,在一段时间中的总请求量
      • 单独看样本,是无法知道并发用户数、 执行时长
      • 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不一样

写脚本

  • 添加 配置元件 > 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
      • username
      • password
  • 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 创建表
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

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
  • 监听

    • 绿色,只是代表网络成功, response code 并不一定等于200
      • 它的响应码: 1xx、2xx、3xx
    • 红色,失败,
  • 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 性能测试开平台的优先选择

  • 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地址 ------千万不要忘记

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个请求

      如果你们公司的产品,日均访问量约为千万, 50tps基本已经能满足要求了

    • 需求:要做一个秒杀, 能支持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、非常容易上手
      • 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 + 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
  • 配置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的插件要一致
      • 有没有要求操作系统?
        • 没有 可以使用不同操作系统
  • 配置助攻机器:

    • jmeter.properties
      • server_port=自定义一个端口
      • server.rmi.port= 与上面相同的端口
      • server.rmi.ssl.disable=true 不开启加密认证传输
      • ./jmeter-server -Djava.rmi.server.hostname=192.168.3.36
  • 控制机配置

    • jmeter.properties
      • remote_hosts 添加助攻机器ip:端口,多个时,用英文逗号分开
      • server.rmi.ssl.disable=true
      • mode=Standard —使用标准模式,开启之后,才能实时看到助攻机器的数据

总结:

​ 特别注意事项:

​ 1、你用的分布式的局域网不能太大

​ 2、我们做分布式,千万千万不要用wifi网络

zabbix

分布式

回顾

  • zabbix:

    • selinux权限
    • nginx配置:nginx默认端口就是 80
    • centos 7 + zabbix + mysql + nginx
      • zabbix: server、agent
        • server: mysql、 fronted前端要能被访问,需要配置nginx,端口80
  • 分布式环境部署

    • 分布式,是分摊我们发起方的压力,要消耗发起方的资源的,助攻机器不能是被测项目机器

    • 前提条件

      • 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模式
    • 扩展:

      • 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
  • 配置本地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 如果想要填多个,点击右侧 下三角图标,然后 回车换行的方式填写多个。
  • 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中,默认一个取样器,只能写一个接口,也是一种事务
            • 但是,事务可以是多个接口(多个取样器),通过事务控制器,合并成为一个事务
    • 阶梯线程组:用于获取最大并发用户数
      • 插件: jpgc
      • stepping thread group
        • 每次递增的并发用户数,是一个固定值
      • 监听器:
        • 活跃线程数图
        • 随着时间变化响应时间图
        • tps
        • 图的看法: 在相同并发用户数时,响应时间平均线, tps的平均线
    • 终极线程组
      • 设置: 有时间规律的请求场景
      • 也可以设置 阶梯线程
    • 面向目标
      • 可以面向多少tps
      • 可以设置是否能支持多少并发用户数
    • 混合场景
      • 不同数据量的人,使用不同的接口,向服务器发起请求
  • 性能监控:

    • ServerAgent 可以和jmeter集成,在jmeter中看到监控数据
      • 只能看到硬件资源监控
    • nmon: 可以不依赖于任何一款性能测试工具。
      • 更多时监控硬件资源
      • 在使用前,先确认你的服务器发行版本
      • 三种模式
    • grafana + influxdb + jmeter集成 ====监控平台
      • influxbd 时序数据库
        • 版本: 1.x
      • grafana 前端
      • jmeter: 数据写入influxdb
        • 后端监听器
    • grafana + prometheus 监控平台 ==========重点学习
      • prometheus: 时序数据库
        • prometheus.yml 配置
      • node_exporter 数据收集 硬件资源数据
    • zabbix
      • 成熟企业服务器监控平台
    • jenkins 持续集成
    • cli模式
    • 分布式

---------再次讲解 zabbix

http://zabbix_ip Admin/zabbix

zabbix server 没有启动 selinux 配置需要修改

vim /etc/selinux/config

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值