五、JMeter压力测试

一、Jmeter压力测试

注意:JMeter软件有BUG,不要点在聚合报告页面查看吞吐量数据,点在HTTP请求页面等待结束后,再切换回聚合报告页面查看吞吐量数据才是准确的

1、添加"线程组"

  • 线程数与循环次数:根据需求设置
  • 这里测试线程数1,循环次数10000

在这里插入图片描述

2、为线程组添加“HTTP请求”

在这里插入图片描述

3、配置服务器名称或IP:http://127.0.0.1

  • 端口号:80
  • 路径:http://127.0.0.1/index
  • 最后点击运行
@WebServlet("/index")
public class IndexServlet extends HttpServlet {

    private int count;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(++count);
    }
}

在这里插入图片描述

二、聚合报告

1、添加入口,如图:

在这里插入图片描述

2、聚合报告数据

  • Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
  • #Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
  • Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以- - Transaction 为单位显示平均响应时间
  • Median:中位数,也就是 50% 用户的响应时间
  • 90% Line:90% 用户的响应时间
    • Note:关于 50% 和 90% 并发用户数的含义,请参考下文
    • http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
  • Min:最小响应时间
  • Max:最大响应时间
  • Error%:本次测试中出现错误的请求的数量/请求的总数
  • Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second)
    • 当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
  • KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
    在这里插入图片描述

三、串行吞吐量

  • a)串行回收:-XX:+UseSerialGC
  • b)IDEA中JVM参数配置
    在这里插入图片描述
  • c)注释掉count打印
@WebServlet("/index")
public class IndexServlet extends HttpServlet {

    private int count;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println(++count);
    }
}

1、测试串行吞吐量-情况1

  • a)JVM参数
-XX:+PrintGCDetails -Xmx32M -Xms1M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    GC回收触发了27次,吞吐量1807/sec

2、测试串行吞吐量-情况2

  • a)JVM参数 -> 加入初始堆内存大小-Xms1M修改为-Xms32M
-XX:+PrintGCDetails -Xmx32M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    GC回收触发了9次,吞吐量1918/sec

这个也说明了之前一直强调的初始堆内存大小要与最大内存大小一致,否则就会频繁的触发GC回收

3、测试串行吞吐量-情况3

  • a)JVM参数 -> 最大堆内存大小-Xmx32M修改为-Xmx512M
-XX:+PrintGCDetails -Xmx512M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    GC回收触发了9次,吞吐量2006/sec

对比发现吞吐量也只和初始堆内存大小有关

4、测试串行吞吐量-情况4

  • a)JVM参数 -> 初始堆内存大小-Xms32M修改为-Xms512M
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    没有触发GC回收,吞吐量6635/sec

5、测试结论:

  • 垃圾回收次数以及吞吐量,与最大堆内存大小无关,只和初始堆内存大小有关
  • 堆的初始内存一定要和最大内存一致,并且堆的初始值越大,吞吐量越大

四、并行吞吐量

1、测试并行吞吐量-UseParNewGC

  • a)JVM参数
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseParNewGC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    没有触发GC回收,吞吐量6821/sec

2、测试并行吞吐量-CMS收集器

  • a)JVM参数
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC 
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    没有触发GC回收,吞吐量6939/sec

3、测试并行吞吐量-G1

  • a)JVM参数
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:PermSize=32M
  • b)JMeter测试,1线程,10000请求
  • 测试结论:
    没有触发GC回收,吞吐量6921/sec

五、调优总结

  • 初始堆值和最大堆内存内存越大,吞吐量就越高
  • 最好使用并行收集器,因为并行收集器速度比串行吞吐量高,速度快
  • 设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3
  • 减少GC对老年代的回收
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值