2.压力测试+优化(Jmeter)

news/2024/11/16 19:27:25/

typora-copy-images-to: assert
typora-root-url: assert

概述

1.性能指标

从外部看,性能测试主要关注如下三个指标【量越大越好,时间越少越好】吞吐量:每秒钟系统能够处理的请求数、任务数。响应时间:服务处理一个请求或一个任务的耗时。错误率:一批请求中结果出错的请求所占比例。

响应时间RT(重要)

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

错误率(重要)

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

HPS

HPS(Hits Per Second):每秒点击次数,单位是次/秒。

TPS吞吐量(重要)

TPS(Transaction per Second):系统每秒处理交易数,单位是笔/秒。

QPS(重要)

**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%响应时间(90%Response Time)**是指所有用户的响应时间进行排序,第90%的响
应时间。

2.压测工具

Apache AB

加特林

JMeter

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

JMeter

1.使用步骤

1.1.添加线程组

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

1.2.添加取样器

取样器:表示测试何种请求,这里使用HTTP请求1.右键线程组=》添加取样器=》HTTP请求=》2.指定url,端口,参数,请求类型

1.3.添加监听器

察看结果树

查看每次请求是否成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbninLlh-1683351987723)(/1635426441427.png)]

汇总报告

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6klOlB6-1683351987724)(/1635426386057.png)]

聚合报告

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xa8EFWp9-1683351987725)(/1635426431409.png)]

2.JMeterAddress Already in use 错误解决

windows帮助文档:
https://support.microsoft.com/zh-cn/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-twindows本身提供的端口访问机制的问题。
Windows提供给 TCP/IP链接的端口为1024-5000,并且要四分钟来循环回收他们。就导致
我们在短时间内跑大量的请求时将端口占满了。1.cmd中,用regedit命令打开注册表
2.在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下1.右击parameters,添加2个新的 DWORD,名字为MaxUserPort、TCPTimedWaitDelay2.然后双击MaxUserPort,输入数值数据为65534,基数选择十进制(如果是分布式运
行的话,控制机器和负载机器都需要这样操作哦)3.然后双击TCPTimedWaitDelay,输入数值数据为30,基数选择十进制(如果是分布式运
行的话,控制机器和负载机器都需要这样操作哦)4.修改配置完毕之后记得重启机器才会生效

3.优化

3.1.影响性能考虑点

1.影响性能考虑点包括:【这里可以从访问顺序来作为链路进行性能调优】数据库、应用程序、中间件( tomact、gateway、Nginx、)、网络(带宽)和操作系统等方面2.首先考虑自己的应用属于CPU密集型还是Io密集型,根据jvisualvm查看应用健康情况CPU:计算、排序、过滤、整合【集群】IO:网络、磁盘、数据库、redis【内存+缓存+固态+提高网卡的传输效率】3.监控执行时中间件CPU、内存使用量
docker stats:查看cpu占用、内存使用量、

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5z8AStkD-1683351987726)(/1635429437505.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhITCl4C-1683351987727)(/1635430395359.png)]

3.2.jvm内存模型

1.主要优化堆避免发生fullGC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjOC9iSV-1683351987727)(/1635428602937.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVmTCk6F-1683351987728)(/1635428629073.png)]

创建对象:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlvbxFiW-1683351987728)(/1635428752533.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVnwuOkX-1683351987729)(/1635429056878.png)]

jconsole和jvisualvm

jdk小工具,通过命令行启动可以监控本地和远程应用【远程应用需要配置】1.cmd输入【推荐使用这个】
jvisualvm
2.安装插件Visual GC(用于监控垃圾回收)如果不能安装插件(点击检查最新版本异常):1)进入该链接:https://visualvm.github.io/pluginscenters.html2)java -version	查看版本1.8.0_1713)找到对应版本复制链接:https://visualvm.github.io/uc/8u131/updates.xml.gz4)点开设置,编辑插件中心,粘贴URL5)安装插件Visual GC

visual GC:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnGzgqEw-1683351987729)(/1635430067370.png)]

3.3.优化步骤(重点)

1.使用jmeter压测nginx、网关、直接访问服务、通过链路访问服务2.测nginx时使用docker stats查看CPU占用+内存使用量,调整CPU性能3.测网关时,打开jvisualvm查看内存、CPU使用量,调整CPU、内存增加jvm内存:-Xmx512m4.记录下压测指标填在下表中1)先优化各中间件2)使用更好的协议3)买更好的网卡+网线+带宽5.压测说明:1)首页渲染(全量数据获取)  localhost:10000选中高级,从HTML文件获取所有内含的资源、并行下载数量6.指标:1)中间件越多,性能损失越大,损失在网络交互2)命中率不低于95%3)锁等待次数越低、时间越短越好4)业务:DB(MYSQL优化,加索引 parent_cid pms_category表)					在navicat中管理索引,右键添加模板渲染速度(thymeleaf开启缓存)  spring.thymeleaf.cache= true静态资源(把静态资源放到nginx里面) 日志级别改成error(打印日志会耗时) logging:level:com.atguigu.gulimall: error5)堆内存优化	-Xmx1024m -Xms1024m -Xmn512m【测试gulimall全量资源时,同时打开jvisualvm查看内存GC情况】NGINX动静分离:静态资源也会由客户端发起请求,并且请求是gulimall.com/static/**,这个请求会重新经过Nginx1、所有项目的静态资源都应该放在Nginx里面2、规则:/static/***所有请求都由Nginx直接返回1)在nginx新建文件夹:/mydata/nginx/html/static,将product的static下的index文件夹拷过来之前的静态资源请求:gulimall.com/index/img/section_second_list_right_img.png2)修改项目内部静态资源的请求路径:ctrl+Rsrc="index/ =》 src="/static/index/href=" =》 href="/static/<script src=" => <script src="/static/<img src=" => <img src="/static/url('/  =>  3、修改nginx配置,gulimall.conf,监听gulimall.com:80/static,返回rootlocation /static {root   /usr/share/nginx/html;}三级分类数据获取【超级慢】1)、优化业务逻辑:1、一次性查询出来小技巧:将以下语句快速抽取为一个方法,选中右键:refacto=》extract=》MethodbaseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", level1.getCatId()));	

全量数据获取:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYGdcR9M-1683351987730)(/1635433495777.png)]

nginx动静分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctFBLDxR-1683351987731)(/1635434764388.png)]

1.未动静分离,指的是静态资源全都存储在Tomcat中,所有静态资源都要从Tomcat获取,
会访问 nginx->gateway->Tomcat获取静态资源,从而导致占用Tomcat很多线程来处理静态资源2.动静分离,表示将资源与web服务器分离,可存放在nginx中,静态资源直接从nginx中返回
/static/**所有请求都由nginx直接返回步骤:1)cd /mydata/nginx/htmlmkdir static2)将product项目内static文件夹下的index文件夹,拖到/mydata/nginx/html/static此目录下3)修改index.html中静态资源的请求路径src="index/ =》 src="/static/index/href=" =》 href="/static/<script src=" => <script src="/static/<img src=" => <img src="/static/url('/  =>  动静分离前下例请求会访问nginx=》gateway=》product=》static...
http://gulimall.com/index/img/img_09.png
分离后使用下例请求直接访问nginx中的静态资源
http://gulimall.com/static/index/img/img_09.png4)修改gulimall.conf配置(监听gulimall.com/static请求,使用root作为根路径查找静态资源):location /static/ {root /usr/share/nginx/html;}解析:/static/index/img/img_09.png会找到挂载目录/usr/share/nginx/html/usr/share/nginx/html/static/index/img/img_09.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBnqpMhR-1683351987731)(/1635435409426.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljmbl6JZ-1683351987732)(/1635437211407.png)]

模拟线上崩溃

拿200个线程循环压测+静态资源获取+并行下载
测试首页 gulimall.com	 80
崩溃:1.堆内存溢出,线程池报错2.gulimall-product下线无法请求503加大内存,开启以上所有的优化步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jn0WPwbo-1683351987733)(/1635438011851.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fwIfVDr2-1683351987733)(/1635437878798.png)]

内存即将溢出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rk0YMFyX-1683351987734)(/1635438088176.png)]

堆溢出,线程池报错:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oc9XCjwV-1683351987734)(/1635438101304.png)]

实例下线:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNwJ7WoN-1683351987735)(/1635438178657.png)]

优化三级分类

/*** 查询三级分类并封装成Map返回*/
@Override
public Map<String, List<Catalog2VO>> getCatalogJson() {// 1.查询所有分类,按照parentCid分组Map<Long, List<CategoryEntity>> categoryMap = baseMapper.selectList(null).stream().collect(Collectors.groupingBy(key -> key.getParentCid()));// 2.获取1级分类List<CategoryEntity> level1Categorys = categoryMap.get(0L);// 3.封装数据Map<String, List<Catalog2VO>> map = level1Categorys.stream().collect(Collectors.toMap(key -> key.getCatId().toString(), l1Category -> {// 3.查询2级分类,并封装成List<Catalog2VO>List<Catalog2VO> catalog2VOS = categoryMap.get(l1Category.getCatId()).stream().map(l2Category -> {// 4.查询3级分类,并封装成List<Catalog3VO>List<Catalog2VO.Catalog3Vo> catalog3Vos = categoryMap.get(l2Category.getCatId()).stream().map(l3Category -> {// 封装3级分类VOCatalog2VO.Catalog3Vo catalog3Vo = new Catalog2VO.Catalog3Vo(l2Category.getCatId().toString(), l3Category.getCatId().toString(), l3Category.getName());return catalog3Vo;}).collect(Collectors.toList());// 封装2级分类VO返回Catalog2VO catalog2VO = new Catalog2VO(l1Category.getCatId().toString(), catalog3Vos, l2Category.getCatId().toString(), l2Category.getName());return catalog2VO;}).collect(Collectors.toList());return catalog2VOS;}));return map;
}

3.x.压测指标

吞吐量括号内表示瓶颈,(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
     | 8                 | 8311        | 13411       |

| Nginx+Gateway | 50 | | | |
| Gateway+简单服务 localhost:88/hello | 50 | 1180 | 80 | 142 |
| 全链路(nginx+gateway+简单服务) gulimall.com/hello | 50 | 532 | 126 | 226 |


http://www.ppmy.cn/news/60662.html

相关文章

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…

深度学习笔记之卷积神经网络(一)卷积函数与图像卷积操作

深度学习笔记之卷积神经网络——卷积函数 引言什么是卷积图像卷积操作 引言 从本节开始&#xff0c;将介绍卷积神经网络。本节将介绍卷积函数。 什么是卷积 卷积&#xff0c;是一种通过两个函数 f ( ⋅ ) 和 f(\cdot)和 f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)生成第三个函数 h ( …

出海的中国企业,为什么有80%都选择了这家云服务商?

对于想要出海的中国企业来说&#xff0c;什么样的云服务才是他们的最佳选择&#xff1f; 中国企业出海驶入快车道 中国企业的出海大潮&#xff0c;多年来一直方兴未艾&#xff0c;并且得到了政府部门的大力支持。这股“走出去”的热潮&#xff0c;一方面对内有利于推动产业升级…

销售数据分析怎么做?这篇文章说清楚了

如何分析销售数据&#xff1f;分析销售数据有哪些指标&#xff1f;销售数据分析有什么作用&#xff1f; 销售数据是不是得通过数据分析软件啊&#xff1f; 本文将为您解答疑惑—— 一、分析销售数据的指标 从两个层面上来讲&#xff0c;一个是对销售情况的整体把控&#xf…

I.MX6Q-SDB开发板移植ubuntu

I.MX6Q-SDB开发板移植ubuntu 0.前言一、准备工作二、ubuntu移植1.下载ubuntu发布的根文件系统2.根文件系统的简单修改3.板卡适配设置4.打包根文件系统 三、烧写镜像1.dd命令2.uuu工具3.mfgtool工具4.i.mx6q-sdb的拨码设置&#xff1a; 四、大无语事件 0.前言 这两天收拾杂货堆&…

【Python入门知识】NumPy 数组搜索,案例+理论讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 搜索数组 可以在数组中搜索&#xff08;检索&#xff09;某个值&#xff0c;然后返回获得匹配的索引。 要搜索数组&#xff0c;请使用 where() 方法。 实例 查找值为 4 的索引&#xff1a; import numpy as nparr np.…

第三代移动通信技术(3G)

第三代移动通信采用码分多址&#xff08;CDMA&#xff09;技术&#xff0c;现已基本形成了三大主流技术&#xff0c;包括有&#xff1a;W-CDMA、CDMA-2000和TD-SCDMA。这三种技术都属于宽带CDMA技术&#xff0c;都能在静止状态下提供2Mbius的数据传输速率。但这三种技术在工作模…

Spring事务隔离级别详解

Spring有五大隔离级别&#xff1a; 1、ISOLATION_DEFAULT 2、ISOLATION_READ_UNCOMMITTED 3、ISOLATION_READ_COMMITTED 4、ISOLATION_REPEATABLE_READ 5、ISOLATION_SERIALIZABLE ISOLATION_DEFAULT 用底层数据库的设置隔离级别。 ISOLATION_READ_UNCOMMITTED 一个事…