測試介面:登入
鏈路呼叫: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 何為高併發 指程式在短時間內集中處理大量操作的情況,現實場景如 秒殺活動,搶票活動...