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 為優賽工作室原創,轉載請注明出處,
