通過壓測發現整個服務下所有介面的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
。
在稍複雜的介面測試下,tomcat
和underwow
的差距並沒有很大,但是tomcat
在吞吐量和cpu方面依然佔據了稍小的優勢,jetty
與前兩者存在差距。
複雜介面下吞吐量:tomcat
>undertow
>jetty
。
cpu:tomcat
>undertow
>jetty
。
從結果來看,tomcat
依然是最穩定的伺服器,而不是網上各種博主說的undertow
更優。而jetty
更適合長連線的服務,但是長連線我更傾向於選擇netty
。undertow
更適合用於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...