關於springboot的伺服器選擇

2021-10-24 02:39:08 字數 2723 閱讀 2754

通過壓測發現整個服務下所有介面的tps都不很高的樣子,在伺服器被很多個執行緒同時訪問時cpu佔用率都不很高。所以初步判定可能是web伺服器的配置問題,導致伺服器的效能沒被充分使用。下面開始進行優化。

剛開始的優化方案是準備直接進行tomcat的調優一把梭。臨時興起看了一下pom依賴。pom部分**如下:

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-tomcat

org.springframework.boot

spring-boot-starter-undertow

可以比較清晰的看出當前springboot排除了tomcat,引用了undertow作為web伺服器。

接下來是查閱資料,對三種伺服器進行對比,此處重點分析tomcat和undertow兩個伺服器:

此處對三個常用web伺服器的response的headers進行對比:

1.tomcat response headers

date →mon, 09 jan 2017 02:23:26 gmt

transfer-encoding →chunked

2 jetty response headers

date →mon, 09 jan 2017 02:29:21 gmt

transfer-encoding →chunked

3 undertow response headers

connection →keep-alive

date →mon, 09 jan 2017 02:20:25 gmt

transfer-encoding →chunked

關於undertow的基礎實現參考文章:

下面是對效能的深入分析:

「在簡單介面中,發現tomcat對於cpu的占用是最低的,而且吞吐量最高。另外jetty停止測試花費了最長的時間導致吞吐量變低。

簡單介面下吞吐量:tomcat>jetty>undertow

cpu佔用率:tomcat>jetty>undertow

在稍複雜的介面測試下,tomcatunderwow的差距並沒有很大,但是tomcat在吞吐量和cpu方面依然佔據了稍小的優勢,jetty與前兩者存在差距。

複雜介面下吞吐量:tomcat>undertow>jetty

cpu:tomcat>undertow>jetty

從結果來看,tomcat依然是最穩定的伺服器,而不是網上各種博主說的undertow更優。而jetty更適合長連線的服務,但是長連線我更傾向於選擇nettyundertow更適合用於io密集型伺服器,或者檔案伺服器使用undertow會是乙個不錯的選擇,但是在一般情況下還是老老實實的使用springboot預設的tomcat吧。」

下面是undertow配置和乙個針對配置的簡單測試:

# 設定io執行緒數, 它主要執行非阻塞的任務,它們會負責多個連線, 預設設定每個cpu核心乙個執行緒

# 不要設定過大,如果過大,啟動專案會報錯:開啟檔案數過多

#server.undertow.io-threads=2

# 阻塞任務執行緒池, 當執行類似servlet請求阻塞io操作, undertow會從這個執行緒池中取得執行緒

# 它的值設定取決於系統執行緒執行任務的阻塞係數,預設值是io執行緒數*8

#server.undertow.worker-threads=16

# 以下的配置會影響buffer,這些buffer會用於伺服器連線的io操作,有點類似netty的池化記憶體管理

# 每塊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

稍微檢視一下springboot原始碼,io-threads是在伺服器核數和2之間取最大值,worker-threads一般是io-threads的8倍。

在實測中,2核4g的機器在配置io-threads和worker-threads分別設定2,16的時候,可以啟動,但系統cpu佔用率並不高,單核占用60%,在分別設定2,400的時候cpu佔用率幾乎100%,伺服器還是可以正常執行。io-threads優化空間不高,worker-threads的最佳配置還需要進一步研究。

關於springboot的logback的配置

1 pom檔案引入jar包 dependency groupid org.springframework.boot groupid artifactid spring boot starter logging artifactid version 1.5.2.release version depe...

關於springboot開發的總結

主要針對新的專案 1 開始不要著急搞微服務,分布式,無疑會加大開發成本,拖慢開發速度,除非團隊有基礎,水平很高.2 可以按照微服務的架子進行專案開發管理,比如拆分出使用者管理模組,裝置模組,某某應用模組等等,url統一字首,建立各自的service,utils,source等等,資料庫根據業務區分字...

關於Spring boot的學習筆記

1 springboot簡介 springboot是由pivotal團隊提供的全新框架,其設計目的是用來簡化新spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。2 springboot核心功能 獨立執行spring專案。spring b...