压力测试和JMeter的使用

发布于 2023-02-12  434 次阅读


概述

1.性能指标

从外部看,性能测试主要关注如下三个指标【量越大越好,时间越少越好】

  • 吞吐量:每秒钟系统能够处理的请求数、任务数。
  • 响应时间:服务处理一个请求或一个任务的耗时。
  • 错误率:一批请求中结果出错的请求所占比例。

1.1 响应时间RT(Response Time)(重要)

响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。

1.2 错误率(重要)

一批请求中结果出错的请求所占比例。

1.3 HPS(Hits Per Second)

每秒点击次数,单位是次/秒。

TPS(Transaction per Second)吞吐量(重要)

系统每秒处理交易数,单位是笔/秒。

QPS(Query per Second)(重要)

系统每秒处理查询次数,单位是次/秒。

对于互联网业务中,如果某些业务有且仅有一个请求连接,那么TPS=QPS=HPS,一 般情况下用 TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求。

无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:

  • 金融行业:1000TPS~5000OTPS,不包括互联网化的活动
  • 保险行业:100TPS~10000OTPS,不包括互联网化的活动
  • 制造行业:10TPS~5000TPS
  • 互联网电子商务:1000OTPS~1000000TPS
  • 互联网中型网站:1000TPS~50000TPS
  • 互联网小型网站:50OTPS~10000TPS

最大响应时间(MaxResponse Time)

指用户发出请求或者指令到系统做出反应(响应)的最大时间。

最少响应时间(Mininum ResponseTime)

指用户发出请求或者指令到系统做出反应(响应)的最少时间。

90%响应时间(90%Response Time)

是指所有用户的响应时间进行排序,第90%的响应时间。

2. 压测工具

Apache AB

加特林

JMeter

  • 文档网址:https://jmeter.apache.org/download_jmeter.cgi
  • zip安装包:
    https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.zip

JMeter

1.使用步骤

1.1.添加线程组

线程属性值含义:

  • 线程数:200
  • Ramp-Up时间:1【1秒启动200个线程】
  • 循环次数:100【每个线程发送100个请求,一共200*100 = 20000个请求】

1.2.添加取样器

取样器:表示测试何种请求,这里使用HTTP请求

  1. 右键线程组=》添加取样器=》HTTP请求=》
  2. 指定url,端口,参数,请求类型

1.3.添加监听器

察看结果树

查看每次请求是否成功

1635426441427

汇总报告

1635426386057

聚合报告

1635426431409

2.JMeterAddress Already in use 错误解决

windows帮助文档:错误 WSAENOBUFS (10055) - Windows Client | Microsoft Learn

windows本身提供的端口访问机制的问题。
Windows提供给 TCP/IP链接的端口为1024-5000,并且要四分钟来循环回收他们。就导致
我们在短时间内跑大量的请求时将端口占满了。

  1. cmd中,用regedit命令打开注册表
  2. 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下
    • 右击parameters,添加2个新的 DWORD,名字为MaxUserPort、TCPTimedWaitDelay
    • 然后双击MaxUserPort,输入数值数据为65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作)
    • 然后双击TCPTimedWaitDelay,输入数值数据为30,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作)
    • 重启机器

3.优化

3.1.影响性能考虑点

1.影响性能考虑点包括:【这里可以从访问顺序来作为链路进行性能调优】

数据库、应用程序、中间件( tomact、gateway、Nginx、)、网络(带宽)和操作系统等方面

2.首先考虑自己的应用属于CPU密集型还是Io密集型,根据jvisualvm查看应用健康情况

  • CPU:计算、排序、过滤、整合【集群】
  • IO:网络、磁盘、数据库、redis【内存+缓存+固态+提高网卡的传输效率】

3.监控执行时中间件CPU、内存使用量
docker stats:查看cpu占用、内存使用量.

1635429437505

例如:minorGC每次都能干净释放eden,表示很健康

1635430395359

3.2.jvm内存模型

主要优化堆,避免发生fullGC

1635428602937
1635428629073

创建对象:

1635428752533
1635429056878

jconsole和jvisualvm

jdk小工具,通过命令行启动可以监控本地和远程应用【远程应用需要配置】

  1. cmd输入【推荐使用这个】
    jvisualvm
  2. 安装插件Visual GC(用于监控垃圾回收)
    如果不能安装插件(点击检查最新版本异常):
    1)进入该链接:https://visualvm.github.io/pluginscenters.html
    2)java -version 查看版本1.8.0_171
    3)找到对应版本复制链接:https://visualvm.github.io/uc/8u131/updates.xml.gz
    4)点开设置,编辑插件中心,粘贴URL
    5)安装插件Visual GC

visual GC:

1635430067370

3.3.优化步骤(重点)

  1. 使用jmeter压测nginx、网关、直接访问服务、通过链路访问服务
  2. 测nginx时使用docker stats查看CPU占用+内存使用量,调整CPU性能
  3. 测网关时,打开jvisualvm查看内存、CPU使用量,调整CPU、内存
    • 增加jvm内存:-Xmx512m
  4. 记录下压测指标填在下表中
    • 先优化各中间件
    • 使用更好的协议
    • 买更好的网卡+网线+带宽
  5. 压测说明
    • 首页渲染(全量数据获取) localhost:10000
    • 选中高级,从HTML文件获取所有内含的资源、并行下载数量
  6. 指标:
    • 中间件越多,性能损失越大,损失在网络交互
    • 命中率不低于95%
    • 锁等待次数越低、时间越短越好
    • 业务:
      • DB(MYSQL优化,加索引 parent_cid pms_category表)
      • 模板渲染速度(thymeleaf开启缓存)
        • spring.thymeleaf.cache= true
      • 静态资源(把静态资源放到nginx里面)
      • 日志级别改成error(打印日志会耗时)
        • logging.level. com.atguigu.gulimall: error
  7. 堆内存优化
    • -Xmx1024m -Xms1024m -Xmn512m
  8. NGINX动静分离

全量数据获取:

1635433495777

nginx动静分离

1635434764388
  1. 未动静分离,指的是静态资源全都存储在Tomcat中,所有静态资源都要从Tomcat获取, 会访问 nginx->gateway->Tomcat获取静态资源,从而导致占用Tomcat很多线程来处理静态资源
  2. 动静分离,表示将资源与web服务器分离,可存放在nginx中,静态资源直接从nginx中返回 /static/**所有请求都由nginx直接返回

压测结果

吞吐量括号内表示瓶颈,(db)表示瓶颈在db

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
Nginx5087882200
Gateway localhost:88503271935
简单服务 localhost:10000/hello5056242073
首页渲染 localhost:10000/index.html50850(db,thymeleaf)442729
首页渲染(开缓存)50214380710
首页渲染(thymeleaf开缓存+优化数据库+日志级别:error)50480159253
三级分类数据获取 localhost:10000/index/catalog.json502(db)2631127335
三级分类数据获取(加索引)505959710176
三级分类数据获取(优化业务逻辑(一次性查询)+加索引+堆内存)506511501849
三级分类数据获取(优化业务逻辑(一次性查询)+加索引+堆内存+redis缓存)50390155296
三级分类数据获取(优化业务逻辑(一次性查询)+加索引+堆内存+redis缓存+分布式锁)50313212355
首页渲染(全量数据获取) localhost:10000/index.html【废弃】5013(静态资源)49166954
首页渲染(全量数据获取+动静分离)gulimall.com508.2851413435
首页渲染(全量数据获取+动静分离+堆优化)gulimall.com508831113411
Nginx+Gateway50
Gateway+简单服务 localhost:88/hello50118080142
全链路(nginx+gateway+简单服务) gulimall.com/hello50532126226