谷粒商城-性能压测

目录

压力测试-基本介绍

压力测试-JMeter安装与使用

压力测试-JMeter在windows下地址占用bug解决

性能监控-堆内存与垃圾回收

性能监控-jvisualvm使用

优化-中间件对性能的影响

优化-简单优化吞吐量测试

优化-ngixn动静分离

优化-模拟线上应用内存崩溃宕机情况

优化-优化三级分类数据数据获取


压力测试-基本介绍

1.性能指标

 性能指标主要关注:①吞吐量②响应时间③错误率

2.压力测试

 压力测试的目的发现:①是否存在内存泄漏②并发与同步

压力测试-JMeter安装与使用

JMeter下载地址:Apache JMeter - Download Apache JMeter

下载完成解压即可 ,运行JMeter

JMeter中文设置,方便我们压力测试 

 JMeter压测示例 

①添加线程组

右击TestPlan,点击添加->线程->线程组

 Ram-up时间即线程启动的时间,循环次数即一个线程执行的次数

②添加Http请求

右击线程组,选择添加->取样器->HTTP请求

 默认端口为80,可以自己选择添加参数

③添加监听器,一般添加察看结果树、汇总报告、聚合报告即可

④ 启动压测和查看结果

 平均值、最小值、最大值即响应的时间,单位为ms,标准偏差越大越不稳定

 平均值-最大值都是响应时间

 

 每次压测完点击清楚全部按键

压测gulimall.com

与百度压测结果一比会发现,标准方差太高表示不稳定,吞吐量太小

我们试着将product服务的jvm占用内存调大一些,看看测试结果

发现增大服务的jvm占用内存并由太多的提升服务的吞吐量

压力测试-JMeter在windows下地址占用bug解决

压测案例

永远勾上,Same User on each iteration不能勾选上,因此,每次循环都是同一个用户

执行压测 ,出现问题:java.net.BindException: Address already in use: connect

出现问题的原因: Windows提供给TCP/IP链接的端口为1024-5000,并且要四分钟来循环回收它们。就会导致我们在短时间内跑大量的请求时会将端口占用满了。

解决方案:

①在cmd中,输入regedit即打开注册表

②找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters文件夹

③右击Parameters,点击 新建 -> DWORD(32位)值(D) ,名称为:MaxUserPort ; 

④双击MaxUserPort,数值数据为:65534 ,选择基数十进制

⑤同理创建TCPTimedWaitDelay:30 ,windows回收端口的时间改为30s

⑥重启电脑配置才会生效

性能监控-堆内存与垃圾回收

影响性能的因素:数据库、应用程序、中间件、网络和操作系统

优化首先考虑应用属于CPU密集型还是IO密集型

JVM的内存模型

JVM的内存优化主要优化的就是堆空间

 堆空间垃圾回收的过程与流程图

Jvm中堆的垃圾回收机制说明:当系统产生了一个新的对象,需要为其分配内存空间,首先考虑的是在堆中的新生代(Eden)中能否放得下;如果放得下则直接存储,如果放不下则会进行一次快速的YGC;如果YGC之后还放不下则判断老年代能否放下,如果放得下则直接存储,如果放不下则会触发一次FullGC,FullGC之后还放不下则会报异常。

YGC的过程则是判断幸存区是否能放下旧对象,如果可以放下则直接存储,每次YGC这些对象的年龄就会增加1,到15岁时就会迁移到老年代。如果放不下则判断老年代是否能放下。

性能监控-jvisualvm使用

性能检测可以使用jconsole或者jvisualvm; jvisualvm是jconsole的升级版本推荐使用jvisualvm

jconsole的使用:

在cmd中输入jconsole命令

选择一个进程

 压测的时候可以实时的查看堆内存、线程、CPU的使用情况

 点击第一个堆则显示老年代的内存情况,点击第二个显示的是新生代,点击第三个则是幸存区

jvisualvm的使用:

①在cmd中输入jvisualvm命令

②选择线程 

③ 性能监视

④线程状态说明

运行:正在运行

休眠:线程调用了sleep()方法

等待:线程调用了wait()方法

驻留:线程池里面的空闲线程

监视:阻塞的线程,正在等待锁

jvisualvm安装插件Visual GC插件

出现问题可以参考此文:jdk安装Visual Gc,报错检查代理设置或稍后重试。服务器目前可能不可用。 您可能还需要确保防火墙不会阻塞网络通信。 您的高速缓存可能已过期。请单击“检查更新”以刷新内容。解决_摸鱼达人1314的博客-CSDN博客

 如果点击检查最新版本报如下错误

解决方案:

①打开网址:VisualVM: Plugins Centers

② 查看自己的java版本号

jdk1.8 112在40-121之间,点击链接

 复制下面的xml.gz地址

 

安装之后需要重启jvisualvm 

优化-中间件对性能的影响

访问gulimall.com请求要经过nginx、gateway等中间件才能达到product服务,相应也需要经过gateway、nginx才能达到用户浏览器。我们要测试以下中间件对服务性能的影响。

压测nginx中间件

 

docker中查看nginx占用的内存、cpu命令为 

docker stats

压测开始,查看结果

nginx是cpu密集型

压测Gateway 

压测开始,查看结果

 使用jvisualvm查看性能

 

Gateway也是CPU密接型,堆内存都用不满,调整Eden区的大小,gc的时间会缩短不少,吞吐量就又上去了 

简单服务压测 

web包下编写接口

压测开始 ,查看结果

 

压测Gateway+简单服务 

配置网关

 压测开始,查看结果

 全链路压测 

 总结:中间件越多,性能损失越大,大多都损失在网络交互了;

优化的话,买好的网卡、网线、提升网络的带宽

优化-简单优化吞吐量测试

压测首页一级菜单渲染

 

性能损失的原因:数据库、模板的数据渲染

压测三级分类数据获取

响应时间不具备参考,因为会有线程的竞争关系 

性能损失的原因: 数据库

压测首页全量数据获取

点击高级

获取首页页面全量优化一定要提高新生代的内存空间

性能损失的原因:静态资源加载 

简单优化:

①开启thymeleaf缓存

②日志级别设置为error

③ 数据库优化

主键才有索引,为parent_cid创建索引 

先查看未为parent_cid创建索引时的查询花费时间

 

平均花费时间为2s 

为parent_cid创建索引:

 

 

 

优化-ngixn动静分离

Nginx动静分离:静态资源的获取由Nginx返回,动态资源的获取由Nginx交由网关处理

将所有的静态资源放在Nginx里面,规则:/static/***所有请求都由Nginx直接返回 

动静分离步骤:

①创建static文件夹

静态资源都放到html中 

② 将静态资源上传到static文件夹中

进入到static中

点击Xshell的文件上传按钮 

将index文件夹拖入static中

 

③关闭缓存并将SpringBoot中index文件夹删除和将index.html中的路径进行替换

将script src中的路径加上/static/,ctrl+r 点击Replace All 进行替换 

同理,将img src、href等加上/static/

 

将url中的路径的加上''

 

④配置Nginx

cd /mydata/nginx/conf
ls
cd conf.d
ls
vi gulimall.conf

 所有访问/static/**的请求都去/usr/share/nginx/html下找

重启nginx 

docker restart nginx

优化-模拟线上应用内存崩溃宕机情况

动静分离配置完成之后,开启缓存,对首页全量数据访问进行压测

大量的时间会发生在Eden区的GC 

 模拟线上应用内存崩溃宕机情况

报内存溢出错误

堆Eden区内存优化

Xmx:最大堆内存大小

Xms:最小堆内存大小

Xmn:新生代内存大小

优化-优化三级分类数据数据获取

业务逻辑的优化,性能损耗的原因:数据库的交互过多

优化方案:将数据库的多次查询变成一次查询

①查询所有类目

②将通过parent_cid查询到的类目抽取成方法,通过查询到的所有类目中查询,从而达到只查询一次数据库 

选择方法,鼠标右击

点击Refactor

 

 点击Extract Method

 

 ③修改方法

压测一下 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值