JMeter性能压测

使用代理服务器录制请求

  • 添加 HTTP(S) Test Script Recorder

  • 添加 Thread Group

  • Thread Group 中添加 Recording Controller

  • 打开 HTTP(S) Test Script Recorder ;设定Port =8088;设定 Target Controller=Test Plan > Thread Group > Recording Controller

  • Requests Filtering 添加IncludeExclude URL正则表达式,目的为避免录制过多没必要的请求;
    Include: .*\.(baidu\.com).*
    Exclude: .*\.(js|css|PNG|jpg|ico|png|gif).*

  • 单击保存按钮,命名脚本文件名,将对JMeter脚本的更改存储到磁盘。

  • 打开Firefox浏览器,将浏览器的代理服务器地址指向http://localhost:8088

  • 单击 HTTP(S) Test Script Recorder 中的Start按钮,打开代理。

  • 单机弹框种的确定按钮,JMeter的录制代理将会开启。

  • 打开网页开始录制,直到录制完成。

  • 添加 View Results Tree: 用途是看Req/Resp详情

  • 回放验证:为了检验,所以一个并发、一次循环即可;单击开始按钮运行按钮开始回放。

线程组

  • 第一部份:在请求取样器执行错误时需要执行的下一步动作
    • Continue: 继续执行接下来的操作
    • Start Next Loop: 忽略错误,执行下一个循环
    • Stop Thread: 退出该线程(不再进行此线程的任何操作)
    • Stop Test: 等待当前执行的采样器结束后,结束整个测试
    • Stop Test Now: 直接停止整个测试
  • 第二部份: 线程属性
    • Number of Thread(users): 线程数,模拟的用户数量
    • Ramp-up Period(in seconds): 达到指定线程数所需要的时间。eg: 线程数设置为50,此处设置为5,那么每秒启动的线程数=>线程数50/5=10
    • Loop Count:循环次数
    • Same user on each iteration:每次迭代都用相同的用户,勾选该选项则不同次数迭代之间是串行执行,不勾选则为并行执行
    • Delay Thread creation until needed: 当线程需要执行的时候,才会被创建。如果不选择这个选项,那么,在计划开始的时候,所有需要的线程就都被创建好了。
    • Specify Thread lifetime: 定义线程调度时间
    • Duration(seconds): 持续时间(秒),在此选项填入N,说明这个计划,从某个开始时间算起,执行N秒后结束。(会忽略 结束时间 的选项)。
    • Startup delay(seconds): 启动延迟(秒),在此选项填入N,手动点击开始执行计划,然后延迟N秒后,计划才真正开始执行。

控制器

  • 事务控制器 Transaction Controller
  • 条件控制器 If Controller
  • 循环控制器 Loop Controller
  • 随机控制器 Random Controller

采样器

  • 采样器(取样器): 模拟用户操作,向服务器发出请求的组件;
  • 采样器作用: 向服务器发送请求,记录响应时间与响应信息;
  • 常用采样器:
    • HTTP Request Sampler
    • Debug Sampler
    • BeanShell sampler

场景逻辑控制技术

  • 利用JMeter逻辑控制器
  • 实现测试业务流程中的逻辑变化
  • 模拟实际业务场景

监听器

  • 用来动态得监控JMeter执行测试的过程,实时查看测试结果;
  • 常用监听器Listener
    • View Results Tree: 查看结果树
    • Aggregate Report: 聚合压测报告
    • Backend Listener: 后端监听器

定时器

  • 顾名思义,定时器是用来控制采样器发出请求开始时间的组件
  • 常见定时器:
    • Constant Timer: 固定定时器
    • Gaussian Random Timer: 高斯随机定时器;Deviation(偏差),Constant Delay Offset(固定延迟时间)
    • Constant Throughput Timer: 吞吐量定时器
    • Synchronizing Tmier: 并发(同步)定时器

断言元件的使用

  • 断言的作用就是让JMeter程序判断预期结果和实际结果是否一致,从而判定请求是否成功
  • 常见断言:
    • Response Assertion: 响应断言
    • Size Assertion: 大小断言
    • XPath Assertion: XPath断言
    • JSON Assertion: Json断言

常用配置元件剖析(Config Element)

  • 配置元件的用途: Http请求Header、Cookie、压测时的请求参数
  • 常见的配置元件:
    • HTTP Header Manager
  • 配置元件的执行顺序: 请求之前执行
  • 配置元件的作用范围:
  • 配置元件执行结果的查看:

前置处理器(Pre Processors)

  • 在取样器发送请求之前执行,做一些准备工作,如设置参数、环境变量等
  • 常见前置处理器举例:
    • Sample Timeout PreProcessor: 1、设定请求超时时间;2、作用范围内的所有请求均生效
    • BeanShell PreProcessor: 1、小型嵌入式Java源码解释器;2、在Sampler执行之前会被执行

后置处理器(Post Processors)

  • 后置处理器主要用于取样器执行后的提取数据操作;
  • 常见的后置处理器:
    • Json Extractor
    • 正则表达式Extractor
    • XPath Extractor

执行顺序

JMeter Plugin Manager 安装

  • 下载地址: https://jmeter-plugins.org/
  • Install: 下载plugins-manager.jar并将其放入lib/ext目录中,然后重新启动JMeter

参数化测试

并发策略

web service加压实战

Prometheus服务端性能监控系统

  • 应用场景: 时序性性能监控 → 时序性监控、关联分析、性能测试、性能分析 Prometheus
  • 链路监控: 链路分析、性能追踪 SkyWalking ZipKin
  • Prometheus 技术架构

prometheus系统搭建

  • 准备 prometheus.yml 配置文件
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
    
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
      - targets:
        # - alertmanager:9093
    
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
    
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a Label job=<job_name>'to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to "http'.

    static_configs:
      - targets: ["192.168.3.11:9090"]

  - job_name: "node_exporter"
    
    # metrics_path defaults to '/metrics'
    # scheme defaults to "http'.

    static_configs:
      - targets: ["192.168.3.11:9100"]

Grafana 数据分析系统搭建

  • 下载镜像: docker pull grafana/grafana
  • 启动镜像: docker run -d --name grafana -p 3000:3000 -v /Users/chenqiang/docker/grafana:/var/lib/grafana grafana/grafana
  • 访问地址验证: http://localhost:3000

jmeter 实时压测结果收集

  • 性能监控平台部署 - InfluxDB

    • 下载influxDB镜像: docker pull influxdb:1.8

    • 启动influxDB容器,将新influxDB容器命名为 Jmeterdb,执行docker创建容器命令: docker run -d -p 8086:8086 -p 8083:8083 --name influxdb influxdb:1.8

    • 执行命令进入容器内部: docker exec -it influxdb bash

    • 再容器内部创建 jmeter 数据库,用于收集JMeter发送的压测数据;执行 influx 命令进入命令台

    • 执行类sql语句创建jmeter数据库: create database jmeter; 执行show databases验证数据库已创建成功。

  • 性能监控平台部署 - JMeter

    • 再JMeter脚本中添加 Backend Listener 组件,用于收集数据并发送给InfluxDB;
    • 在Backend Listener implementation 中选择 org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient(注意:须使用Jmeter5.0以上版本)
    • 在influxdbURL中将实际的influxdb hostname填写进去
    • application中填写 baidu
    • 在testTitle中填写 Baidu Testing
    • percentiles中填写 50;90;95;99
    • 将summaryOnly设置为false
    • 其余配置保持不变
    • 运行JMeter,然后在influxdb中检验是否已经能够接收到数据
    • 在influxdb命令台中使用查询语句,检查是否已经能够收到数据: use jmeter;select *from jmeter;

  • 性能监控平台部署 - Grafana

    • 容器启动 转至:Grafana 数据分析系统搭建
    • Grafana DashBoard 配置 转至: 基本性能监控系统使用 Database: jmeter
      模版id: 4026
  • 性能监控平台部署 - 运行与结果展示

    • 在JMeter中,分别将线程数分别调整为10,20,30;持续压测时间为1分钟。
    • 分别对系统施加压力测试,然后在Grafana 面板中可以看到运行结果。

系统性能数据收集(cpu、mem、net、io)

  • 部署性能监控工具 - node-exporter
    • 拉取镜像 docker pull quay.io/prometheus/node-exporter
    • 启动容器脚本:
      docker run -d --name node_exporter -p 9100:9100 \
      -v "/proc:/host/proc:ro" \
      -v "sys:/host/sys:ro" \
      -v "/:/rootfs:ro" \
      quay.io/prometheus/node-exporter
      
    • 配置prometheus.yml,将 node-exporter的实际位置设定到prometheus.yml配置文件中
    • 重启prometheus系统

Prometheus 监控系统部署应用实战

实战流程分析