Jmeter
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。闲来无事写了一个demo来测试并发访问下的性能。
Web程序
关键部分代码如下
@RequestMapping(value = "/jmeter")
@Controller
public class TestController {
private static Connection connection;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
//待优化:使用数据库连接池
connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=123456");
} catch (Exception e) {
e.printStackTrace();
}
}
@ResponseBody
@RequestMapping(value="/query", method = RequestMethod.GET)
public Object query(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "id", defaultValue = "0") int id) {
Map map = new HashMap();
map.put("id", id);
System.out.println(Thread.currentThread().getName() + "--" + this.hashCode() + "---" + id);
try {
Statement statement = connection.createStatement();
//数据库表中共有1000条数据,id为主键
ResultSet resultSet = statement.executeQuery("SELECT * FROM sheet0 where id = " + id);
if (resultSet.next()) {
System.out.println("success");
}
resultSet.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
启动Tomcat后访问http://localhost:8080/jmeter/query?id=395即可。
配置Jmeter
Random Variable的值设置为0-1000
在聚合报告中可以查看请求的统计情况。下图给200个线程并发时的统计数据
统计数据
线程数
平均(ms)
中位(ms)
90线(ms)
95线(ms)
99线(ms)
Min(ms)
Max(ms)
错误率
100
2
3
4
5
5
0
8
0
200
2
2
3
4
4
0
7
0
300
3
2
4
4
21
0
65
0
400
2
2
3
4
7
0
23
0
500
5
3
4
6
71
0
107
0
600
4
3
4
10
66
0
115
0
700
8
3
6
36
132
0
231
0
800
7
3
5
18
142
0
238
0
900
11
3
24
76
142
0
208
0
1000
15
3
43
104
173
0
266
0
1100
6
3
11
21
56
0
124
0
1200
69
14
236
323
446
0
693
0.23%
1300
48
5
172
257
391
0
1588
2.23%
1400
128
12
212
348
2619
0
2852
4.46%
1500
117
70
319
386
488
0
793
0.68%
1600
188
101
460
651
1372
0
1653
3.51%
7100
138
78
396
473
555
0
1235
1.61%
1800
286
204
627
745
1478
0
2717
9.16%
1900
399
258
754
1132
4293
0
5070
15.45%
2000
847
343
2389
4290
7661
1
8366
26.06%
2100
1051
407
3144
5055
7925
0
9811
30.25%
2200
588
295
1393
2648
4391
0
5507
21.64%
2300
1242
455
4254
6766
14442
0
15221
31.02%
2400
1077
429
4304
4789
7903
0
8547
29.08%
2500
1456
505
4483
7858
8195
0
14988
34.73%
由统计数据可见,当并发线程数在1100个以下时,请求的成功率及95线等指标均比较正常,性能并没有很大的问题。当并发线程数量超过1200个时,错误率和95线等指标急剧上升。可见,正确预估web系统的QPS对于集群中机器的部署数量有直接的指导意义。以下几张图为测试过程中jconsole的监测情况。
由jvm的内存使用情况可见,随着jmeter并发线程数的增加,tomcat所在的jvm中的GC频率呈增加趋势。
当Tomcat的线程数达到最大数量之后就不再增加,对于jmeter的并发请求,tomcat只能使用有限的线程来处理。
测试中使用的机器为Mac Pro2015版,CPU为Intel Core i7,内存为16GB 1600MHz DDR3
JDK版本为64-Bit 1.8.0_121-b13
Tomcat版本为 8.5.3
Jmeter版本为1.0
MySQL版本为5.7.18