1、本次對比基礎環境信息如下:
springboot版本1.5.10
centos虛機4c6G,版本7.4
centos實機2u16c40G,版本7.4,虛機運行在實機上
ab版本2.3
jprofiler版本9.1.1
2、壓測接口說明
天花板:指的是一個空接口,沒有任何實現,直接返回,如
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void test() {
}
服務接口:指的是具有一定業務代碼的接口,連接數據庫/Redis然后返回json數據
異步接口:指的是開啟了http異步
3、壓測過程
JETTY
先以Jetty開始,這里通過優化參數來不斷摸底。以下是參數說明:
jettyMin:最小連接數
jettyMax:最大連接數
mvcCore:線程池core數量
mvcMax:線程池最大量
mvcQueue:線程池隊列大小
大致結果如下:
| JETTY天花板(無異步) | ||||
| jettyMin | 50 | 100 | 200 | 300 |
| jettyMax | 600 | 600 | 600 | 600 |
| mvcCore | 50 | 50 | 50 | 50 |
| mvcMax | 200 | 200 | 200 | 200 |
| mvcQueue | 100 | 100 | 100 | 100 |
| 結果 | 2090 | 2116 | 2374 | 2100 |
| JETTY天花板(無異步) | |||
| jettyMax | 400 | 600 | 800 |
| jettyMin | 200 | 200 | 200 |
| mvcCore | 50 | 50 | 50 |
| mvcMax | 200 | 200 | 200 |
| mvcQueue | 100 | 100 | 100 |
| 結果 | 1655 | 2170 | 2000 |
| JETTY天花板(異步) | |||
| jettyMax | 600 | 600 | 600 |
| jettyMin | 200 | 200 | 200 |
| mvcCore | 50 | 100 | 200 |
| mvcMax | 200 | 200 | 200 |
| mvcQueue | 100 | 100 | 100 |
| 結果 | 1500 | 1600 | 1450 |
| JETTY天花板(異步) | |||
| jettyMax | 600 | 600 | 600 |
| jettyMin | 200 | 200 | 200 |
| mvcCore | 100 | 100 | 100 |
| mvcMax | 200 | 400 | 600 |
| mvcQueue | 100 | 100 | 100 |
| 結果 | 1600 | 1700 | 1550 |
| JETTY天花板(異步) | |||
| jettyMax | 600 | 600 | 600 |
| jettyMin | 200 | 200 | 200 |
| mvcCore | 100 | 100 | 100 |
| mvcMax | 400 | 400 | 400 |
| mvcQueue | 100 | 200 | 300 |
| 結果 | 1600 | 1700 | 1600 |
以下是通過工具預估最佳線程數,然后修改優化參數的結果:
| JETTY天花板(無異步) | |||
| jettyMax | 600 | 52 | |
| jettyMin | 200 | 52 | |
| mvcCore | 52 | 52 | |
| mvcMax | 52 | 52 | |
| mvcQueue | 199 | 199 | |
| 結果 | 1520 | 1600 |
| JETTY業務接口(異步) | |||
| jettyMax | 600 | ||
| jettyMin | 200 | ||
| mvcCore | 52 | ||
| mvcMax | 52 | ||
| mvcQueue | 199 | ||
| 結果 | 1719 |
| JETTY業務接口(無異步) | |||
| jettyMax | 600 | ||
| jettyMin | 200 | ||
| mvcCore | 52 | ||
| mvcMax | 52 | ||
| mvcQueue | 199 | ||
| 結果 | 2000 |
通過以上結果發現一個問題,開啟異步HTTP后壓測的結果均不如不開啟HTTP異步的結果。
TOMCAT
通過切換成tomcat再按照以上過程壓測,發現HTTP和tomcat才是天生一對,組合壓測下的結果和Jetty不開啟異步的結果差不多。這里不再重復貼出數據表格。
UNDERTOW
通過Jetty和tomcat的壓測結果發現,HTTP異步並不一定會提升程序性能,只有在特定的條件下才會起到正面的效果,如應用服務器為非NIO時。而undertow和jetty一樣是NIO,所以這里不再對比異步非異步,直接只測非異步。優化參數只有兩個:
ioThreads:cpu核數
workerThreads:工作線程數(可以通過工具預估出來)
以下是數據。
| UNDERTOW業務接口(無異步) | |||
| ioThreads | 4 | ||
| workerThreads | 52 | ||
| 結果 | 2200 |
| UNDERTOW天花板(無異步) | |||
| ioThreads | 4 | ||
| workerThreads | 52 | ||
| 結果 | 3100 |
4、jprofiler圖標對比
jetty


tomcat


UNDERTOW


5、附最佳線程數預估工具
GITHUB地址https://github.com/sunshanpeng/dark_magic 原文博客:http://ifeve.com/how-to-calculate-threadpool-size/
Undertow使用&優化:https://www.jianshu.com/p/e625b8aa0e80
