Jmeter TCP協議性能測試


最近有在做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狀態。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM