Jmeter接口壓測快速入門

[TOC]html


Jmeter簡介

Jmeter是Apache開源的一個使用純Java編寫的壓力測試工具,它最初是爲測試web應用程序而設計的,但後來擴展到了其餘測試功能。例如,可用於測試靜態和動態資源以及web動態應用程序的性能等。Jmeter能夠用來模擬對服務器、服務器組、網絡或對象上的重負載,以測試其強度或分析服務在不一樣負載類型下的整體性能。web

現在Jmeter是一個主流的、功能完善且強大的壓測工具,因爲是使用Java編寫的,因此具備跨平臺特性,能夠運行在Windows、Mac、Linux等操做系統上。而且支持豐富的協議,如:HTTP/HTTPS、FTP、JDBC、SOCKET、SOAP。。。等,此外還有許多第三方插件支持以及第三方集成redis

相關網址:shell


配置Jmeter的測試計劃

經過以上給出的地址將Jmeter下載好後,進入到Jmeter的bin目錄下,啓動腳本放在這個目錄,其中windows雙擊jmeter.bat便可,Mac和Linux下則是使用以下命令運行:apache

sudo sh {JMETER_HOME}/bin/jmeter.sh

初次運行可能會比較慢,啓動成功後,界面以下:
Jmeter接口壓測快速入門windows

接下來咱們看看如何使用Jmeter對接口進行壓測,我如今有一個商品列表接口,接口路徑爲:/goods/to_list緩存

想要使用Jmeter對這個接口進行壓測的話,首先右擊左邊欄的「Test Plan」(測試計劃),添加一個「Thread Group」(線程組),以下圖所示:
Jmeter接口壓測快速入門bash

接着簡單配置一下請求線程數之類的,線程數就表明着併發數:
Jmeter接口壓測快速入門服務器

由於該接口是經過HTTP請求的,因此須要添加一個HTTP請求默認值,以下圖:
Jmeter接口壓測快速入門網絡

配置接口服務的請求協議、ip地址以及端口號,這樣後面添加HTTP請求的時候就不須要重複填寫這些信息了,能夠起到一個通用配置的做用:
Jmeter接口壓測快速入門

而後添加一個HTTP請求:
Jmeter接口壓測快速入門

這裏只須要配置接口路徑以及請求方法便可,由於Jmeter會自動幫咱們拼上以前配置的HTTP請求默認值:
Jmeter接口壓測快速入門

爲了查看測試結果,還須要添加一些監聽器,監聽器有不少種,也能夠添加多個,這裏我添加了一個聚合報告:
Jmeter接口壓測快速入門

以及一個圖形結果:
Jmeter接口壓測快速入門


開始測試

在上一小節中,介紹瞭如何針對一個現有的接口配置測試計劃,按照以上步驟配置完成後以下:
Jmeter接口壓測快速入門

如今咱們就能夠開始執行這個測試計劃了:
Jmeter接口壓測快速入門

測試運行完成後,能夠在聚合報告中看到壓測的統計數據:
Jmeter接口壓測快速入門

簡單說明下這些統計指標:

  • Samples:採樣數/請求數
  • Average:平均響應時間,單位毫秒
  • Median:響應時間的一箇中間值,單位毫秒
  • 90%Line:90%的請求響應時間,單位毫秒
  • 95%Line:95%的請求響應時間,單位毫秒
  • 99%Line:99%的請求響應時間,單位毫秒
  • Min:請求最小響應時間,單位毫秒
  • Maximum:請求最大響應時間,單位毫秒
  • Error %:響應錯誤率
  • Throughput:每秒的吞吐量
  • Received KB/sec:每秒接收的數據量
  • Send KB/sec:每秒發送的數據量

若是此時查看圖形結構的話,會發現只有一點點線條,這是由於咱們將線程組的線程數設置過小了:
Jmeter接口壓測快速入門

能夠嘗試將線程數設置到1000,而後清除以前的測試報告數據:
Jmeter接口壓測快速入門

而後再運行這個測試計劃,運行完成後再打開圖形結果就能夠看到曲線圖了,以下:
Jmeter接口壓測快速入門


命令行壓測

以上小節介紹了Jmeter的基本使用,但都是基於可視化界面操做的。在某些狀況下咱們可能須要在服務器上進行測試,而絕大多數服務器系統都只有命令行。好在Jmeter支持命令行下的操做,因此本小節將介紹在命令行下如何使用Jmeter作壓測。

首先第一步是在當前的操做系統下在可視化界面上配置好測試計劃並將其存儲爲jmx文件,在這一步咱們直接將以前所演示的測試計劃另存爲jmx文件便可。「file」 -> 「Save Test Plan as」:
Jmeter接口壓測快速入門

  • Tips:jmx文件內容格式爲xml,實際上就是描述了測試計劃的配置信息,感興趣的話能夠自行打開瞧一瞧

第二步是將這個jmx文件上傳到服務器上,我這裏的操做系統是Mac OS,因此使用scp進行上傳:

scp MyWorkSpace/TestFiles/goods_list.jmx root@${server_ip}:/home/goods_list.jmx
  • Tips:若是是windows系統,可使用rz命令,直接選擇上傳的文件便可。

上傳完成後,使用Jmeter的shell腳本jmeter.sh執行該jmx文件:

[root@server ~]# cd /usr/local/apache-jmeter-5.1.1/bin/
[root@server /usr/local/apache-jmeter-5.1.1/bin]# ./jmeter.sh -n -t /home/goods_list.jmx -l /home/result.jtl

參數說明:

  • -n:非圖形界面啓動
  • -t:指定須要執行的jmx文件路徑
  • -l:指定結果文件的存儲路徑

執行該測試計劃後,想要知道壓測是否正常進行的話,可使用top命令查看系統負載。我這裏很明顯是正常執行壓測了,CPU負載達到了19.72
Jmeter接口壓測快速入門

執行結束後會輸出一些測試結果的統計信息:
Jmeter接口壓測快速入門

正常狀況下執行結束會生成一個測試結果文件,存放在咱們使用參數-l指定的路徑下。以下:
Jmeter接口壓測快速入門

最後把生成的result.jtl文件下載到本地,並導入到Jmeter中。「Aggregate Report」 -> 「Browser」 -> 「Open」:
Jmeter接口壓測快速入門

此時就能夠看到測試結果的聚合報告了:
Jmeter接口壓測快速入門


自定義變量模擬多用戶

上面兩小節咱們簡單介紹了Jmeter的基本使用,而本小節則將介紹一個在Jmeter中很實用的功能:自定義變量。有過一些測試經驗的小夥伴應該知道在不少接口的測試用例下,咱們可能須要模擬多個用戶對某一接口進行請求,這時候經過使用Jmeter裏的自定義變量就能實現這個功能。固然自定義變量不只僅是用來模擬多用戶,這裏只是舉一個實際的應用例子。

在一個線程組裏能夠添加多個HTTP請求,若是但願一次只測試一個接口的話,能夠將其餘測試請求給禁用掉。例如這裏將以前所添加的「商品列表」給禁用,右擊「商品列表」選擇「Disable」:
Jmeter接口壓測快速入門

如今我有一個能夠經過token獲取用戶信息的接口:/user/info,該接口須要接收一個參數,即用戶的登陸token。根據該接口添加一個新的HTTP請求,具體配置以下:
Jmeter接口壓測快速入門

按照如此配置,每次請求傳遞的都是同一個token,這樣就只能針對一個用戶進行測試。若要模擬多用戶,天然不能將token寫死在這裏,而是將其抽取成一個變量,這也就是所謂的自定義變量了。在Jmeter中自定義變量,首先須要添加一個「CSV Data Set Config」。以下圖所示:
Jmeter接口壓測快速入門

而後建立一個配置文件,配置文件的內容是有必定格式的,須要使用分隔符分隔,分隔符能夠是任意的可識別符號,例如我這裏使用逗號進行分隔:

$ cat config.txt
13000000001,149787a6b7986f31b3dcc0e4e857cd2a
13000000002,078563f337ec6d6fedf131ddc857db19
13000000003,7692dcdc19e41e66c6ae2de54a696b25
13000000004,0f3e84acb19dff22f695f31dbe3e972a
13000000005,268e27056a3e52cf3755d193cbeb0594
13000000006,00c66aaf5f2c3f49946f15c1ad2ea0d3

接着根據配置文件和實際需求編輯以下選項,讓Jmeter能夠從配置文件中讀取配置項:
Jmeter接口壓測快速入門

  • Tips:這裏定義的變量名中userId對應的是配置文件中的第一列,而token則是對應的第二列,以此類推。另外,分隔符必須與配置文件中的分隔符保持一致,這樣Jmeter才能正常構建變量與配置的映射關係

在使用的時候,經過${變量名}引用自定義變量便可,以下示例:
Jmeter接口壓測快速入門

這樣Jmeter就會從配置文件中讀取不一樣的token並賦值給咱們定義好的變量,那麼每次請求就能夠傳遞不一樣的token,以達到模擬多個用戶請求的效果。


在上一小節中咱們介紹過命令行下的壓測方式,但若是咱們配置的測試計劃用到了自定義變量, 且定義了配置文件的路徑。而服務器上的文件路徑確定和本地操做系統的文件路徑不同,那麼要如何更改配置文件的路徑呢?

首先將jmx文件和配置文件一併上傳到服務器上,接着打開jmx文件並查找到CSVDataSet標籤,而後將描述配置文件路徑的子標籤的值改成服務器上配置文件所在的正確路徑便可。以下圖所示:
Jmeter接口壓測快速入門


Redis壓測工具 - redis-benchmark

Redis做爲緩存中間件,其性能瓶頸會影響到系統的總體性能,因此一般咱們也須要經過壓測的方式肯定Redis服務的性能瓶頸是多少。而Redis自帶了壓測工具:redis-benchmark,本小節將簡單介紹該工具的使用。

該工具的使用也比較簡單,若是隻是作一個壓測的話,只須要使用以下命令便可:

[root@server ~]# redis-benchmark -h 127.0.0.1 -p 6379 -c 100  -n 100000

參數說明:

  • -h:指定host,即redis服務所在的ip地址
  • -p:指定端口號
  • -c:指定併發請求數量
  • -n:指定發送多少個請求

執行該命令後,控制檯會輸出相應的壓測結果。觀察輸出的信息會發現,該命令會逐個對redis的一些主要指令進行壓測,我這裏就截取了get指令的壓測結果。以下:

====== GET ======
  # 10w個請求在1.58秒內執行完畢
  100000 requests completed in 1.58 seconds
  # 100個併發客戶端
  100 parallel clients
  # 每一個請求數據包大小爲3字節
  3 bytes payload
  keep alive: 1

# 48.00%的請求耗時小於等於1毫秒
48.00% <= 1 milliseconds
# 99.66%的請求耗時小於等於2毫秒
99.66% <= 2 milliseconds
# 100%的請求耗時小於等於2毫秒
100.00% <= 2 milliseconds
# 每秒可完成63411.54個請求,即QPS
63411.54 requests per second

若是但願壓測時指定每一個請求的數據包大小可參考以下命令:

[root@server ~]# redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100

參數說明:

  • -q:表示quiet,即不輸出詳細信息,僅輸出每一個指令的QPS信息
  • -d:指定每一個請求的數據包大小,單位爲字節

若是隻想壓測指定的命令,則可使用-t參數來指定,以下示例:

[root@server ~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush  -q -n 100000

若是想壓測某條具體的指令,那麼則可使用script load來指定腳本。以下示例:

[root@server ~]# redis-benchmark -h 127.0.0.1 -p 6379 -q -n 100000 script load "redis.call('set', 'foo', 'bar')"
相關文章
相關標籤/搜索