文章目錄
JMeter - Mysql數據庫以及分佈式壓測
1.數據庫壓測
1.1 Mysql數據庫壓測基本配置
之前我們簡單介紹了HTTP請求的相關操作,這裏我們再介紹一下我們接觸比較多的DB數據庫的相關測試操作。
我們直接在之前20人線程組測試計劃下選擇JDBC Requet
。
這裏我們先不介紹這個界面配置,先在添加好的JDBC Requet
添加數據庫相關的配置組件。
這裏我們主要介紹幾個核心配置:
Max Number of connections
:最大連接數MAX wait
:最大等待時間Auto Commit
:是否自動提交事務DataBase URL
:數據庫連接地址JDBC Driver Class
:數據庫驅動,根據所對應數據庫選擇Username
:數據庫用戶名Password
:數據庫密碼
以這裏我們要測試的Mysql爲例,這裏我們需要添加一個mysql相關jar包,這個是需要注意的,否則運行測試計劃會錯誤。這裏我們可以通過最外層的測試計劃中Library
來添加我們驅動jar包,這個jar包相信Java開發的同學都清楚。
另外我們在JDBC配置中填的Variable Name of created pool
值,需要將其填入在JDBC Request
引用配置中,如下圖。另外就是我們需要編寫需要壓測的SQL語句,這裏我們就以簡單的查詢爲例。
最後我們添加上查看結果的結果樹。
運行測試計劃後,就能看到我們測試的結果啦。
另外再稍微提一句,若是我們需要測試帶有參數的SQL語句。像我們這裏需要查詢ID爲2的書籍信息,我們首先需要修改Query Type
爲預編譯的查詢語句,另外就是Parameter values
、Parameter types
分別填上參數值以及參數類型,若有多個逗號分隔即可。
1.2 數據庫測試聚合報告以及JDBC Request配置詳解
數據庫的測試也可以和我們之前HTTP測試相同,添加一個聚合報告查看更加詳細的測試結果。
添加聚合報告之後,運行測試可以看到一些我們很熟悉的指標數據。這裏詳細的可以參考之前HTTP Request
,含義相同。
這裏我們再對JDBC Request
中的配置做一個介紹:
Variable name of pool declared in JDBC connection configuration
:引用JDBC連接配置,和所需使用的JDBC Connection Configuration中配置的Variable Name Bound to Pool保持一致即可Query Type
:查詢SQL類型Parameter Values
:參數值,多個用逗號分隔Parameter Types
:參數類型,多個用逗號分隔Variable Names
:SQL執行結果變量名Result Variable Names
:結果變量名稱,將所有執行結果封裝爲一個對象進行存儲Query Timeouts
:查詢超時時間Handle ResultSet
:查詢結果集
這裏面有部分參數例如Result Variable Names等,可能需要搭配其他組件(類似Debug Sample)使用,大家可以自己查看官方文檔瞭解使用。
2.分佈式壓測
在進行分佈式壓測前,大家可以先掃一眼【JMeter - Linux環境壓測以及HTML圖形化報告】這篇文章,對Linux環境下進行壓測有一個大概的瞭解。
2.1 分佈式壓測介紹
假設我們單臺服務器可以同時支持1000個併發量,若我們需要對目標進行更多壓力的場景則無法滿足,分佈式壓測就出現了。在平時場景下我們可能只需要使用單臺機器對目標機器產生壓力,但是在真正高併發的壓測下則會因爲受限於CPU、網絡、IO等而無法達到目標壓力。這裏我們就可以使用多臺機器去向目標機器產生更大的壓力,模擬成千上萬甚至更多用戶的併發訪問。
例如我們一臺2核4G的機器可以向API Server產生1000的併發量,那我們通過分佈式壓測可以達到1000*機器數量大小的壓力。
2.2 分佈式壓測原理
分佈式壓測通常都會有一臺機器作爲Master主節點,然後其他機器作爲進行壓測操作的實際操作機器,稱爲“肉雞”、“執行機”。我們在主節點上發起壓測命令,Master節點會向其他機器發送壓測腳本,"肉雞"只需提前運行
jmeter-server
即可。測試執行完成後各臺機器會將結果數據回傳給Master進行彙總。
實現起來也十分簡單,我們點開配置文件可以看到remote_hosts
這個配置,後面實際操作時修改即可,後面會提及。
2.3 分佈式壓測相關步驟以及注意事項
我們在瀏覽【JMeter官方用戶手冊】時,可以看到下面這段話。這裏我們做一個簡單總結。
- 系統正確的端口被打開或者防火牆被關閉,如果是虛擬機可以通過
service iptables stop
直接關閉防火牆,阿里雲類似服務器在安全組上配置對應端口開放規則即可。- 所有主從客戶端都應在同一個子網下。
- 保證客戶端可以正常對服務器發送請求。
- 所有客戶端需保證相同版本JMeter以及Java,混合版本可能會導致異常錯誤。
- 給RMI設置SSL或者禁用。
- 儘可能使用內網進行壓測。
- 所有肉雞必須保證已經運行
jmeter-server
,可通過ps -ef|grep jmeter-server
查看。- JMX腳本文件只需Master機器存在即可,開始分佈式壓測Master機器會將JMX腳本指令發送給Slave機器;若腳本中包含CSV參數化操作,則需每臺機器都拷貝一份CSV文件並且路徑保持一致。
2.4 分佈式壓測常見問題
爲了接下來更順利進行分佈式壓測,這裏會將在整個壓測過程中可能出現的問題進行一個列舉和提供解決方案。
2.4.1 內存分配
[root@iZuf662mggaelpzvvwbgrkZ bin]# ./jmeter-server
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed;
error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
當我們去啓動肉雞
jmeter-server
時,可能會出現上面這個問題,根據提示我們也很容易就明白這是由於內存分配問題導致的JVM啓動失敗。這裏我們找到bin
目錄下jmeter
啓動文件中如下圖所示的HEAP
配置,修改其初始堆內存以及最大堆內存,如果配置比較低修改爲256m即可。
2.4.2 RMI密鑰
[root@iZuf662mggaelpzvvwbgrkZ bin]# ./jmeter-server
Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
這個問題,是因爲我們沒有配置RMI所需的有效密鑰。這裏我們不需要可以暫時將其禁用掉。打開
jmeter.property
找到server.rmi.ssl.disable
將其改爲true禁用SSL即可。
2.5 分佈式壓測實操
這裏我們同樣使用之前介紹HTML可視化時使用的jmx腳本文件,稍微對基本的配置進行一些修改。將整個壓測的總樣本數進行一個提升並將該文件上傳至Master節點機器,這裏Master機器就以我們Windows環境爲例。
這裏我們找到jmeter.properties
中remote_hosts
進行修改,這裏我準備了兩臺肉雞,大家資源充足或者實際壓測中可配置多臺,用逗號分隔。需保證每臺機器對應端口都開放。
另外之前說到的server.rmi.ssl.disable
也需改爲true禁用。這裏我們先將兩臺肉雞jmeter-server
啓動。
再啓動我們本地的JMeter打開我們需要進行壓測的JMX腳本文件。這裏我們可以看到這裏Remote Start
中已經有了我們之前配置的遠程服務器信息,這裏可以通過Remote Start All
去開啓壓測。
如果服務器不在同一個子網的話,在壓測過程中可能會提示連接失敗、超時等錯誤。故需要保證多個節點在同一個子網並使用內網IP地址去交互。
壓測完成後,肉雞會反饋壓測結果給主節點進行彙總。這裏我們可以看到這次分佈式壓測的結果,由於我這邊提供API服務的機器在壓測過程中被其他小夥伴誤關了,所以這裏大家可以看到這次壓測結果是存在Error
的。
另外我們也可以在本地通過CLI模式./jmeter.bat -n -t C:\Users\胖胖\Desktop\server_.jmx -r -l C:\Users\胖胖\Desktop\result.jtl -e -o C:\Users\胖胖\Desktop\temp
去達到分佈式壓測的效果。
關於JMeter
相關的內容到這裏就差不多結束了,大家可以自己動手去實踐這樣才能對其有更深刻的理解和更專業的使用。世界一直在進步,所以學習一直不能停止,希望大家有所收穫。