【jmeter】dubbo connection問題

在dubbo接口性能測試時,遇到一個十分焦急的問題,即運行腳本時,線程數正常起來,但是一直沒有獲取到執行的接口數據

一直等待,直至3min時,出現返回接口請求數據,但是響應時間均大於180s,這個時候服務端並沒有流量,說明請求失敗

問題排查

  1. 併發的線程數太高導致? 將各個線程組的併發線程數都改成1,再次執行,此時仍出現以上現象

  2. jmx腳本中有15個線程組,是否多個線程組相互影響導致?將線程組改成1個,再次執行,以上現象仍然出現

  3. jmx腳本中該dubbo接口請求響應導致?將dubbo接口請求改成簡單的get請求,並同時在線程組中增加一個http請求,再次執行,http請求立馬響應,dubbo請求仍然是以上現象

  4. dubbo服務的問題導致?重啓dubbo服務,再次執行,發現一個現象,第一次請求的時候一直等待3min,接下來的請求可正常

抓包定位

在肉雞中抓包,有兩個問題點:

  1. 從發連接包到開始發數據包大概間隔3min(這個和前面體現的卡住時間一致)
105	2020-03-25 18:55:48.742387	
10.200.0.251	172.26.0.50	TCP	76	1590320880 
[SYN] Seq=0 Win=1460 Len=0 MSS=1460 SACK_PERM=1 TSval=14623866 TSecr=0 WS=256

...

92982	2020-03-25 18:58:24.766870
172.26.11.57	10.200.0.251	TCP	812	2088032265
[PSH, ACK] Seq=35 Ack=430 Win=30208 Len=744 TSval=82812964 TSecr=14779867
  1. 大概有2w+個連接包,過濾某一個服務實例的pod地址,發現有300個包,那麼就是有100個連接
    在這裏插入圖片描述

連接試驗

使用命令 netstat -anlp | grep 20880 | wc-l 查看肉雞dubbo接口連接數,連接數100
那是否一個線程組對應一個pod需要100個連接數?做了以下的實驗:

  • 2個線程組查看連接數:200
  • 1個線程組每個線程組多個請求:100
  • 2個線程組 10個實例數:2000

可以得出結論:連接數 = 線程組數 * 服務pod實例數 * 100

issue問題列表

查看issue
在這裏插入圖片描述
問題相關性不大。並不能解決我們對應的問題

插件源碼定位

查看jmeter-dubbo源碼
源碼 DubboSample類中
在這裏插入圖片描述
可以看到 public static String DEFAULT_CONNECTIONS = "100"; ,初始化CONNECTIONS=100

插件參數配置

connections配置
既然jmeter中有connections的默認值,是否在頁面中哪裏可以對該參數進行配置
在這裏插入圖片描述
在jmeter-dubbo插件中可以對該變量的設置,讓我們看看該參數的說明

The maxmium connections of every provider. 
for short connection such as rmi. 
http and hessian,it's connection limit, but for long connection such as dubbo, it's connection count.

插件參數試驗

對connection做一下配置驗證
服務1個實例,1個線程組,connection 設置40 -> 連接數40
服務2個實例,1個線程組,connection 設置40 -> 連接數80
服務2個實例,2個線程組,connection 設置10 -> 連接數40
服務2個實例,1個線程組,線程組中兩個請求sample,connection 設置40 -> 連接數80
服務1個實例,1個線程組,線程組中兩個請求sample,1個sample connection 設置40,1個 sample connection 設置25-> 連接數65

基本符合以上的設置,但是有一點,即在一個線程組中,如果connection設置不一樣,連接數爲所有sample的connection的和

dubbo connection原理

在項目初始化的時候,RegistryDirectory#refreshInvoker 會將 provider 提供的接口刷新爲 Invoker 類,如果接口未配置 connections 屬性,則使用共享連接,如使用 dubbo 協議的方式 DubboProtocol#getClients
在這裏插入圖片描述

對於同一服務來源:
如果未配置 connections 屬性,則單個消費者調用單個服務提供者之間共享一個連接,供所有接口使用
配置了 connections 屬性,則針對該接口,獨立創建配置的 n 個連接
在這裏插入圖片描述
Invoker 類如 DubboInvoker ,會持有一個連接數組 ExchangeClient[],每次調用遠程接口前,會隨機取出一個 ExchangeClient
在這裏插入圖片描述

實踐嘗試

將線程組中不需要併發執行較多線程的connect修改爲5或者10,一臺肉雞中起100個線程,服務150個實例,可正常快速啓動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章