最近有在作tcp協議性能測試,總結一下遇到的坑吧。java
首先呢,我這邊用的是16進制的報文:apache
(1)TCPClient classname:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImplwindows
TCPClient classname 該參數通常有三個值設置:安全
(2)服務器IP和端口號:輸入要壓測的地址和端口便可 服務器
(3)超時:eclipse
單位毫秒,0 表示禁用超時tcp
(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鏈接。下面一步一步講如何實現咱們的需求
一、首先咱們到Jmeter官網下載源碼版本 https://archive.apache.org/dist/jmeter/source/ 下載source版本的zip格式,博主這邊是Jmeter5.1.1,解壓到本地目錄
二、修改目錄,這一步必定要作,否則沒法導入,
進入解壓後的目錄,會看到兩個文件:eclipse.classpath和eclipse.projecte,分別修改成 .classpath 和 .projecte
;
在 windows 下不能直接修改,要使用 cmd 命令行;
打開 cmd 命令行窗口,進入解壓的源碼目錄下,執行以下命令:
ren .eclipse.classpath .classpath
ren .eclipse.project .project
三、導入IDEA
點擊File -> New -> Project from Existing Sources,選擇Jmeter源碼目錄
選擇按 eclipse 項目導入,以下所示:
其餘所有默認,一直Next便可
四、ANT, 若是電腦沒有ANT,能夠去下載一個,而後配置下環境變量便可
在窗口右側 Ant Build
中,點擊 + ,選擇源碼目錄下的 build.xml,會把全部相關信息展現在右側列表中,
雙擊列表中的 download_jars
,會自動下載全部缺失 jar 包,到 jmeter 源碼目錄的 lib 目錄下
五、更新項目依賴的jar包
在首次導入項目時,會自動在 dependency 下添加依賴 jar 包,但都是缺失狀態,當咱們用 Ant 下載好 jar 包後,IDEA 並不會自動更新,必需要手動更新。
在項目上右鍵打開 Open Module Settings
,在項目 src 下點擊 protocol 文件夾,再點擊上方 Sources 按鈕,點擊 Apply。
點擊 Dependencies,刪除全部報錯的 jar 包;
從新添加新下載的 jar 包:右側 + ,選擇 JARs or directories,依次選擇源碼目錄下的 lib 目錄和 lib 下的幾個目錄,最後 Apply :
六、ANT install
從新添加 jar 包後,必須執行 Ant install。
七、設置運行的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 界面了!!
八、此時咱們搜索TCPSample ,ctrl+n :
點擊進入這個java文件,搜索ReadException:
修改紅色框內容,至於爲何要設置爲null,能夠點進方法中本身看,在這就不過多說了。
九、最後執行build:
此時會多出一個文件夾,咱們進入到文件夾中,找到編譯好的TCPSampler.class文件
並複製出來
十、進入Jmeter\lib\ext的目錄下,找到ApacheJMeter_tcp.jar 這個jar包,以壓縮包形式打開,並找到TCPSampler.class文件,將咱們修改過的class文件拖入並替換,這樣大功告成,不會由於EOL沒有匹配到鏈接就會斷開,也不會置爲500狀態。
好了今天就先講這麼多,之後有時間再給你們分享