谷粒商城-nginx搭建域名访问环境性能压测

nginx搭建域名访问环境

正向代理与反向代理

正向代理:客户端向代理服务器发请求并指定目标服务器,代理向目标服务器转交请求并将获得的内容返回给客户端。
反向代理:用户直接访问反向代理服务器就可以获得目标服务器的资源。反向代理服务器统一了访问入口。反向代理是对外界屏蔽了很多内部的信息

需求

访问“gulimall.com”,Nginx反向代理到网关地址“http://localhost:88/#”,展示商品页面

大致流程

在这里插入图片描述

配置反向代理-使得访问gulimall时访问nginx

windows域名解析会先找C:\Windows\System32\drivers\etc下的hosts文件,然后才找dns服务器
当我们在浏览器输入gulimall.com的时候,就会去找我们的虚拟机,此时虚拟机中的nginx是运行的话,就可以访问到nginx,因为nginx监听的是80端口

192.168.56.10	gulimall.com
方法一 直接使用nginx反向代理 使所有gulimall.com都转到首页

配置nginx.conf的主要内容
在这里插入图片描述
配置/etc/nginx/conf.d/gulimall.conf
监听gulimall.com域名 将其定位到首页
在这里插入图片描述

使用nginx将请求反向代理到网关

配置nginx.conf
在http中配置上由服务器 实现nginx负载均衡

upstream gulimall{        #配置上游服务器,起名为gulimallserver 192.168.56.1:88;    #配置上游服务器为网关地址}include /etc/nginx/conf.d/*.conf;    #该路径下的配置文件会全部合并到这里

修改/etc/nginx/conf.d/gulimall.conf

location / {    #配置请求的路由proxy_pass http://gulimall;    #因为主配置文件配置了上游服务器为网关地址,所以可以请求路由到=}

网关配置

- id: gulimall_host_routeuri: lb://gulimall-productpredicates:- Host=**.gulimall.com

踩坑:
nginx正确处理转发api请求到网关 但是主页访问失败
原因:nginx转发请求给网关时会丢失掉请求的host信息
解决方法:配置请求头

proxy_set_header Host $host;

压力测试

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。使用压力测试, 我们有希望找到很多种用其他测试方法更难发现的错误。 有两种错误类型是:内存泄漏, 并发与同步问题。
内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
并发与同步:有效的压力测试系统将应用以下这些关键条件:重复, 并发, 量级, 随机变化

压力测试的性能指标

响应时间:响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。响应时间越少越好。
HPS(Hits Per Second):每秒点击次数,单位是次/秒。
TPS(Transaction per Second):系统每秒处理交易数,单位是笔/秒。
Qps(Query per Second):系统每秒处理查询次数,单位是次/秒。
一般情况下用 TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求。
无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:
金融行业:1000TPS~5000OTPS,不包括互联网化的活动
保险行业:100TPS~10000OTPS,不包括互联网化的活动
制造行业:10TPS~5000TPS
互联网电子商务:1000OTPS~1000000TPS
互联网中型网站:1000TPS~50000TPS
互联网小型网站:500TPS~10000TPS
最大响应时间(MaxResponse Time)指用户发出请求或者指令到系统做出反应(响应)的最大时间。
最少响应时间(Mininum ResponseTime)指用户发出请求或者指令到系统做出反应(响应)的最少时间。
90%响应时间(90%Response Time)是指所有用户的响应时间进行排序,第90%的响应时间

JMeter 压测示例

添加线程组 :右键“test plan” 添加

线程组参数详解:
线程数: 虚拟用户数。 一个虚拟用户占用一个进程或线程。 设置多少虚拟用户数在这里也就是设置多少个线程数。
Ramp-Up时间: 200个线程需要多少秒内全部启动完成。 如果线程数为 10, 准备时长为 2, 那么需要 2 秒钟启动 10 个线程, 也就是每秒钟启动 5 个线程。
循环次数: 每个线程发送请求的次数。勾选“永远”会一直压力测试下去。 如果线程数为 10, 循环次数为 100, 那么每个线程发送 100 次请求。 总请求数为 10*100=1000 。 如果勾选了“永远”, 那么所有线程会一直发送请求, 一到选择停止运行脚本。
Delay Thread creation until needed: 直到需要时延迟线程的创建。
调度器: 设置线程组启动的开始时间和结束时间(配置调度器时, 需要勾选循环次数为永远)
持续时间(秒) : 测试持续时间, 会覆盖结束时间
启动延迟(秒) : 测试延迟启动时间, 会覆盖启动时间
启动时间: 测试启动时间, 启动延迟会覆盖它。 当启动时间已过, 手动只需测试时当前时间也会覆盖它。
结束时间: 测试结束时间, 持续时间会覆盖它。
在结果树和汇总报告中查看请求结果

添加 HTTP 请求

在这里插入图片描述

本机压测错误解决JMeter Address Already in use

出现原因
windows 本身提供的端口访问机制的问题。
Windows 提供给 TCP/IP 链接的端口为 1024-5000, 并且要四分钟来循环回收他们。 就导致我们在短时间内跑大量的请求时将端口占满了。
解决思路
扩大提供给 TCP/IP 链接的端口
缩短循环回收时间
通过修改windows配置文件解决

性能监控

概念讲解

影响性能考虑点包括:数据库、 应用程序、 中间件(tomact、 Nginx) 、 网络和操作系统等方面
首先考虑自己的应用属于 CPU 密集型(以空间换时间 大量计算数据)还是 IO 密集型(以时间换空间 大量读取数据)
JVM内存模型
在这里插入图片描述
程序计数器 Program Counter Register:
记录的是正在执行的虚拟机字节码指令的地址,
此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域
虚拟机栈: VM Stack
描述的是 JAVA 方法执行的内存模型, 每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表, 操作数栈, 动态链接, 方法接口等信息
 局部变量表存储了编译期可知的各种基本数据类型、 对象引用
 线程请求的栈深度不够会报 StackOverflowError 异常
 栈动态扩展的容量不够会报 OutOfMemoryError 异常
 虚拟机栈是线程隔离的, 即每个线程都有自己独立的虚拟机栈
本地方法: Native Stack
本地方法栈类似于虚拟机栈, 只不过本地方法栈使用的是本地方法
堆: Heap
几乎所有的对象实例都在堆上分配内存
Java源文件编译成.class字节码文件 ,.class字节码文件被JVM的类装载器装载到JVM里,所有数据都在“运行时数据区”。性能优化主要是优化“运行时数据区”中的“堆”。
在这里插入图片描述
Java垃圾清理主要在堆区,元数据区直接操控物理内存

所有的对象实例以及数组都在堆上分配。 堆是垃圾收集器管理的主要区域, 也被称为“GC堆” ,也是我们优化最多考虑的地方。
新生代
Eden 空间
From Survivor 空间
To Survivor 空间
老年代
永久代/元空间
Java8 以前永久代, 受 jvm 管理, java8 以后元空间, 直接使用物理内存。 因此,默认情况下, 元空间的大小仅受本地内存限制。
创建对象放到堆内存的流程:
1.首先,任何新对象都分配到 eden 空间。两个幸存者空间开始时都是空的。
2.当 eden 空间填满时,将触发一个Minor GC(年轻代的垃圾回收),删除所有未引用的对象,大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年代。
3.所有被引用的对象作为存活对象,将移动到第一个幸存者空间S0,并标记年龄为1,即经历过一次Minor GC。之后每经过一次Minor GC,年龄+1。
4.当 eden 空间再次被填满时,会执行第二次Minor GC,将Eden和S0区中所有垃圾对象清除,并将存活对象复制到S1并年龄加1,此时S0变为空。
5.如此反复在S0和S1之间切换几次之后,还存活的年龄等于15的对象在下一次Minor GC时将放到老年代中。
6.当老年代满了时会触发FullGC(全GC),Full GC 清理整个堆 – 包括年轻代和老年代。
7.Major GC是老年代的垃圾回收,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上

Minor GC:清理年轻代空间(包括 Eden 和 Survivor 区域),释放在Eden中所有不活跃的对象,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
Survivor区:Survivor区被用来作为Eden及老年代的中间交换区域,当老年代空间足够时,Survivor区的对象会被移到老年代,否则会被保留在Survivor区。
Major GC:清理老年代空间,当老年代空间不够时,JVM会在老年代进行major gc。
Full GC:清理整个堆空间,包括年轻代和老年代空间。Full GC比Minor GC慢十倍,应该尽量避免。
在这里插入图片描述
详细流程图
在这里插入图片描述

使用 jvisualvm监控本地和远程应用

Jdk 的两个小工具 jconsole、 jvisualvm(升级版的 jconsole) ;通过命令行启动, 可监控本地和远程应用。 远程应用需要配置
这里使用jvisualvm
1)监控线程状态
在这里插入图片描述
线程状态:
运行: 正在运行的
休眠: sleep
等待: wait
驻留: 线程池里面的空闲线程
监视: 阻塞的线程, 正在等待锁
2)安装Visual GC插件监控GC状态
在这里插入图片描述

监控指标

GC

在这里插入图片描述
当前正在运行的线程数不能超过设定的最大值。 一般情况下系统性能较好的情况下, 线程数最小值设置 50 和最大值设置 200 比较合适。
当前运行的 JDBC 连接数不能超过设定的最大值。 一般情况下系统性能较好的情况下,JDBC 最小值设置 50 和最大值设置 200 比较合适。
GC频率不能频繁, 特别是 FULL GC 更不能频繁, 一般情况下系统性能较好的情况下,JVM 最小堆大小和最大堆大小分别设置 1024M 比较合适。

数据库

在这里插入图片描述

SQL 耗时越小越好, 一般情况下微秒级别。
命中率越高越好, 一般情况下不能低于 95%。
锁等待次数越低越好, 等待时间越短越好

压测与优化

压测

压测nginx

docker stats查看nginx的运行状况,比如CPU、内存占有率、IO情况等
JMeter 压力测试:
设置虚拟机地址以及nginx端口监控nginx
在这里插入图片描述
得出结论nginx比较浪费CPU

压测网关

JMeter添加请求后运行:
在这里插入图片描述
这里是服务器本机地址和端口88
查看jvisualvm 发现网关对CPU的占用率同样比较高

简单服务
@ResponseBody@GetMapping("/hello")public String hello() {return "hello";}

检测结果

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
Nginx50233511944
Gateway5010367831
简单服务5011341817
Gateway+简单服务

两者结合之后吞吐量下降
检测结果

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
Gateway+简单服务50312430125
中间件越多,性能损失越大,大多损失在网络交互
全链路(nginx+GateWay+简单服务)
压测内容压测线程数吞吐量/s90%响应时间99%响应时间
Gateway+简单服务50312430125
全链路5080088310
压测首页一级菜单
压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页一级菜单渲染50270(慢的原因:db,thymeleaf)267365

分析得出慢的原因可能是数据库和thymeleaf渲染

压测三级分类
压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页一级菜单渲染50270(慢的原因:db,thymeleaf)267365
三级分类数据获取502(db)

慢的原因是数据库

压测全量网页(包括静态资源)
压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页一级菜单渲染50270(慢的原因:db,thymeleaf)267365
三级分类数据获取502(db)
首页全量数据获取507(静态资源)

慢的原因是静态资源

优化方向

1.数据库
2.thymeleaf渲染
3.静态资源

首页一级菜单优化

1)开启thymeleaf缓存

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页一级菜单渲染50270(慢的原因:db,thymeleaf)267365
首页渲染(开缓存)50290251365

性能有一定提升
2)优化数据库
①一级分类根据parent_id查询 维奇加上索引

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页一级菜单渲染50270(慢的原因:db,thymeleaf)267365
首页渲染(开缓存)50290251365
首页渲染(开缓存、 优化数据库)50700105183
全量数据获取优化
Nginx动静分离

在这里插入图片描述
为什么要动静分离
未分离的项目静态资源放在后端,无论是动态请求还是静态请求都会来到后台,这极大的损耗了后台Tomcat性能(大部分性能都用来处理静态请求)
动静分离后,后台只会处理动态请求,而静态资源直接由nginx返回。
具体步骤
在这里插入图片描述
1.静态资源存到Nginx里
1)在nginx的html目录下新建一个static目录用来存放静态资源
2)将gulimall-product的静态资源复制到该目录,并将本地静态资源删除
3)templates里文件静态资源路径前“static”
4)在nginx配置静态资源的路径映射
进入配置文件

vim /mydata/nginx/conf/conf.d/gulimall.conf 

#监听gulimall.com:80/static
location /static {root  /usr/share/nginx/html;       #资源在这个文件夹下匹配
}

优化结果

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
首页全量数据获取507(静态资源)
首页全量数据获取5011

发现老年代GC问题
解决方法
调大堆内存
-Xmx1024m -Xms1024m -Xmn512m
-Xms :初始堆大小
-Xmx :最大堆大小
-Xmn :堆中新生代初始及最大大小

三级分类数据获取优化

每次遍历一级分类列表里的元素,都要查一次数据库
解决方法1:将数据库的多次查询变为一次
将查询的分类结果放入list,以后每次在list中获取即可

private List<CategoryEntity> getParent_cid(List<CategoryEntity> selectList,Long parentCid) {List<CategoryEntity> categoryEntities = selectList.stream().filter(item -> item.getParentCid().equals(parentCid)).collect(Collectors.toList());return categoryEntities;}
压测内容压测线程数吞吐量/s90%响应时间99%响应时间
三级分类数据获取502(db)
三级分类数据获取50111571896

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

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

相关文章

主流的开发语言和开发环境介绍

个人浅见&#xff0c;不喜勿喷&#xff0c;谢谢 软件开发是一个涉及多个方面的复杂过程&#xff0c;其中包括选择合适的编程语言和开发环境。编程语言是软件开发的核心&#xff0c;它定义了程序员用来编写指令的语法和规则。而开发环境则提供了编写、测试和调试代码的工具和平台…

天锐绿盾 | 文件数据\资料防泄漏软件 \ 自动智能透明加密保护

怎么防止公司办公终端文件数据资料外泄? 防止公司办公终端文件数据资料外泄是非常重要的&#xff0c;以下是一些有效的措施&#xff1a; 限制访问权限&#xff1a;根据员工的职责和需求&#xff0c;设定文件和数据资料的访问权限。确保只有授权人员才能访问敏感信息。 加密存…

Codeforces Round 927 (Div. 3)

F. Feed Cats 题目大意 给一长度为的数轴&#xff0c;个区间在数轴上选取一些点作为特殊点在满足个区间中&#xff0c;每个区间内只能有一个特殊点问最多能选多少个特殊点 解题思路 对于每个点有放或不放两种状态考虑表示位置可能放或不放的最优结果若不放&#xff0c;若放…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

C#,动态规划(DP)丢鸡蛋问题(Egg Dropping Puzzle)的三种算法与源代码

1 扔鸡蛋问题 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xf…

猜谜“龘”人速来!网安人元宵灯谜有礼了

​​灯笼高挂&#xff0c;星光璀璨&#xff0c;品味糯叽叽的元宵&#xff0c;以灯谜为媒&#xff0c;亚信安全邀你共赴元宵佳节。 热辣滚烫的班先别上了&#xff0c;文末有奖竞猜&#xff0c;快来参与&#xff01; 喜闹元宵 谜面一&#xff1a;一路向上成大业&#xff1b; 谜…

进程的相关命令,进程的创建、调度、消亡,进程相关函数接口

我要成为嵌入式高手之2月23日Linux高编第八天&#xff01;&#xff01; 学习笔记 进程 一、进程基本概念 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 二、进程相关…

虚拟列表【vue】等高虚拟列表/非等高虚拟列表

文章目录 1、等高虚拟列表2、非等高虚拟列表 1、等高虚拟列表 参考文章1 参考文章2 <!-- eslint-disable vue/multi-word-component-names --> <template><divclass"waterfall-wrapper"ref"waterfallWrapperRef"scroll"handleScro…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

OpenLayers多要素旋转平移缩放及olext深度定制化

目录 1.前言2.olext官方示例3.重写Transform.js4.自定义样式5.自定义选中机制6.拓展思考6.1包围框的角度问题6.2不选中要素如何平移 7总结 1.前言 首先OpenLayers本身是支持旋转、平移、缩放的。olext 只是在 OpenLayers 的基础上又做了一层封装&#xff0c;使得看起来比较好看…

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑&#xff0c;分为无状态和有状态 无状态引用如下所示&#xff0c;如果一个nginx服务&#xff0c;删除后重新部署有可以访问&#xff0c;这个属于无状态&#xff0c;不涉及到数据存储。 有状态服务&#xff0c;如redis&a…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture06 Logistic回归

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture06 Logistic回归 课程网址 Pytorch深度学习实践 部分课件内容&#xff1a; import torchx_data torch.tensor([[1.0],[2.0],[3.0]]) y_data torch.tensor([[0.0],[0.0],[1.0]])class LogisticRegressionModel(…

Redis高性能原理

redis大家都知道拥有很高的性能&#xff0c;每秒可以支持上万个请求&#xff0c;这里探讨下它高性能的原理。单线程架构和io多路复用技术。 一&#xff0c;单线程架构 单线程架构指的是命令执行核心线程是单线程的&#xff0c;数据持久化、同步、异步删除是其他线程在跑的。re…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络&#xff0c;因为与CPU相比&#xff0c;它提供了更多的计算能力。在本教程中&#xff0c;我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先&#xff0c;确保您的机器中至少有一个Nvidia GPU&#xff0c;并正确安装了CUDA以及CUDN…

ES6内置对象 - Map

Map&#xff08;Map对象保存键值对&#xff0c;键值均不限制类型&#xff09; 特点&#xff1a; 有序&#xff08;Set集合是无序的&#xff09;&#xff1b;键值对&#xff08;键可以是任意类型&#xff09;&#xff1b;键名不能重复&#xff08;如果重复&#xff0c;则覆盖&…

第九节HarmonyOS 常用基础组件28-Select

1、描述 提供下拉选择菜单&#xff0c;可以让用户在多个选项之间选择。 2、接口 Select(options:Array<SelectOption>) 3、SelectOption对象说明 参数名 参数类型 必填 描述 value ResourceStr 是 下拉选项内容。 icon ResourceStr 否 下拉选项图标。 4…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止&#xff1f; A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下&#xff1a;const用来修饰变量是想其…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

智能运维都有哪些工作?智能运维哪些领域好

智能运维领域包含的各项工作内容包括&#xff1a; 数据采集与管理&#xff1a;该工作内容涉及从各种设备和系统中收集数据&#xff0c;如性能数据、日志数据等&#xff0c;并对这些数据进行清洗、转换和整合。数据采集与管理为后续的分析和决策提供了可靠的数据基础。 分析与诊…

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…