1. 程式人生 > 其它 >(七)使用 Jmeter 壓測Dubbo

(七)使用 Jmeter 壓測Dubbo

壓測思路:

壓測consumer的Controller,呼叫provider暴露的介面。

provider做1w次迴圈,生成隨機數做累加。

provider再把consumer的入參無處理返回給consumer。

1、準備

使用的工具:

1、gc視覺化工具:https://gceasy.io

2、壓測工具:jmeter5.1(其他版本不相容dubbo)

3、jmeter 外掛,在jmeter官網可以找到,主要用來獲取響應時間、TPS 引數

4、ServerAgent外掛,jmeter的官方監測工具,用於收集伺服器的CPU、磁碟、頻寬、記憶體 引數。

5、jmeter整合dubbo外掛,可以直接使用dubbo://

協議呼叫 provider

序列化:

dubbo協議預設為hessian2,rmi協議預設為java,http協議預設為json

使用 jmeter 官方自帶的 servergent 收集伺服器資訊:

[root@GZSB-CJB-SHH10-8-LASTMILE-32 ServerAgent-2.2.3]# ./startAgent.sh 
INFO    2021-11-25 14:06:18.483 [kg.apc.p] (): Binding UDP to 4444
INFO    2021-11-25 14:06:19.490 [kg.apc.p] (): Binding TCP to 4444
INFO    2021-11-25 14:06:19.497 [kg.apc.p] (): JP@GC Agent v2.2.3 started

consumer程式碼:

   @DubboReference(version = "*", protocol = "dubbo,hessian", loadbalance = "random",retries = 0)
   private StressTestService stressTestService;
    
   @RequestMapping("/stressTest/string1k")
    public Boolean string1k(){
        // IO操作讀取1k資料
        String s = new FileCapacity().getFileCapacity(1*1024);
        String result = stressTestService.StressString1k(s);
        log.info("stressTest/string1k:{},num:{}",result.length(),a);
        return true;
    }

2、Jmeter壓測情況

環境:

provider:

jdk:1.8

2h4g

CentOS release 6.4 (Final)
model name      : QEMU Virtual CPU version 2.5+
stepping        : 3
cpu MHz         : 2099.998
cache size      : 4096 KB

宿主機頻寬 :

1G 

jvm引數:

-server -Xmx2g -Xms2g -Xmn256m -Xss256k -XX:+UseG1GC 
-Xloggc:/data/dubboStress/logs/dubbo_gc_thrift.log -XX:+PrintGC -XX
:+PrintGCDetails

jmeter引數:

20個併發執行緒1s內發出,持續 10分鐘

需要提前設定一些收集的引數:

cpu、記憶體、磁碟IO、networkIO需通過 servergent 進行收集。

本次試驗是不以壓滿provider為目標,只是單純測試 10分鐘的情況。

均採取 dubbo2.7.13+hessian2 ,壓測10分鐘,20併發,結果如下:

1K 100K
樣本(請求數) 1298522 79450
TPS 2164.2 ,1min到瓶頸
132.4 ;
響應時間比例 90% 10ms;95% 11ms 99% 18ms,avg 8ms
90% 213ms;95% 227ms ;99% 288ms
CPU 伺服器 CPU:32%,記憶體 : 21.6 %
%CPU 26.0 ; %MEM 16.5
IO
NetWork 2 800 000 1 200 000
吞吐量
gc 1 sec 62 ms 490 ms

windows執行可能會遇到 Adress bind already use ,因為windows的埠回收比較慢,樣本大的時候無法及時提供埠,因為jmeter每一個執行緒都需要開啟一個socket埠和consumer通訊,需要自行修改登錄檔修改。

可以看到 100k 資料的時候,dubbo的響應時間很慢、tps也低。

consumer ping provider 延遲差不多是7ms

同機房延遲是 0.2ms

provider 在 1k 和 100k 的top:

  • 1k
Tasks: 118 total,   1 running, 117 sleeping,   0 stopped,   0 zombie
Cpu0  : 23.6%us, 16.7%sy,  0.0%ni, 57.6%id,  0.3%wa,  0.0%hi,  1.7%si,  0.0%st
Cpu1  :  5.0%us,  7.7%sy,  0.0%ni, 87.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924680k total,  3201900k used,   722780k free,   318184k buffers
Swap:  2097144k total,       64k used,  2097080k free,  1186712k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       
19560 root      20   0 3834m 826m  13m S 33.3 21.6   0:43.04 java    
  • 100k
top - 09:49:23 up 528 days, 17:07,  4 users,  load average: 0.16, 0.29, 0.21
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu0  : 16.1%us,  2.1%sy,  0.0%ni, 80.7%id,  0.0%wa,  0.0%hi,  1.1%si,  0.0%st
Cpu1  :  8.1%us,  1.3%sy,  0.0%ni, 90.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3924680k total,  2971000k used,   953680k free,   320012k buffers
Swap:  2097144k total,       64k used,  2097080k free,  1185236k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       
29635 root      20   0 4713m 632m  12m S 26.0 16.5   3:49.77 java

3、總結

以上僅僅對consumer呼叫,而再發起對provider的呼叫,而非直接使用dubbo協議直接呼叫provider。測試了一下,兩者區別較大,畢竟前者多了一層consumer,如圖:

(上述用的是思路一,思路二需要自行安裝dubbo外掛)

但思路一和使用 ab 測試結果差別不大,而且jmeter還可以生成很多圖表,各位可以嘗試一下。


參考: