谷粒商城-性能压测

1.压力测试

在项目上线前对其进行压力测试(以每个微服务为单元)

目的:找到系统能承载的最大负荷,找到其他测试方法更难发现的错误(两种类型:内存泄漏,并发与同步).

1.性能指标

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

HPS(Hits Per Second):每秒点击次数,单位是 次/秒.(意义不大)

TPS(Transaction Per Second):每秒处理的交易数,单位是 笔/秒.

QPS(Query Per Second):每秒处理的查询次数,单位是 次/秒

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

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

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

90%响应时间(90% ResponseTime):是指所有用户的响应时间进行排序,第 90%的响应时间.

从外部看,性能测试主要关注如下指标:

        吞吐量:每秒钟系统能够处理的请求数、任务数。

        响应时间:服务处理一个请求或一个任务的耗时。

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

2.JMeter

1.安装JMeter

Apache JMeter - Download Apache JMeter下载,解压,来到bin目录找到jmeter.bat文件

2.JMeter压测示例

1.添加线程组

HTTP请求里写的是要压力测试的目标,查看结果树,汇总报告,聚合报告可以看到我们上述说的很多性能指标

3.JMeter Address Already in use错误解决

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

1.cmd中,用regedit命令打开注册表

2.性能监控

影响性能考虑点包括:

        数据库,应用程序,中间件(tomcat,Nginx),网络和操作系统等方面

首先考虑自己的应用属于 CPU密集型 还是 IO密集型

1.JVM内存模型

优化更多的是在 堆

2.堆

运行期间所有的对象实例创建和内存分配都放在了 堆 里

新对象创建过程和垃圾回收机制:

先看Eden(伊甸园区)放不放的下,放不下,就进行一次MinorGC(小GC清理Eden区的没用的对象,把有用的对象放进Survival(幸存者区)区),然后继续看Eden放不放的下,放不下,就转进 老年代 ,看 老年代 是否放的下,放不下,进行一次FULL GC(大GC,会清理掉堆中所有的没用的对象,但是性能比小GC慢10倍),如果 老年代 也放不下,就会报内存溢出错误 OOM.

其中在进行 MinorGC的有用的旧对象会被放入 Survival(幸存者区),会根据MinorGC不断在S1和S0交换位置,方便腾出更大的空间,且每次MinorGC都会使 Survival 里的对象增加一岁,当增加至 15 岁时会被转入 老年代 中(15岁是因为计算年龄用4bit 1111是15).

了解垃圾回收机制后,我们在进行压力测试时就需要监控 堆 内的这些内存情况,可以使用 jconsole 和 jvisualvm 来监控

3.Jvisualvm

jdk8以上没有了,可以去官网下载VisualVM

下载后可以在Idea中找VisualVM插件,下载完配置VisualVM插件,以下可参考:

JVisualVM 性能分析与 Mybatis ResultHandler 实战_idea jvisualvm-CSDN博客

添加GC插件:

1.Jvisualvm可以干什么

监控内存泄露,跟踪垃圾回收,执行时内存、cpu分析,线程分析..

我们来测试中间件对响应的影响:

打开JMeter:

然后看

得出结论:中间件越多,性能损失越大,大多都损失在网络交互

业务:

        Db(数据库)(MySQL优化)

        模板的渲染速度(CPU ,缓存)

        静态资源

3.优化

1.nginx动静分离

先把index挪进nginx:

删掉本机里的index:

然后在nginx的conf的nginx.conf文件里更改:

更改HTML页面的引用路径

2.增加内存

3.优化业务(三级分类数据获取)

之前是循环查询数据库,导致性能降低,我们只查询一次数据库,就会提升性能:

抽取方法:

    private List<CategoryEntity> getParent_cid(List<CategoryEntity> selectList ,Long parent_cid) {List<CategoryEntity> collect = selectList.stream().filter(item -> item.getParentCid() == parent_cid).collect(Collectors.toList());return collect;//return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));}
    @Overridepublic Map<String, List<Catelog2Vo>> getCatalogJson() {/*** 1.将数据库的多次查询变为一次*/List<CategoryEntity> selectList = baseMapper.selectList(null);//1.查出所有1级分类List<CategoryEntity> level1Categorys = getParent_cid(selectList,0L);//2.封装数据Map<String, List<Catelog2Vo>> collect = level1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {//1.遍历每一个一级分类,查到这个一级分类里的所有二级分类List<CategoryEntity> categoryEntities = getParent_cid(selectList,v.getParentCid());//2.封装上面的结果List<Catelog2Vo> catelog2Vos = null;if (categoryEntities != null) {catelog2Vos = categoryEntities.stream().map(l2 -> {Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName());//1.找三级分类List<CategoryEntity> level3Catelog = getParent_cid(selectList,l2.getCatId());if (level3Catelog!=null){List<Catelog2Vo.Catelog3Vo> catelog3Vos = level3Catelog.stream().map(l3 -> {//2.封装成指定格式Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());return catelog3Vo;}).collect(Collectors.toList());catelog2Vo.setCatalog3List(catelog3Vos);}return catelog2Vo;}).collect(Collectors.toList());}return catelog2Vos;}));return collect;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267717.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2023IMO预选题几何第5题

在锐角 △ A B C \triangle ABC △ABC 中, ω ω ω 是外接圆, O O O 是外心. D D D, E E E 分别是 ω ω ω 上不同于 B B B, C C C 的点, 满足 B D BD BD ⊥ A C AC AC, C E CE CE ⊥ A B AB AB. 设直线 C O CO CO, A B AB AB 交于点 X X X, 直线 B O BO BO,…

怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由 怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由 在当今数字化的世界中&#xff0c;网站和应用程…

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

GIT新手提交操作

1、创建一个本地分支 进入Xshell已经拉取的该项目的项目代码路径下执行git checkout -b 姓名全拼音&#xff0c;例如&#xff1a;git checkout -b xiewei&#xff0c;当前显示已创建。 cuihengyidell-PowerEdge-T550:~/SVN/Git_R11/R11_V4.02.0_Source$ git checkout -b cuih…

[数据集][目标检测]躺坐站识别检测数据集VOC+YOLO格式9488张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9488 标注数量(xml文件个数)&#xff1a;9488 标注数量(txt文件个数)&#xff1a;9488 标注…

STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置

目录 前言 介绍 PlatformIO STM32CubeMX Visual Studio Code 正文 使用STM32CubeMX生成PlatformIO可以支持的Makefile文件 1. 选择目标引脚并配置 2. 配置时钟树 3. [关键&#xff01;调试则需要&#xff1a;]选择调试器类型 4. 选择对应的目标IDE配置代码与文件 使…

Spring Boot中如何实现全链路调用日志跟踪?

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 在Spring Boot中实现全链路调用日志跟踪&#xff0c;主要依赖于Mapped Diagnostic Context&#xff08;MDC&#xff09;功能。MDC是一种用于在多线程条件下记录日志的功能&#xff0c;它可以看作是与当…

【Unity】关于Luban的简单使用

最近看了下Luban导出Excel数据的方式&#xff0c;来记录下 【Unity】关于Luban的简单使用 安装Luban开始使用UnityLubanC# 扩展 安装Luban Luban文档&#xff1a;https://luban.doc.code-philosophy.com/docs/beginner/quickstart 1.安装dotnet sdk 8.0或更高版本sdk 2.githu…

Java面经之Java并发

进程&#xff1a;程序的一次执行 线程&#xff1a;一个进程在执行的过程可以产生多个线程 多个线程共享进程的堆和方法区资源&#xff0c;但每个线程有自己的程序计数器、虚拟机栈、本地方法栈 其中程序计数器是为了线程切换后恢复到正确的执行位置&#xff1b;虚拟机栈和本地…

Zabbix自定义监控内容部署+邮件报警+Zabbix自愈+Zabbix批量添加主机

一、自定义监控项 1.1自定义监控项原理 1&#xff09;先明确获取监控指标数据的命令或脚本; 2&#xff09;在被监控主机配置文件子目录&#xff08;/etc/zabbix/zabbix_agent2.d/)中创建以.conf后缀的监控项配置文件&#xff0c;自定义获取监控指标数据的键值&#xff1b; …

【VUE】个人记录:父子页面数据传递

1. 父传子 在父页面中&#xff0c;调用子页面的组件位置处&#xff0c;通过“&#xff1a;”进行参数传递 <child-component :childData"parentData"></child-component>parentData对象&#xff0c;需要在父页面的data中进行初始化声明 在子页面中&am…

算法与算法分析

目录 一.前言 二.算法的特性和要求 三.分析算法--时间效率 四. 分析算法--空间效率 一.前言 算法就是对特定问题求解方法和步骤的一种描述&#xff0c;它是指令的有限序列。其中&#xff0c;每个指令表示一个或多个操作。总而言之&#xff0c;我们数据结构就是通过算法实现操…

全球CG盛事:世界3D渲染大赛震撼开幕!

在数字艺术的浪潮中&#xff0c;CG&#xff08;计算机图形学&#xff09;已经成为现代视觉艺术不可或缺的一部分。它不仅推动了电影、游戏和动画产业的发展&#xff0c;更激发了无数艺术家的创造力。今天&#xff0c;我们迎来了一个全球CG界的盛事——世界3D渲染大赛的震撼开幕…

【Unity2D 2022:UI】TextMeshPro组件无法显示中文

在Unity中创建了一个预制体Card&#xff0c;上面挂载了一些Text Mesh Pro组件用来显示卡牌信息。但是在输入文字后&#xff0c;发现无法显示中文&#xff1a; 解决方法如下&#xff1a; 一、导入字体文件&#xff08;ttf格式&#xff09;和常用字字集&#xff08;txt格式&…

【LLM大模型】LLaMA3微调部署真不难!拿走这份教程,轻松掌握LLaMA大模型微调!

今天给大家分享一个爆火的llama3教程&#xff0c;也就是下面这份&#xff1a; 这个项目是基于Meta最新发布的新一代开源大模型Llama-3开发的&#xff0c;是Chinese-LLaMA-Alpaca开源大模型相关系列项目的第三期。本项目开源了中文Llama-3基座模型和中文Llama-3-Instruct指令精…

使用curl测试websocket服务是否能正常连入

部分场景&#xff0c;前端连接不上websocket服务&#xff0c;需要从后台验证websocket服务是否能连入&#xff0c;判断防火墙是否开通&#xff0c;反向代理是否配置正确&#xff0c;可以使用curl测试服务器websocket服务是否正常。 分行命令 curl --include \--no-buffer \--…

自监督学习概述(Self-Supervised Learning,SSL)

自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;是一种机器学习方法&#xff0c;旨在利用未标记数据进行训练。这种方法通过从数据本身生成伪标签&#xff0c;来创建监督信号&#xff0c;使得模型能够学习有效的数据表示。自监督学习在深度学习领域…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm&#xff0c;创建项目&#xff1a;flask-web vue create flask…

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…

【已解决】TypeError: argument of type ‘int’ is not iterable

【已解决】TypeError: argument of type ‘int’ is not iterable 在Python编程中&#xff0c;TypeError: argument of type int is not iterable是一个常见的错误。此错误表明你尝试对一个整数&#xff08;int&#xff09;执行迭代操作&#xff0c;但整数是不可迭代的。本文将…