目录
压力测试-基本介绍
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插件
如果点击检查最新版本报如下错误
解决方案:
①打开网址: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
③修改方法
压测一下