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缓存

posted @ 2021-08-16 10:38  一拳超人的逆袭  阅读(56)  评论(0编辑  收藏  举报