1. 程式人生 > 其它 >JMeter TCP效能測試

JMeter TCP效能測試

JMeter TCP效能測試

2018-04-01 00:30youxin 閱讀(15801) 評論(0)編輯收藏舉報

jmeter是一款純java的效能測試工具,跨平臺執行方便、提供圖形化介面設定、簡單易用。

在效能測試方法論中,很典型的方法就是二八原則,量化業務需求。

二八原則:指80%的業務量在20%的時間裡完成。

如何理解,下面我們來個例子吧

使用者登入場景:早高峰時段,8:50---9:10,5000坐席上線登陸。

業務量:5000個

時間:20x60=1200秒

吞吐量=80%x業務量/(20%*時間)=4000/240=16.7/秒

而並非5000/1200=4.1/秒

實際上,登入請求數分佈是一個正態分佈,最高峰時肯定比4.1/秒更高,高峰段實際上完成了80%的業務量,卻只花了20%的時間。

溫馨提示:

1.二八原則計算的結果並非在線併發使用者數,是系統要達到的處理能力(吞吐量),初學者容易被誤導,那這這個資料就去設定併發數,這是錯誤滴。

2.如果你的系統性能要求更高,也可以選擇一九原則或更嚴格的演算法,二八原則比較通用,一般系統性能比較接近這個演算法而已,大家應該活用。

3.tps、響應時間、線上併發數三者關係詳解:點選開啟連結

三者關係圖

2. 結論

  • 小併發數區間測試,找拐點(如:100-300併發持續5分鐘,可以發現上圖中200併發時出現拐點)
  • 大併發數區間測試,找符合需求的最大併發數(如:1800-2200併發持續5分鐘,可以找到滿足響應時間在3秒內的最大併發數2000)
  • 利用最大併發數,壓測環境在極限時的資源消耗(壓測時間1小時以內)
  • 80%最大併發數,進行穩定性測試(壓測時間1小時以上)

注:執行機資源消耗必須監控上,保證能提供穩定的併發負載。

注:這裡的響應時間是90%響應時間

tps:

每秒事務處理量 -效能測試的術語介紹 TPS(Transaction Per Second) 每秒鐘系統能夠處理的交易或事務的數量。它是衡量系統處理能力的重要指標。TPS是LoadRunner中重要的效能引數指標。 1.下載安裝 僅僅需要從apache的網站找到下載包,解壓到本地檔案目錄即可。 http://jmeter.apache.org/download_jmeter.cgi 2.啟動 解壓目錄中存在一個bin的目錄,裡面有很多批處理檔案和指令碼檔案,window系統執行jmeter.bat即可。需要關注的是bin目錄中的jmeter.properties檔案,這是執行相關的配置檔案. 特別是TCP Sampler configuration部分幾個配置會和後面內容相關 3.建立一種型別測試 這裡只描述簡單的tcp測試建立步驟,因為目前支援的測試型別很多,無法一一陳述,功能細節部分可以參考JMeter文件 1)建立測試執行緒組

1. 啟動測試用介面


首先我們寫一段 php 程式碼,通過 PHP 內建的 Server 啟動它。

$user_id = $_GET['user_id'];
file_put_contents('/tmp/1.log', $user_id.PHP_EOL,  FILE_APPEND);
echo $user_id;

以上程式碼儲存為index.php

命令中執行php -S 127.0.0.1:8080

在瀏覽器訪問http://127.0.0.1:8080/index.php?user_id=1, 輸出1說明服務介面正常

2. 建立執行緒組
使用 JMeter 測試應用效能首先要建立一個執行緒組
右鍵 “Text Plan”, 在彈出的選單欄選擇 “Add->Threads(Users)->Thread Group”

就建立了一個執行緒組:

“Number of Threads (users): ” 即併發使用者數,相當於 ab 命令的 -c 引數
“Loop Count:” 迴圈請求次數,即每個執行緒請求多少次,這個資料乘以執行緒數相當於 ab 命令的 -n 引數

我們設定了 “Number of Threads (users)” 為 5 , “Loop Count” 為 60 , 相當於ab 命令

ab -c 5 -n 300 http://xxx.com

2. 建立測試請求
右鍵我們剛剛建立的執行緒組“Thread Group”, 選擇 “Add-> Sampler-> HTTP Request”

這一步相當於通過多個引數拼出要測試的介面地址。

注意Path中,${__counter(false)}為 JMeter 內建的函式, 它的返回值為當前請求次數
**這樣保證了我們每次向伺服器請求的user_id的值都不一樣 **

此時我們將要進行的測試等同於 ab 測試命令:

ab -c 5 -n 300 http://127.0.0.1/index.php?user_id=1

、_Counter函式

每次呼叫計數器函式都會產生一個新值,從1開始每次加1。計數器既可以被配置成針對每個虛擬使用者是獨立的,也可以被配置成所有虛擬使用者公用的。如果每個虛擬使用者的計數器是獨立增長的,那麼通常被用於記錄測試計劃運行了多少遍。全域性計數器通常被用於記錄傳送了多少次請求。

計數器使用一個整數值來記錄,允許的最大值為2,147,483,647。

功能:這個函式是一個計數器,用於統計函式的使用次數,它從1開始,每呼叫這個函式一次它就會自動加1,它有兩個引數,第一個引數是布林型的,只能設定成“TRUE”或者“FALSE”,如果是TRUE,那麼每個使用者有自己的計數器,可以用於統計每個執行緒歌執行了多少次。如果是FALSE,那就使用全域性計數器,可以統計出這次測試共運行了多少次。第二個引數是“函式名稱”

格式:${__counter(FALSE,test)}

使用:我們將“_counter”函式生成的引數複製到某個引數下面,如果為TRUE格式,則每個執行緒各自統計,最大數為迴圈數,如果為FALSE,則所有執行緒一起統計,最大數為執行緒數乘以迴圈數

引數:

第一個引數:True,如果測試人員希望每個虛擬使用者的計數器保持獨立,與其他使用者的計數器相區別。False,全域性計數器

第二個引數:重用計數器函式建立值的引用名。測試人員可以這樣引用計數器的值:${test}。這樣一來,測試人員就可以建立一個計數器後,在多個地方引用它的值。

以上,摘自網路(不知道怎麼用,只好摘抄,記錄下來等靈感~~~~(>_<)~~~~)。

目前,我測試_Counter函式,就是在引數列表加一個引數,值填寫為${__counter(FALSE,test)}




3.開始測試
右鍵執行緒組 “Thread Group”, 選擇 “Add-> Listener->Summary Report “, 建立一個結果報表

然後點選, 選單欄中的綠色按鈕, 開始測試:

結果如圖:

開啟 ‘/tmp/1.log’ 可以看到,每次請求的 user_id的值都是不同的。

Thread Group(執行緒組)

1.執行緒組,或者可以叫使用者組,進行效能測試時的使用者資源池。

2.是任何一個測試計劃執行的開始點。

3.上一篇提到的“控制器”和“HTTP請求”(採集器)必須線上程組內;監聽器等其他元件,可以直接放在測試計劃下。

https://www.cnblogs.com/linglingyuese/archive/2013/03/06/linglingyuese-three.html

https://www.cnblogs.com/hait1234/p/6767212.html

二、Thread Group執行緒組功能分割槽

總的來說,一個執行緒組有三個功能分割槽,這裡分別標註為區域1、區域2、區域3。

1.區域1:在取樣器錯誤後要執行的動作,這個區域的主要作用很明顯,線上程內的取樣器失敗後,接下來做什麼。

(1)繼續:選擇此項,將繼續執行接下來的操作。

(2)Start Next Loop:忽略錯誤,執行下一個迴圈。

(3)停止執行緒:退出該執行緒(不再進行此執行緒的任何操作)。

(4)停止測試:等待當前執行的取樣器結束後,結束整個測試。

(5)Stop Test Now:直接停止整個測試。(注意與4的“停止測試”進行區分)。

2.區域2:執行緒屬性,這裡可以設定執行緒數(模擬的使用者數)和迴圈次數。含義如下圖所示:

ramp up:斜坡上升; [動詞短語] 加強,加大;

相當於warmup的一個詞,包含準備,熱身,加速的意思,可用在生產中小批量的試製中, 也可以指人初入公司的鍛鍊. 在專案初始階段要做許多準備工作。

3.區域3:排程器配置(全部都在排程器複選框被選中的前提下,下面的選項才會生效。)

最重要的Tcp Sampler:tcp取樣器

TCPClient classname

TCP Sampler提供了3個Sampler的實現,分別是

org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl

org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl和
org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl。

其中TCPClientImpl實現了以文字編輯器中所編輯的純文字為內容進行傳送,BinaryTCPClientImpl則以文字編輯器中所編輯的16進位制字元(hex)內容為基礎轉換為二進位制的位元組內容進行傳送,LengthPrefixedBinaryTCPClientImpl則會在BinaryTCPClientImpl基礎上預設以傳送內容的長度以位元組字首進行填充。

我們可以通過配置jmeter.properties檔案中tcp.handler屬性來設定預設的TCPClient。

測試基於文字套接字應用

被測應用的原始碼請參見這裡. 如果想執行該程式,請點選該連結下載socket_echo-0.0.1-SNAPSHOT.jar,並且在命令列下執行:

https://github.com/XMeterSaaSService/Blog_sample_project/tree/master/socket_echo

(javac 和java可以去掉包名後再在命令列執行)

java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.TextServer

這個程式原始碼:
View Code
(這個程式測試:

注意幾圖:hello後面有個換行, ENDof line Byte value 填寫的是10.

LF (NL line feed, new line) 換行鍵 ,ascill是10.
os.println("Echo: " + line); 用的是println,服務端返回的最後是一個換行符。
如果不填寫EOF byte value,那麼客戶端將會一直阻塞沒有返回。

我們發現EOL原來是與讀資料相關的,就是設定來自於伺服器資料流的一個結束標識位元組。沒有設定EOL將會一直讀到輸入流結束為止。

這裡值得注意的是,這是個十進位制的值(千萬不要寫成hex),比如你可以查詢ASCII表,來確認一個表示結束字元的十進位制值,我們以$作為案例,改造一下Mock TCP Server,輸出結尾為$,如下面程式碼:

)




(請確保您的機器上已經安裝了Java)。 該程式會在4700埠建立一個ServerSocket,等待來自客戶端的請求,客戶端如果傳送了一個字串,伺服器端返回“Echo: “ + 客戶端傳送的字串。如下圖所示,如果我們使用telnet連線到伺服器端的套接字應用,雙方就可以直接進行通訊了。


TCPClientImpl

我們使用TCPClientImpl對Mock TCP Server進行測試,配置參考下圖:

點選執行測試,你會發現測試發生了阻塞,原因是伺服器使用了readLine獲取客戶端的傳送資料,需要根據傳送資料中的CRLF(\r或\n)判斷一行的結束。而我們製作的傳送內容並不包括CRLF標識內容,因此,伺服器阻塞在了讀資料,測試客戶端得不到伺服器響應,同樣也阻塞在了讀資料,正確的配置需要新增一個“回車”(不能是”\r”或”\n”,因為TCPClientImpl會自動將其轉換為對應的兩個字元而不是CRLF標識)參考下圖

TCP 取樣器通過TCP/IP來連線特定伺服器,連上伺服器之後傳送訊息,然後等待伺服器回覆。

如果“Re-use connection”(重複使用連線) 複選框被選中了,在同一個執行緒中Samplers(取樣器)共享連線,包含相同主機名和埠,不同主機/埠合併將會使用不同執行緒。如果“Re-use connection” 和 “Close connection”(關閉連線)同時被選中,這個套接字在執行完當前Samplers將會關閉。再下一個Sampler將會另外建立一個新套接字。你可能想要在每次執行緒迴圈結束之後關閉套接字。

如果一個錯誤被檢測到或者“Re-use connection” 沒有被選中,這個套接字將會關閉,另外套接字將會在接下Samplers被再一次開啟。

詳細看這篇文章:

Apache JMeter TCPSampler的使用及自定義

還有這篇文章:https://www.jianshu.com/p/63e08071075e

JMeter-----TCP Sampler(TCP 取樣器)

jmeter報告結果中會出現三個時間

1.Elapsed time 經過的時間(= Sample time = Load time =Response time)

這個時間是我們測試常用的時間,也是整個請求的消耗時間,從傳送到接收完成全程消耗的時間

2.Latencytime 延遲時間

不常用,表示請求傳送到剛開始接收響應時,這個時間<Elapsed time

3. Connection time 建立連線時間 (2.13新增引數)

不常用,請求連線建立的時間,這個時間 <Latencytime <Elapsed time