17.压力测试
JMeter压力测试工具
安装
200个线程,在一秒钟之内全部启动完,循环100次
测试我们自己的网站
有一个提高的方法是可以增加模块的占用内存属性
Address Already in use错误
测试的时候会占用端口
打开注册表,修改windows配置文件
新建这两个dword值,表示预留端口65534个,每隔30秒回收一个端口
配置完以后重启计算机
JVM内存调优P144
堆的GC:
YGC:快,伊甸园区的内存不够触发
Full GC:慢,老年区内存不够触发,我们要尽量避免Full GC
jvisualvm工具的使用
控制台直接打出命令jvisualvm,这是一个jdk自带的工具
线程的状态
休眠:sleep
等待:wait
驻留:线程池的空闲线程
监视:阻塞的线程,正在等待锁的线程
工具里安装可用插件GC
安装完之后需要重启
mataspace是元空间,gc不关心,该图说明GC很健康,每次伊甸园区有垃圾都gc清除掉了
优化过程
在nginx下放一个首页
显示gulimall
查看中间件Nginx的配置
同时使用docker stats命令查看nginx的cpu使用率情况
开始测试后发现ngnix浪费的cpu比较多,但是内存并不多
nginx性能指标聚合报告:
现在来单压一下网关
因为网关没有页面,所以返回没有json数据,异常百分百
我们发现中间件单独使用性能都很不错
来单压一下简单服务
测试一下网关+简单服务,让hello过一下网关
压网关的hello请求
可以看到吞吐量大幅下降了,并且99%和95%的毫秒数大幅上升了,过一个中间件性能损失还是非常大的。
结论一:中间件越多,性能损失越大:网络之间的IO交互损失大
接下来nginx+hello+gateway
变得更低了
接下来就不结合中间件来压了
页面一级渲染
三级分类显示,主要问题存在于这里
优化
- SQL耗时越小越好,一般情况下微秒级别
- 命中率越高越好,一般情况下不能低于95%
- 锁等待次数越低越好,等待时间越短越好
- 中间件越多,性能损失越大,大多都损失在网络交互了
Nginx动静分离
静态资源直接由nginx返回,不去访问后台服务器
指定规则:/static/**所有请求都由nginx直接返回
原来的static资源现在统一放在该目录下
页面修改,所有引用静态资源的地方加上/static
修改nginx配置之前已经做了
jvm调优:
最大1024,默认1024,伊甸园区1024不让他进行频繁的Full GC
优化三级分类接口:
@Override public Map<String, List<Catalog2Vo>> getCatelogJson() { List<CategoryEntity> entityList = baseMapper.selectList(null); // 查询所有一级分类 List<CategoryEntity> level1 = getByParentCid(entityList, 0L); Map<String, List<Catalog2Vo>> parent_cid = level1.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> { // 拿到每一个一级分类 然后查询他们的二级分类 List<CategoryEntity> entities = getByParentCid(entityList, v.getCatId()); List<Catalog2Vo> catelog2Vos = null; if (entities != null) { catelog2Vos = entities.stream().map(l2 -> { Catalog2Vo catelog2Vo = new Catalog2Vo(v.getCatId().toString(), l2.getName(), l2.getCatId().toString(), null); // 找当前二级分类的三级分类 List<CategoryEntity> level3 = getByParentCid(entityList, l2.getCatId()); // 三级分类有数据的情况下 if (level3 != null) { List<Catalog3Vo> catalog3Vos = level3.stream().map(l3 -> new Catalog3Vo(l3.getCatId().toString(), l3.getName(), l2.getCatId().toString())).collect(Collectors.toList()); catelog2Vo.setCatalog3List(catalog3Vos); } return catelog2Vo; }).collect(Collectors.toList()); } return catelog2Vos; })); return parent_cid; } //不经过数据库优化后的方法 private List<CategoryEntity> getByParentCid(List<CategoryEntity> entityList, long l) { List<CategoryEntity> list = entityList.stream().filter(i -> { return i.getParentCid() == l; }).collect(Collectors.toList()); return list; }
可以看到吞吐量大幅上升了
汇总:网上找的,一般是拿另外一台机器来压数据比较准确
最牛逼的系统性能提升还得是我redis缓存