效能測試:壓榨一下 ServiceComb
開卷有益,關注我們
前言
本文以一個最簡單的單consumer->單producer的測試場景為例,說明了如何在指定測試環境中,通過觀察metrics統計資料,不斷調整引數壓榨出最大效能。
基本測試過程:
-
測試驅動加大壓力,TPS逐漸上升。
-
驅動壓力達到一定程度後,TPS不再上升,或是緩慢上升,甚至是下降,此時伴隨著時延明顯上升,稱之為效能拐點。
-
調整consumer/producer各種引數(網路執行緒/業務執行緒等等),提升處理能力。
-
重新調整測試驅動壓力(加大或減小),重複前面步驟。
-
輸出最終效能拐點時的各項引數,包括TPS/時延/CPU/頻寬等等。
環境確認
01
使用華為雲c3.2xlarge.2 VM
華為雲c3.2xlarge.2 VM |
|
Node1 |
192.168.26.44 |
Node2 |
192.168.29.195 |
備註:Node1 ping Node2:平均0.171ms |
02
網路
開啟網絡卡的RSS特性,執行ethtool -l eth0,得到類似下圖的資料。

如果Pre-set的Combined不等於Current的Combined,則執行ethtool -L eth0 combined {Pre-Set Combined}改為相等,在這裡應該是ethtool -L eth0 combined 4
開啟網路佇列的自動負載均衡:service irqbalance start
03
CPU
cat /proc/cpuinfo | grep name
8 Intel(R) Xeon(R) Gold 6151 CPU @ 3.00GHz
04
記憶體
dmidecode -t memory
16GB
部署
01
service center
-
下載service center
http://mirror.bit.edu.cn/apache/servicecomb/servicecomb-service-center/1.1.0/apache-servicecomb-service-center-1.1.0-linux-amd64.tar.gz
-
上傳到Node2,解壓
-
修改conf/app.conf,監聽地址設為Node2小網IP
Httpaddr = 192.168.29.195
-
啟動service center
02
編譯用例工程
-
下載原始碼
git clone https://github.com/apache/servicecomb-java-chassis.git
-
編譯
mvn clean install -Dmaven.test.skip=true
cd demo/perf
mvn install -Pdemo-run-release -Dmaven.test.skip=true
編譯時增加maven.test.skip僅僅是為了加快編譯速度。
03
Producer
-
在Node2的demo/target/perf目錄中新建microservice.yaml:
service_description:
name: perf1
servicecomb:
service:
registry:
address: http://192.168.29.195:30100
highway:
address: 192.168.29.195:7070
server:
thread-count: 1
rest:
address: 192.168.29.195:8080
server:
thread-count: 1
response-size: 1024
-
啟動:
java –jar perf*
04
測試驅動:Consumer
-
在Node1的demo/target/perf目錄中新建microservice.yaml:
service_description:
name: consumer
servicecomb:
service:
registry:
address: http://192.168.29.195:30100
highway:
address: 192.168.26.44:7070
client:
thread-count: 1
rest:
address: 192.168.26.44:8080
client:
thread-count: 1
connection:
maxPoolSize: 5
references:
transport: highway
metrics:
window_time: 1000
publisher.defaultLog:
enabled: true
endpoints.client.detail.enabled: true
-
啟動:
java –jar perf* -c
Highway
01
同步調優
Consumer的microservice.yaml中配置:
sync-count: 1
sync: true
TPS/時延/CPU/頻寬消耗都很低
此時驅動併發度才1,太低,加大驅動壓力到500
sync-count: 500
Producer CPU很低
1、TPS上升到了10多萬。
2、時延3+ms,偏高。
3、Producer本身時延並不太大,8C才用了不到2C,並且預設的2組業務執行緒中只有1組在工作(預設執行緒池,每1組與一個網路執行緒繫結)。
為充分使用網路頻寬,提升網路連線數:
Consumer:
servicecomb:
highway:
client:
thread-count: 8
Producer:
servicecomb:
highway:
server:
thread-count: 8
Producer 執行緒池排隊
1、TPS進一步提升到36萬左右。
2、Consumer時延從3+ms降低到1+ms。
3、Producer執行緒池有排隊現象,考慮擴充套件執行緒池,有2種思路,1是加大每個池中的執行緒數,1是加大執行緒組數。
因為這個效能測試場景,業務非常輕量,tps已經達到了幾十萬級別,執行緒池入隊的競爭/喚醒會比較激烈,加大執行緒數,效果並不會太好。
實際驗證也確實如此,加大執行緒數,TPS基本不變;所以這裡加大執行緒組,減小競爭概率,並且減小每組執行緒數,減少執行緒切換,Producer:
servicecomb:
executor:
default:
group: 4
thread-per-group: 2
最終效果
1、TPS提升到45萬左右,時延少量下降。
2、嘗試調整驅動併發數sync-count,從當前的500併發往下調,TPS下降,往上調,TPS基本不變,而時延上升,處於效能拐點。
02
Reactive調優
Consumer的microservice.yaml中配置:
async-count: 1
sync: false
TPS/時延/CPU/頻寬消耗都很低
1、此時驅動併發度才1,太低,加大驅動壓力到500。
2、1個併發驅動,有2條連線,是因為開始壓測前,獨立呼叫了一次,用於列印呼叫結果;從非eventloop執行緒發起reactive呼叫,會隨機選擇一個網路執行緒去建立連線。
async-count: 500
Consumer最大時延偏高,Producer CPU消耗偏低
1、該環境中RSS網路佇列只有4個,與CPU數不對等,限制了併發能力,所以Producer CPU偏低。
2、在reactive場景下,網路執行緒即業務執行緒,有任何的波動,都會導致最大時延變大。
RESTful
ServiceComb中不同transport切換,只需要修改配置,無需修改業務程式碼。
Consumer的microservice.yaml中配置:
Servicecomb:
references:
transport: rest
sync-count: 500
sync: true
01
同步調優
CPU佔用極少,時延超大
因為預設網路執行緒只有1,所以這裡需要調大網路執行緒。
Consumer:
servicecomb:
rest:
client:
thread-count: 8
Producer:
servicecomb:
rest:
server:
thread-count: 8
連線池耗時較大
1、CPU消耗正常了,TPS提升到15萬多,時延仍然較大。
2、主要消耗從連線池獲取連線,預設每個網路執行緒對每個ip:port建立5個連線,所以共建立了40條連線,而有500個併發請求,考慮擴充套件連線池。
調整連線池,TPS不變,時延少量降低
servicecomb:
rest:
client:
connection:
maxPoolSize: 15
嘗試每個池連線數為15/30/60等等,TPS在18萬左右已經達到上限。
降低驅動壓力,調整為80時已經可以達到極限TPS
servicecomb:
rest:
client:
connection:
maxPoolSize: 10
sync-count: 80
02
Reactive調優
直接調大連線池
servicecomb:
rest:
client:
connection:
maxPoolSize: 30
async-count: 500
sync: false
CPU基本耗盡,時延偏大,考慮降低驅動壓力到100。
servicecomb:
rest:
client:
connection:
maxPoolSize: 15
async-count: 100
測試結果
彙總
注:
從metrics資料中可以看到,有時os級別的cpu佔用反而小於程序級的佔用。 通過在linux中直接觀察top/htop的輸出,也有相同的現象,虛機中尤其容易出現,相對而言,物理機會好一些。再 檢視top/htop原始碼,發現htop的演算法與top還不一樣,htop的計算更容易導致詭異的計算結果。
我們在最新版本的ServiceComb中調整了輸出格式,跟top保持一致,程序級的cpu佔用按Irix模式展示,os級的cpu佔用按Solaris模式展示。
如在閱讀時有任何疑問想交流,歡迎掃碼加入進微信群。
用心做開源,不忘初衷
期待志同道合的朋友們加入
ServiceComb的大門為你們敞開~
識別二維碼
新增微服務小助手
精彩閱讀
[學習微服務-第9天]
[學習微服務-第8天]
ServiceComb內建負載均衡元件handler-loadbalance
[學習微服務第7天]
ServiceComb+SpringCloud Ribbon原始碼解讀
[學習微服務-第6天]
負載均衡之ServiceComb + SpringCloud Ribbon
[學習微服務-第5天]
[學習微服務-第4天]
[學習微服務-第3天]
[每天學習微服務-原始碼解讀]
[每天學習微服務-閘道器]
關注我們
知識就是力量
長按識別二維碼
緣分,或許就在“好看”裡

點 擊“ 閱讀原文 ”給 ServiceComb點個“Star”吧