.
一、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对老年代的回收