Spring Boot內嵌容器支持Tomcat、Jetty、Undertow。為什么選擇Undertow?
這里有一篇文章,時間 2017年1月26日發布的:
參考
Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
文章打開比較慢,大致是一下幾點:
- spring boot 項目建立
- 如何修改 三種 內置的容器(默認是tomcat)
- 對三種配置進行測試(測試工具jmeter):此處測試分為兩種
- 簡單的String返回
- 復雜的json結果返回
- JVisualVM 查看請求過程中堆內存的變化。
- 分析結果:undertow 以微弱的優勢勝出 undertow > tomcat > jetty
- 總結:例子並不能看出undertow 有很大的優勢,但是可以看出的是,undertow 在適應新的趨勢發展和嘗試長連接(從響應頭中可以看出)的使用。
回顧
SpringBoot 內置了三種servlet 容器供大家選擇,默認的是tomcat,說明它還是大眾最多的選擇。另外,也可以看出另外兩種也還是有自己獨有的優勢。
從另一方面來說,SpringBoot 提供的默認配置也不一定正確,對於版本的使用和兼容,不一定很全,還是需要根據壓測之后才可以確定。
附 undertow 配置參考
# 設置IO線程數, 它主要執行非阻塞的任務,它們會負責多個連接, 默認設置為可用的CPU 核數
# 不要設置過大,如果過大,啟動項目會報錯:打開文件數過多
server.undertow.io-threads=16
# 阻塞任務線程池, 當執行類似servlet請求阻塞IO操作, undertow會從這個線程池中取得線程
# 它的值設置取決於系統線程執行任務的阻塞系數,默認值是IO線程數*8
server.undertow.worker-threads=256
# 以下的配置會影響buffer,這些buffer會用於服務器連接的IO操作,有點類似netty的池化內存管理。默認為 JVM 可用的最大空間
# 每塊buffer的空間大小,越小的空間被利用越充分,不要設置太大,以免影響其他應用,合適即可
server.undertow.buffer-size=1024
# 每個區分配的buffer數量 , 所以pool的大小是buffer-size * buffers-per-region
# 新版本已被廢棄
server.undertow.buffers-per-region=1024
# 是否分配的直接內存(NIO直接分配的堆外內存)
server.undertow.direct-buffers=true
undertow 和 jetty 對比
引用ref:https://www.cnblogs.com/maybo/p/7784687.html
- 都是基於NIO實現的高並發輕量級服務器。
- 對於服務器端,我們關注的重點不是連接超時時間、socket超時時間以及任務執行超時時間的配置,而是線程池配置,包括工作線程和IO線程的分配。
- Jetty 使用全局的線程配置,最小8,最大200.
- Undertow 用於IO線程數同CPU 核數,工作線程數=IO*8
- 在負載小的情況下,三款服務器都有很好的性能。
- 在負載逐漸增大的時候,jetty 因為是全局的線程池配置,會出現阻塞情況。undertow 和 tomcat 表現良好。
- tomcat 的IO線程不可通過SpringBoot 調整,而Undertow 可配置。