一、概述
對應用系統來說數據庫性能的好壞直接影響應用系統的性能,對於數據庫進行性能測試能更加准確地分析識別數據庫是否可以有效地承受來自多個用戶的並發訪問。因此,數據庫性能測試對應用系統性能有重要意義,在應用系統的測試工作中,將數據庫作為一個獨立的部分進行充分測試,能更准確地發現數據庫相關問題並做出相關優化,為應用系統的質量增加可靠的保障。
1.1.數據庫性能測試
數據庫性能測試是在確定的環境下針對壓測需求進行的一種測試,通過自動化測試工具模擬多種正常、峰值或者異常等負載條件來對數據庫的各項性能指標進行測試。目的是通過數據庫性能測試,測試是否滿足負載需求,找到優化數據庫並提高其性能的方法,對數據庫的完善和進一步開發有着指導作用。數據庫性能測試需要使用相關的工具,我們調研了以下開源/免費和商業的數據庫性能測試工具(開源軟件數據來自於GitHub,統計截至2020/2/21):
數據庫性能測試相關的開源軟件中,Apache基金會開源的JMeter、sysbench星級排名靠前,HammerDB是數據庫事務處理性能委員會TPC組織下的數據庫性能測試工具,所以本文選取了星級排名前兩名的JMeter、sysbench和HammerDB。另外,本文還調研了Oracle員工開發的針對Oracle的數據庫基准性能測試工具SwingBench和商業軟件LoadRunner。
1.2.測試指標
對數據庫性能測試結果進行分析需使用以下監控指標:並發數、響應時間、吞吐量。此外,數據庫服務器上的監控指標也能輔助進行結果分析:CUP使用率、內存使用率
二、工具簡介
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使用率、內存使用率等。
三、工具對比
對於上述工具,本文對比分析了各工具的優缺點,如下表所示:
四、總結
本文介紹了五種數據庫性能測試工具的背景和原理,並進行了工具的對比分析,對於結合自身業務進行數據庫性能測試的使用場景,JMeter在支持數據庫類型、易用性、安裝部署、生態發展等方面優勢更多;對於基准測試的使用場景,sysbench在支持數據庫類型、測試指標完備性方面弱於SwingBench,sysbench開源社區的生態發展優於HammerDB,SwingBench由個人開發,代碼未開源,可能會出現軟件bug得不到修復、使用得不到支持等風險。因此每種工具都有自身的優勢和劣勢,大家可以針對自身需求選取合適的工具。
本文轉載51測試網公眾號