1.概述
對應用系統來說資料庫性能的好壞直接影響應用系統的性能,對於資料庫進行性能測試能更加準確地分析識別資料庫是否可以有效地承受來自多個用戶的並發訪問。因此,資料庫性能測試對應用系統性能有重要意義,在應用系統的測試工作中,將資料庫作為一個獨立的部分進行充分測試,能更準確地發現資料庫相關問題並做出相關優化,為應用系統的質量增加可靠的保障。
1.1.資料庫性能測試
資料庫性能測試是在確定的環境下針對壓測需求進行的一種測試,通過自動化測試工具模擬多種正常、峰值或者異常等負載條件來對資料庫的各項性能指標進行測試。目的是通過資料庫性能測試,測試是否滿足負載需求,找到優化資料庫並提高其性能的方法,對資料庫的完善和進一步開發有著指導作用。
資料庫性能測試需要使用相關的工具,我們調研了以下開源/免費和商業的資料庫性能測試工具(開源軟體數據來自於GitHub,統計截至2020/2/21):
資料庫性能測試相關的開源軟體中,Apache基金會開源的JMeter、sysbench星級排名靠前,HammerDB是資料庫事務處理性能委員會TPC組織下的資料庫性能測試工具,所以本文選取了星級排名前兩名的JMeter、sysbench和HammerDB。另外,本文還調研了Oracle員工開發的針對Oracle的資料庫基準性能測試工具SwingBench和商業軟體LoadRunner。
1.2.測試指標
對資料庫性能測試結果進行分析需使用以下監控指標:並發數、響應時間、吞吐量。此外,資料庫伺服器上的監控指標也能輔助進行結果分析:CUP使用率、內存使用率。
2.工具簡介
2.1.Jmeter
2.1.1.簡介
JMeter是Apache基金會開源的基於Java實現的壓力測試工具,提供如下功能:1.對不同類型的應用/服務等進行性能測試;2.支持圖形化介面和命令行模式;3.對性能測試結果提供圖形分析功能;4.對於高負載施壓的場景,支持部署分布式環境。JMeter作為一款開源軟體,擴展性強,具有強大的開源社區支持,社區內開發者活躍程度高。
JMeter涉及到的主要組件如下:測試計劃、取樣器、前置處理器、配置元件、後置處理器、斷言、監聽器、邏輯控制器。
JMeter運行時,主要有以下步驟:1.通過配置組件,進行數據、環境準備;2.利用取樣器模擬用戶請求;3.控制運行,使用線程組來設置運行場景,利用邏輯控制器來控制業務(實際上即是控制取樣器);4.收集結果,利用斷言來驗證測試結果,利用監聽器來收集顯示測試結果。
2.1.2.資料庫性能測試
JMeter需要運行在Java 8以上的,能正確運行Java的作業系統均可安裝JMeter。JMeter支持的資料庫如下:hsqldb、Oracle、DB2、MySQL、Microsoft SQL Server、PostgreSQL、H2、MariaDB、Sybase AES等。JMeter進行資料庫性能測試的步驟如下:
1.創建測試計劃、線程組:線程組指示JMeter模擬的用戶數量,發送請求的循環次數或請求持續的時間等。
2.添加JDBC連接池配置元件:進入JDBC連接配置頁面,配置資料庫連接信息,如資料庫URL、JDBC驅動類、資料庫用戶名、密碼、資料庫連接池連接數等屬性。
3.添加JDBC採樣器:在線程組元素上添加JDBC請求採樣器,在JDBC請求採樣器中配置連接池信息、SQL執行類型、SQL語句、SQL參數等。測試可以使用參數來替換不同的插入記錄或者查詢語句、查詢條件等,參數可以使用簡單的隨機字符串或隨機數,或者準備參數化文件,讀取文件中的參數值。
4.壓測調試:添加結果樹,用於進行調試結果查看,並將線程數和循環次數設置為比較小的值。調試運行時,要對JDBC請求發送內容、響應內容和結果進行查看,判斷請求是否成功。調試運行完成後查看結果樹內容。
5.壓測運行:在運行測試之前需將聚合報告監聽器添加到測試計劃元素或線程組元素之下,聚合報告提供性能測試的匯總聚合結果。然後在線程組元素中進行壓測運行設置,按測試需求進行並發用戶數和運行時間等設置。壓測設置準備完成後,啟動場景。
測試結束後可以查看到性能測試的相關指標:
請求數、響應時間(平均、最大、最小、90%、95%、99%)、請求失敗率、吞吐量(每秒請求數)。除此之外,JMeter在添加了監控插件後,能監控到測試過程中伺服器CPU、內存、磁碟IO等監控指標。
2.2.Sysbench
2.2.1.簡介
Sysbench是一個基於LuaJIT的可自定義腳本的多線程性能測試工具,主要包括CPU、磁碟IO、內存、資料庫的性能基準測試。基準測試可以理解為針對系統的一種性能測試,基準測試不關心業務邏輯,使用Sysbench的基準測試腳本即可完成測試,數據可以由工具生成,更加簡單易於測試;除了基準測試外,Sysbench還支持自定義腳本進行性能測試。
2.2.2.資料庫性能測試
Sysbench可運行在Debian、Ubuntu、RHEL、CentOS、Fedora和macOS上,從1.0版本起放棄了對Windows的支持。1.0以後版本支持MySQL、PostgreSQL。
使用Sysbench可以進行OLTP基準測試,模擬一個簡單事務處理系統的工作負載,OLTP基準測試可以使用Sysbench自帶的Lua腳本。如果想結合應用自身的業務進行測試可以通過自定義的Lua腳本來進行測試。Sysbench自帶的Lua測試的步驟大致分為以下四個步驟:
1.準備數據:創建好需要進行測試的資料庫,使用命令行工具,通過腳本在指定資料庫中創建相關表,並插入相關的數據;下面的命令以oltp.lua為腳本,在MySQL資料庫創建了數據表sbtest1,並插入了1000條數據:
sysbench oltp.lua --oltp-table-size=1000 --mysql-user=用戶名 --mysql-host=IP --mysql-password=密碼 --mysql-port=3306 --mysql-db=sbtest prepare
2.運行測試:使用命令行工具,指定並發數對上一步創建的表和數據進行測試,測試結束後會生成測試結果;下面的命令使用10線程(--threads=10)測試60秒(--max-time=60),測試執行了10次基於主鍵的簡單查詢,1次範圍查詢,1次求和計算,1次排序查詢,1次去重加排序查詢,1次小欄位更新,1次長欄位更新,1次插入:
sysbench oltp.lua --mysql-host=IP --mysql-port=3306 --mysql-user=用戶名--mysql-password=密碼 --oltp_tables_count=1 --oltp-table-size=1000 --threads=10 --oltp-read-only=off --report-interval=10 --rand-type=uniform --time=60 run
運行後的結果如下:
......
SQL statistics:
queries performed:
read: 72282
write: 20652
other: 10326
total: 103260
transactions: 5163 (85.88 per sec.)
queries: 103260 (1717.59 per sec.)
ignored errors: 0 (0.00 per sec.)
General statistics:
total time: 60.1175s
total number of events: 5163
Latency (ms):
min: 46.34
avg: 116.28
max: 1547.41
95th percentile: 142.39
sum: 600377.93
Threads fairness:
events (avg/stddev): 516.3000/1.35
execution time (avg/stddev): 60.0378/0.04
3.清理數據:使用命令行工具,測試結束後清理創建的表和測試數據。
sysbench oltp.lua --mysql-host=IP --mysql-port=3306 --mysql-user=用戶名--mysql-password=密碼 --oltp_tables_count=1 --oltp-table-size=1000 --threads=10 cleanup
測試結束後生成的測試結構報告中主要包含以下指標:
事務總數、每秒事務數、查詢總數、每秒查詢數、響應時間(包括平均、最小、最大、95%)。
2.3.HammerDB
2.3.1.簡介
Hammerdb作為一個開源的資料庫壓力和基準測試工具,有圖形用戶介面和命令行兩種形式。支持標準的TPC-C和TPC-H兩種測試模型。TPC-C測試模擬了一個批發商的倉儲管理環境,由TPC(Transaction Processing Performance Council)事務處理性能委員會提出,TPC是一個非營利性組織,成員包括大多數資料庫產品廠商及伺服器硬體供應商。該組織定義了一系列資料庫基準,規範了資料庫在事務處理性能方面的評測標準和測評結果,是目前業界公認的評測資料庫性能的主流國際標準之一。
2.3.2.資料庫性能測試
HammerDB支持Linux和Windows系統。支持的資料庫包括Oracle, SQL Server, DB2, MySQL, MariaDB, PostgreSQL, Redis等。
1.準備測試數據:選擇要測試的資料庫類型和使用的測試基準,在Schema Build中點擊Options配置資料庫相關信息,然後點擊build開始創建基準測試資料庫。數據創建完成後,可以登錄資料庫中查詢到相關數據(如果查詢無結果,說明造數失敗,會導致後續load測試無法進行)。
2.配置測試腳本:第1步中按照創建好了測試資料庫tpcc,現在基於tpcc庫進行oltp測試。左側列表點擊Driver Script的Option,配置資料庫相關信息、測試持續時間等。在右側的Script Editor中將載入標準測試驅動程序腳本,該腳本是由左側Virtual User配置的虛擬用戶運行的腳本,用於執行基準測試,可以根據需求對腳本進行修改:
3.創建虛擬用戶,運行測試:指定虛擬用戶數,然後點擊Virtual User下的Create,創建虛擬用戶,最後Run,此時,登錄到資料庫中,可以發現有配置的虛擬用戶的線程在運行。
測試結束後可以查看到HammerDB提供的監控指標:吞吐量,單位為TPM(每分鐘事務數)。
2.4.SwingBench
2.4.1.簡介
SwingBench是基於JAVA開發的Oracle資料庫性能基準測試工具,是免費軟體。SwingBench生成負載來進行資料庫測試,最後生成相關的響應時間、事務數等測試結果圖表,有三種前端:SwingBench、CharBench、MiniBench,其中CharBench是命令行模式。
SwingBench包含6個基準測試程序:OrderEntry、SalesHistory、CallingCircle、StressTest等,可以模擬OLTP的應用場景:1.OrderEntry:進行訂單查詢、處理、下單等操作,主要用於少量表的測試;2.SalesHistory:主要用於測試基於大表(從1GB到1TB)的複雜查詢的性能;3.CallingCircle(不推薦使用):模擬在線電信應用的SQL,所有的基準測試程序都是CPU密集型;4.StressTest:用於對已知表進行insert、update和select操作測試。
此外,SwingBench還可以根據測試需求修改或新增相關的SQL來進行測試。
2.4.2.資料庫性能測試
SwingBench需要運行在Java 8之上,能正確運行Java的作業系統均可安裝SwingBench。SwingBench目前支持Oracle資料庫,支持的版本有Oracle 12c, 18c, 19c。SwingBench的資料庫測試步驟如下:
1.初始化測試數據:SwingBench按基準程序規則初始化測試數據。如OrderEntry使用oewizard程序初始化測試數據,SalesHistory使用shwizard程序初始化測試數據。根據嚮導進行配置,配置測試資料庫的連接字符串//ip/sid以及sysdba用戶的密碼。
然後進行資料庫schema配置,如表空間名稱、表空間數據文件所在路徑、選擇創建的數據量等後,SwingBench將初始化測試數據。
2.進行基準測試:運行swingbench.bat,配置相關參數資料庫的連接字符串//ip/sid、設置 insert,update ,select的比例、並發數、測試時間等,然後開始運行測試。如下圖所示:
測試結束過程中,右下角將展現測試的結果圖表:每分鐘事務數(TPM)、每秒事務數(TPS)、響應時間、資料庫CPU、每秒執行的DML數等。
2.5.LoadRunner
LoadRunner是一款發布於1993年11月的性能測試工具,作為一款歷史悠久的商業性能測試工具, LoadRunner可用於各種體系架構的負載測試,能預測系統行為評估系統性能。
但作為商業軟體,LoadRunner價格較高,安裝過程較複雜,體積大、過於笨重,在實際設計執行壓測時需要編寫相應的腳本,對使用人員來說學習成本較高,此外缺少監控告警等支持,性能測試過程中難以實時發現問題。
2.5.1.簡介
LoadRunner可劃分為如下四個部分:1.虛擬用戶生成器(VuGen):捕捉用戶業務流程,用於錄製和生成性能測試腳本;2。控制器:用於提供場景設計與場景監控,能夠實時監控腳本的運行情況;3.負載生成器:模擬用戶對伺服器發起請求;4.分析器:匯集來自各種負載生成器的日誌並格式化報告,以便可視化運行結果數據和監控數據。
2.5.2.資料庫性能測試
LoadRunner可運行在Windows 8.1(64 bit)、Windows 10(64 bit)、Windows Server 2012 R2/2016/2019(64 bit)、Red Hat系列Linux(包括Oracle Linux)、Ubuntu、SUSE Linux Enterprise Server。支持進行Microsoft SQL Server、Oracle、MySQL、Sybase、DB2等資料庫的測試。
LoadRunner可以編寫腳本進行資料庫性能測試,資料庫相關方法的列表:
資料庫性能測試主要有以下步驟:
1.連接到資料庫;使用lr_db_connect連接資料庫,該方法中指定的資料庫連接串可以通過LoadRunner內置的Connection String Generator來根據要連接的資料庫生成對應的連接串。進行性能測試時,推薦將連接資料庫步驟放到vuser_init,將斷開資料庫連接步驟放到vuser_end中。
2.通過SQL查詢獲取數據或進行插入、更新、刪除等操作,以下腳本進行了Addresses表查詢操作,然後獲取一行的Name和city值:
Action()
{
lr_db_executeSQLStatement("StepName=MyStep", "ConnectionName=MyConnection","SQLQuery=SELECT * FROM Addresses", "DatasetName=ds1", LAST);
lr_db_getvalue("StepName=MyStep", "DatasetName=ds1", "Column=Name", "Row=next",
"OutParam=nameParam", LAST);
lr_db_getvalue("StepName=MyStep", "DatasetName=ds1", "Column=city", "Row=current",
"OutParam=cityParam", LAST);
return 0;
}
3.驗證資料庫返回的值是否正確:根據需要加入檢查點,驗證資料庫操作返回的值與對比值進行比較,如下驗證了實際值city和從第2步中查詢的資料庫值是否相等:
lr_checkpoint("StepName=validateCityParam", "ActualValue={city}", "ExpectedValue={ cityParam }", "Compare=Equals", "StopOnValidationError=false", LAST);
4,斷開資料庫連接:最後需斷開資料庫連接,推薦在vuser_end中斷開連接,如下所示:
vuser_end()
{
lr_db_disconnect("StepName=myStep", "ConnectionString=Initial Catalog=MyDB;Data Source=LAB1.devlab.net;user id =sa ;password = soarnd1314;" ,"ConnectionName=MyConnection", "ConnectionType=SQL", LAST);
return 0;
}
測試結束後,LoadRunner提供了豐富的圖形化測試結果展示,如每秒事務數(TPS)、響應時間、資料庫伺服器CPU使用率、內存使用率等。
3.工具對比
對於上述工具,本文對比分析了各工具的優缺點,如下表所示:
對比項JMetersysbenchHammerDBSwingBenchLoadRunner
資料庫相關測試功能結合自身業務進行性能測試提供基準測試程序,可結合自身業務進行性能測試提供基準測試程序,可結合自身業務進行性能測試提供基準測試程序,可結合自身業務進行性能測試結合自身業務進行性能測試
系統兼容性Windows、LinuxLinux/macOS,1.0版本前支持WindowsWindows、LinuxWindows、LinuxWindows多個版本、Red Hat系列Linux、Ubuntu、SLES
支持資料庫Oracle、MySQL、Sybase、SQL Server等多種資料庫MySQL、PostgreSQL,1.0版本前支持Oracle、DrizzleOracle、MySQL、Sybase、SQL Server等多種資料庫OracleOracle、MySQL、Sybase、SQL Server等多種資料庫
易用性完善的在線文檔,使用簡單提供在線文檔,使用簡單提供在線文檔,使用簡單提供在線文檔,使用簡單完善的官方文檔,使用複雜
安全性不顯示明文資料庫密碼指定資料庫明文密碼顯示資料庫明文密碼不顯示明文資料庫密碼指定資料庫明文密碼
安裝部署簡單簡單簡單簡單複雜
圖形化展示測試結果是否是是是
測試指標完備性完備較完備不完備完備完備
是否免費是是是是否
生態及發展社區活躍度高,更新快社區活躍度高,更新快社區活躍度低,更新慢未開源,在線上資料少MicroFocus公司運營提供支持
4.總結
本文介紹了五種資料庫性能測試工具的背景和原理,並進行了工具的對比分析,對於結合自身業務進行資料庫性能測試的使用場景,JMeter在支持資料庫類型、易用性、安裝部署、生態發展等方面優勢更多;對於基準測試的使用場景,sysbench在支持資料庫類型、測試指標完備性方面弱於SwingBench,sysbench開源社區的生態發展優於三HammerDB,SwingBench由個人開發,代碼未開源,可能會出現軟體bug得不到修復、使用得不到支持等風險。因此每種工具都有自身的優勢和劣勢,大家可以針對自身需求選取合適的工具。
請關注+私信回覆:「測試」就可以免費拿到Python測試開發學習路線及軟體測試資料包,快速讓自己變強!