SpringBoot 內嵌容器的比較


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 可配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM