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
本文原始链接 http://www.cnblogs.com/umgsai/p/7252335.html 为优赛工作室原创,转载请注明出处,