Spring Cloud 併發調優

2021-10-08 21:29:46 字數 2377 閱讀 5815

測試介面:登入

鏈路呼叫:nginx-->zuul-server-->[servicea,serviceb, servicec, serviced]

因為登入介面牽涉到一系列的加密校驗、許可權角色、賬號密碼驗證,所以 zuul-server 路由之後,會呼叫很多個微服務來獲取使用者資訊。

伺服器的話都是用docker啟動的容器,每個服務的記憶體大概在512m左右,另外每個服務(包括nginx)都只有1個例項。

該請求單次請求的平均響應結果為250ms。

ribbon 超時設定:

ribbon:

connecttimeout: 2000

readtimeout: 5000

sockettimeout: 2000

hystrix 設定:

hystrix:

command:

default:

execution:

isolation:

thread:

timeoutinmilliseconds: 15000

通常來說, hystrix 超時時間

1. 每秒啟動100執行緒,迴圈10次。

結果如下:

並且無法再調大執行緒數,會直接熔斷報錯。

經過資料查詢,zuul 預設的對請求採用的是訊號量隔離的方式,預設值為100,當請求量達到這個訊號量時,直接返回錯誤。因此,對於這個進行引數調整:

zuul:

semaphore:

maxsemaphores: 200

2. 調整 zuul 訊號量之後,每秒啟動200執行緒,迴圈10次。

結果如下:

可以發現,併發量上去了,但是已經會開始出現錯誤,並且伺服器的吞吐量很低。報錯依舊為 hytrix 熔斷錯誤。

最後經過檢查**發現,**中有 for 迴圈 fegin 呼叫,導致了介面本身的效能就不行。

所以,通常來說,併發量如果要求不是非常高,比如文中 200 左右即可的話,那麼基本上把 zuul 的併發訊號量調大即可,至於其他 hystrix 執行緒數、 tomcat 執行緒數之類的,預設配置基本ok,扛不住這麼高併發更大的可能性是**有問題,把**優化做好的價值是遠遠大於這種引數效能調優的,並且這種引數的調整難度相對比較大,需要考慮伺服器效能以及對於預估的併發量從而計算合理的引數。

建議的幾個調整引數的點:

1. hystrix 的線城池大小,hystrix 預設隔離策略是按執行緒方式隔離,所以調整這個執行緒池的大小,可以比較有效的在突增的高併發中扛住一定的壓力,就比如平時都是200併發,突增到300時。執行緒池大小的計算也不是隨意的,比如你預估的併發量是200,而每個介面平均的相應時間為300ms,那麼 0.3*200=60,理論上60個執行緒就足夠了,但是最好給他加一點緩衝餘地,比如多加10個執行緒,這個10你可以自己調整,考慮伺服器效能,這是為了防止突然增大的流量給個緩衝的餘地。

hystrix:

threadpool:

# default: 預設引數,作用的所有的hystrix的客戶端

default:

coresize: 70

反過來,這個執行緒數大小對於你設定 ribbon 超時時間也是有參考意義的,比如併發量200,執行緒數70,70/200=0.35 即 350ms。

2. ribbon 的超時,ribbon 的超時設定其實是把雙刃劍,如果平時併發量並不是太誇張,而且允許請求雖然慢,但是請求盡量都要有正確的返回值,那麼 ribbon 的超時時間可以設定的稍微長一點,這樣允許響應速度慢而不會觸發熔斷。但是,這樣做的風險是,如果某一天你的伺服器迎來了不可預期的請求量暴增,會導致大量的請求卡死等待響應,因為超時時間長,每個請求一定要等待這麼多時間才會出發熔斷從而報錯,那麼持續個幾十秒,伺服器上累積的等待請求就很多了,最終可能導致服務癱瘓,這是災難級的事故了。

所以,在很高併發的情況下, ribbon 超時的時間,一般 1秒 就夠了,盡快去觸發熔斷,防止服務癱瘓,當然,優化介面效能也是必不可少的。

ribbon:

connecttimeout: 2000

readtimeout: 5000

sockettimeout: 2000

3. tomcat 優化, tomcat 預設的執行緒池大小為200,可接受的等待請求數大小為100,可以調整這個引數,同樣也要視伺服器效能而定。

server:

tomcat:

maxthreads: 200

acceptcount: 100

另外還可以用 undertow 來替換 tomcat ,據說這個比 tomcat 效能要好,我沒有實踐過。

Spring Cloud 各元件調優引數

spring cloud整合了各種元件,每個元件往往還有各種引數。本文來詳細 spring cloud各元件的調優引數。tomcat配置引數 1 server 2 tomcat 3 max connections 0 預設值 4 max threads 0 預設值 hystrix配置引數 1 hys...

python併發程式設計調優 python併發程式設計

併發程式設計是我們程式設計中常用的優化程式效能的手段,能提高cpu的使用率。一般使用是多執行緒,多程序,協程 一 python的全域性解釋鎖gil 我們目前跑的python程式大多數都是在cpython上執行的。cpython是有乙個全域性解釋鎖,具體什麼意思,可以兩個方面理解 在同一時刻,只能執行...

多執行緒高併發調優

1.首先理解幾個多執行緒的概念 1 執行緒安全 保證執行緒的排程順序不變,以免引起資料不一致問題 2 執行緒同步 幾個執行緒協調同步,當幾個執行緒共享同乙份資源時,調整執行順序,當前乙個執行緒完成時,再執行下乙個 3 何為高併發 指程式在短時間內集中處理大量操作的情況,現實場景如 秒殺活動,搶票活動...