1.压力测试的概念

压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等

2.压力测试的目的

1)给出系统当前的性能状况

2)定位系统性能瓶颈或潜在性能瓶颈

3.压力测试工具(Jmeter)

1)安装:Apache JMeter - Download Apache JMeter

2)使用:下载对应的压缩包,解压运行 jmeter.bat 即可(注意:JDK版本最好是8,太高可能启动不了)

3)JMeter 压测示例:        

        a)大家如英文界面,可以改为中文        

  b)   右击TestPlan添加线程组

 线程组参数详解:
1)线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里
也就是设置多少个线程数。
2) Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果
线程数为 10,准备时长为 2,那么需要 2 秒钟启动 10 个线程,也就是每秒钟启动 5 个
线程。
3)循环次数:每个线程发送请求的次数。如果线程数为 10,循环次数为 100,那么每个线
程发送 100 次请求。总请求数为 10*100=1000 。如果勾选了“永远”,那么所有线程会
一直发送请求,一到选择停止运行脚本。

4) Delay Thread creation until needed:直到需要时延迟线程的创建。
5)调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为
永远)
6) 持续时间(秒):测试持续时间,会覆盖结束时间
7) 启动延迟(秒):测试延迟启动时间,会覆盖启动时间
8)启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前
时间也会覆盖它。
9) 结束时间:测试结束时间,持续时间会覆盖它。

加粗的几个参数比较重要

        c)添加http请求

请求内容

d)添加监听器,一般使用红框中的三个就够了 

查看结果数:

汇总报告:

聚合报告和汇总报告差不多,我就不解释了

4.性能调优

给你一段代码,结合整个项目如何优化这个代码?

//获取当前一级分类下的子分类 

 @Overridepublic Map<String, List<Catelog2Vo>> getCatalogJson() {List<CategoryEntity> list = this.list(null);//查出一级菜单List<CategoryEntity> categorys = this.list(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));Map<String, List<Catelog2Vo>> collect1 = categorys.stream().collect(Collectors.toMap((k) -> {return k.getCatId().toString();}, (v) -> {List<CategoryEntity> categoryEntity2 = getParent_cid(list, v.getCatId());List<Catelog2Vo> catelog2Vos = categoryEntity2.stream().map((obj) -> {Catelog2Vo catelog2Vo = new Catelog2Vo();catelog2Vo.setCatalog1Id(v.getCatId().toString());catelog2Vo.setId(obj.getCatId().toString());catelog2Vo.setName(obj.getName());List<CategoryEntity> catelog3Vo = getParent_cid(list, obj.getParentCid());List<Catelog2Vo.Catalog3Vo> collect = catelog3Vo.stream().map((vo3) -> {Catelog2Vo.Catalog3Vo catelo3Vo = new Catelog2Vo.Catalog3Vo();catelo3Vo.setName(vo3.getName());catelo3Vo.setId(vo3.getCatId().toString());catelo3Vo.setCatalog2Id(obj.getCatId().toString());return catelo3Vo;}).collect(Collectors.toList());catelog2Vo.setCatalog3List(collect);return catelog2Vo;}).collect(Collectors.toList());return catelog2Vos;}));return collect1;}

优化手段:

1)调整日志输出级别为error

2)开启thymeleaf缓存(前后端分离项目忽略)

3)动静分离,将静态资源交个nginx来处理

4)优化代码本身,减少与DB交互的次数,优化后代码:

//获取当前一级分类下的子分类
public Map<String, List<Catelog2Vo>> getCatalogJsonForDB() {List<CategoryEntity> list = this.list(null);//查出一级菜单List<CategoryEntity> categorys = this.list(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));Map<String, List<Catelog2Vo>> collect1 = categorys.stream().collect(Collectors.toMap((k) -> {return k.getCatId().toString();}, (v) -> {List<CategoryEntity> categoryEntity2 = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));List<Catelog2Vo> catelog2Vos = categoryEntity2.stream().map((obj) -> {Catelog2Vo catelog2Vo = new Catelog2Vo();catelog2Vo.setCatalog1Id(v.getCatId().toString());catelog2Vo.setId(obj.getCatId().toString());catelog2Vo.setName(obj.getName());List<CategoryEntity> catelog3Vo = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", obj.getCatId()));List<Catelog2Vo.Catalog3Vo> collect = catelog3Vo.stream().map((vo3) -> {Catelog2Vo.Catalog3Vo catelo3Vo = new Catelog2Vo.Catalog3Vo();catelo3Vo.setName(vo3.getName());catelo3Vo.setId(vo3.getCatId().toString());catelo3Vo.setCatalog2Id(obj.getCatId().toString());return catelo3Vo;}).collect(Collectors.toList());catelog2Vo.setCatalog3List(collect);return catelog2Vo;}).collect(Collectors.toList());return catelog2Vos;}));return collect1;}private List<CategoryEntity> getParent_cid(List<CategoryEntity> categoryEntities,Long parentCid) {List<CategoryEntity> collect = categoryEntities.stream().filter((obj) -> {return obj.getParentCid() == parentCid;}).collect(Collectors.toList());return collect;}

5)  给where后面的字段创建索引(parent_cid)

create index idx_pid on pms_category(parent_cid)

6)设置JVM的参数(大一些)

7)加入本地缓存(Map),代码:

  //获取数据带有map的缓存public Map<String, List<Catelog2Vo>> getCatalogJsonForMapCache() {Map<String,Object> map = new HashMap<>();Map<String, List<Catelog2Vo>> cache = (Map<String, List<Catelog2Vo>>) map.get("catalogJson");if (cache==null){List<CategoryEntity> list = this.list(null);//查出一级菜单List<CategoryEntity> categorys = this.list(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));Map<String, List<Catelog2Vo>> collect1 = categorys.stream().collect(Collectors.toMap((k) -> {return k.getCatId().toString();}, (v) -> {List<CategoryEntity> categoryEntity2 = getParent_cid(list,v.getCatId());List<Catelog2Vo> catelog2Vos = categoryEntity2.stream().map((obj) -> {Catelog2Vo catelog2Vo = new Catelog2Vo();catelog2Vo.setCatalog1Id(v.getCatId().toString());catelog2Vo.setId(obj.getCatId().toString());catelog2Vo.setName(obj.getName());List<CategoryEntity> catelog3Vo = getParent_cid(list,obj.getParentCid());List<Catelog2Vo.Catalog3Vo> collect = catelog3Vo.stream().map((vo3) -> {Catelog2Vo.Catalog3Vo catelo3Vo = new Catelog2Vo.Catalog3Vo();catelo3Vo.setName(vo3.getName());catelo3Vo.setId(vo3.getCatId().toString());catelo3Vo.setCatalog2Id(obj.getCatId().toString());return catelo3Vo;}).collect(Collectors.toList());catelog2Vo.setCatalog3List(collect);return catelog2Vo;}).collect(Collectors.toList());return catelog2Vos;}));map.put("catalogJson",collect1);}   //查出所有菜单return cache;}

8)加入redis缓存

    //使用了redis缓存获取数据@Overridepublic Map<String, List<Catelog2Vo>> getCatalogJson() {String jsonData = stringRedisTemplate.opsForValue().get("jsonData");if (jsonData==null){Map<String, List<Catelog2Vo>> catalogJsonForDB = getCatalogJsonForDB();stringRedisTemplate.opsForValue().set("jsonData",JSON.toJSONString(catalogJsonForDB));return catalogJsonForDB;}return JSON.parseObject(jsonData, new TypeReference<Map<String, List<Catelog2Vo>>>(){});}

用redis做也会出现很多问题:比如缓存击穿,缓存雪崩,缓存穿透,关于这些大家可以参考我的这篇博客:

redis缓存雪崩,缓存穿透,缓存击穿_handsomeyxl的博客-CSDN博客

以及使用分布式锁(Redisson)所来解决问题,参考我的博客:

Redis分布式锁(不使用会出现哪些问题)_handsomeyxl的博客-CSDN博客

当然还有更多优化:比如线程池,异步编排,大家有兴趣可以了解一下

这篇文章希望对你有帮助,有问题私信一起交流!

Jmeter压力测试和性能调优相关推荐

  1. golang笔记09--go语言测试与性能调优

    golang笔记09--go语言测试与性能调优 1 介绍 2 测试与性能调优 2.1 测试介绍 2.2 代码覆盖率和性能测试 2.3 使用pprof进行性能调优 2.4 测试http服务器(上) 2. ...

  2. 8、go语言:测试与性能调优

    1.测试: 程序应该多做测试,少做调试 传统测试 VS 表格驱动测试(go语言使用) //传统测试 @Test public void testAdd(){assertEquals(3,add(1,2 ...

  3. golang学习笔记——测试与性能调优

    测试 longestString/longestString.go package main//Nonrepeating : method of double points(双指针法) func No ...

  4. linux mysql io压力大_MySQL性能调优(四) Linux 磁盘IO

    1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...

  5. Apache Jmeter压力测试与性能监控,监测cpu、内存、磁盘、网络

    1.官网下载Jmeter 解压,bin目录下 Windows 运行jmeter.bat .Linux运行jmeter.sh 2.jmeter-plugins-manager 插件 测试机下载放置Jme ...

  6. j2ee性能调优之最小化资源压力测试法则

    摘要:我提倡使用最小化资源的方式做一次压力测试,排除大部分浅显的应用问题.最小资源的意思,即在pc环境,使用应用可以运行的最小资源状态下,进行压力测试和性能问题侦测的工作. 前面看到有人讲j2ee的性 ...

  7. JMeter压力测试与JVM监控以及调优

    一.性能指标 -★ 响应时间(Response Time: RT) 响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响 应结束,整个过程所耗费的时间. HPS(Hits Per ...

  8. 压力机测试软件,一个典型的测试压力机的性能调优过程

    原标题:一个典型的测试压力机的性能调优过程 性能测试过程中,不仅仅是对被测系统的性能问题定位.分析.优化,很多时候负责批量请求发起的压力机也存在各类性能瓶颈.毕竟用几千块钱的机器就想把几个亿的机器压瘫 ...

  9. Linux操作系统的性能将主要取决于,高校邦Linux操作系统安全与性能调优章节测试答案...

    高校邦Linux操作系统安全与性能调优章节测试答案 答案: 更多相关问题 银行风险中的国家风险不包括().A.政治风险B.市场风险C.社会风险D. 银行业从业人员在使用本行电子技术设备时可以().A. ...

最新文章

  1. 思科:全球近75%的物联网项目失败
  2. mysql5.6.4以下不支持多个字段类型为timestamp
  3. 【控制】《多智能体机器人系统信息融合与协调》范波老师-第7章-基于 Markov 对策的多 Agent 协调
  4. Lua——循环和流程控制(if,for,while,break,goto,repeat...until)
  5. Spring 管理Bean(获取Bean,初始化bean事件,自动匹配ByName······等)
  6. 用python实现打开虚拟机_如何使用python从虚拟机读取文件
  7. java合并sheet行_java poi Excel循环合并行
  8. C#winform抓取百度,Google搜索关键词结果
  9. Nginx+Tpmcat 负载均衡
  10. 如何使用ITEXTSHARP将HTML代码字符串写进PDF
  11. 浙江午饭9月17~18日杭州聚会详细计划
  12. rcnn fastrcnn fasterrcnn总结
  13. 用于NIR-II成像的小分子染料(CH1055)
  14. 笔记-MFC更换鼠标图片
  15. 十一黄金周旅游线路排行榜(图文)
  16. 移远EC200T模块应用移植
  17. 【科普贴】I2C通讯协议详解——偏软件分析和逻辑分析仪实例分析
  18. 一个极佳的编程语言练习项目
  19. 进程和线程的联系和区别(沥血推荐)
  20. HashMap和有序LinkedHashMap实现对比

热门文章

  1. 与友人论“女子与小人”书
  2. 操作MySQL数据库的sql语句是否区分大小写?
  3. Python中的浅拷贝与深拷贝
  4. [除草]BZOJ 2548 灭鼠计划
  5. 未来图灵发布《AI明星企业家热搜榜》
  6. linux 安装RabbitMQ 教程
  7. 算法学习笔记22:贪心算法
  8. SpringBoot中使用mybatis/ibatis日志打印sql
  9. HC-05蓝牙模块主从配对设置步骤记录
  10. 微信群里设置签到任务,从而活跃群气氛!