Jmeter TCP協議效能測試

白加黑呀發表於2020-08-01

最近有在做tcp協議效能測試,總結一下遇到的坑吧。

 

 

 首先呢,我這邊用的是16進位制的報文:

(1)TCPClient classname:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl

TCPClient classname 該引數一般有三個值設定:

  • org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl(以文字編輯器中的純文字作為內容傳送)
  • org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl(以文字編輯器中所編輯的16進位制字元(hex)內容為基礎轉換為二進位制的位元組內容進行傳送)
  • org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl(在BinaryTCPClientImpl基礎上預設以傳送內容的長度以位元組字首進行填充)

(2)伺服器IP和埠號:輸入要壓測的地址和埠即可 

(3)超時:

  單位毫秒,0 表示禁用超時

(4)Re-use connection:如果選中,這個連結處於保持開啟狀態,不選中就是讀取資料後就關閉。

  如果我們做TCP協議的效能測試,一個tcp連線肯定是要保持的,所以這裡需要勾選

  Close connection:如果選中,這個連線將在取樣器執行結束後關閉

  SO_LINGER:enable/disable(啟用/禁用)SO_LINGER設定特定的值,單位為秒,它線性建立套接字,如果你是設定的值為0,你可以避免大量套接字處於TIME_WAIT (等待狀態)

  EOL:匹配響應報文最後一個位元組,如果響應報文為16進位制是最後兩個字元,比如,在我的專案中返回值轉為16進位制的時候如下:

    7e80010005013819415186010103e7020000d47e
    那麼最後一個位元組 (8位)應該是 7e 換算為10進位制後為126

    那麼在eol處設定為126 ReadException: 異常消除

下面說一下遇到的一些坑:

(1)在做TCP協議的效能測試時,儘量不要使用setup執行緒組和teardown執行緒組,因為我們要保持長連線,如果在setup執行緒組中我們傳送了登入報文,線上程組中進行TCP其他報文的傳送並迴圈的話,Jmeter不會認為這兩個執行緒組是使用的同一個執行緒,導致線上程組中傳送報文時會重新發起一個連線,而此時我們沒有登入,導致場景錯誤,teardown也是如此。可以通過僅一次控制器解決這個問題

(2)行尾EOL匹配:在Jmeter處理機制中,當EOL匹配不到或者匹配值錯誤會認為這個連線失敗,即使你勾選了re-use connection,也關閉這個TCP連線,但是在實際的應用場景中,很多報文上報之後是沒有應答的,或者應答的內容是隨機的(為了安全考慮),那麼這個時候只能對Jmeter的TCP取樣器進行二次開發,改變他的內部邏輯,讓他的EOL如果無法匹配到也不會將我們的請求狀態置為500,從而被關閉TCP連線。下面一步一步講如何實現我們的需求

  1、首先我們到Jmeter官網下載原始碼版本 https://archive.apache.org/dist/jmeter/source/ 下載source版本的zip格式,博主這邊是Jmeter5.1.1,解壓到本地目錄

  2、修改目錄,這一步一定要做,不然無法匯入,

    進入解壓後的目錄,會看到兩個檔案:eclipse.classpath和eclipse.projecte,分別修改為 .classpath 和 .projecte

    在 windows 下不能直接修改,要使用 cmd 命令列;  

開啟 cmd 命令列視窗,進入解壓的原始碼目錄下,執行如下命令:
ren .eclipse.classpath .classpath
ren .eclipse.project .project

  3、匯入IDEA

    點選File -> New -> Project from Existing Sources,選擇Jmeter原始碼目錄

    選擇按 eclipse 專案匯入,如下所示:

    

 

 

     其他全部預設,一直Next即可

  4、ANT, 如果電腦沒有ANT,可以去下載一個,然後配置下環境變數即可

    在視窗右側 Ant Build 中,點選 + ,選擇原始碼目錄下的 build.xml,會把所有相關資訊展示在右側列表中,

    

 

 

     雙擊列表中的 download_jars ,會自動下載所有缺失 jar 包,到 jmeter 原始碼目錄的 lib 目錄下

  5、更新專案依賴的jar包

    在首次匯入專案時,會自動在 dependency 下新增依賴 jar 包,但都是缺失狀態,當我們用 Ant 下載好 jar 包後,IDEA 並不會自動更新,必須要手動更新。

    在專案上右鍵開啟 Open Module Settings,在專案 src 下點選 protocol 資料夾,再點選上方 Sources 按鈕,點選 Apply。

    點選 Dependencies,刪除所有報錯的 jar 包;

    重新新增新下載的 jar 包:右側 + ,選擇 JARs or directories,依次選擇原始碼目錄下的 lib 目錄和 lib 下的幾個目錄,最後 Apply :

    

 

  6、ANT install  

    重新新增 jar 包後,必須執行 Ant install。

  7、設定執行的VM options    

    JMeter 的啟動類是 NewDriver,可以先找到這個類,嘗試執行一下,肯定會報錯找不到路徑。

    因為 jmeter 啟動類中預設是去找的 parent 目錄,所以報找不到路徑,需要手動配置一下 jmeter 執行時的 home 路徑,在 VM options 中配置。

    在 VM options 填入 -Djmeter.home=C:\Users\Administrator\Desktop\apache-jmeter-5.1.1,如下所示:

    

 

 

     

 

    此時,再次執行 NewDriver,就可以正常啟動 jmeter 介面了!!

   8、此時我們搜尋TCPSample ,ctrl+n :

    

 

     點選進入這個java檔案,搜尋ReadException:

    

 

     修改紅色框內容,至於為什麼要設定為null,可以點進方法中自己看,在這就不過多說了。

  9、最後執行build:

    

 

    此時會多出一個資料夾,我們進入到資料夾中,找到編譯好的TCPSampler.class檔案

    

 

     並複製出來

  10、進入Jmeter\lib\ext的目錄下,找到ApacheJMeter_tcp.jar 這個jar包,以壓縮包形式開啟,並找到TCPSampler.class檔案,將我們修改過的class檔案拖入並替換,這樣大功告成,不會因為EOL沒有匹配到連線就會斷開,也不會置為500狀態。

 

好了今天就先講這麼多,以後有時間再給大家分享

 

相關文章