一、概述
對應用系統來說資料庫效能的好壞直接影響應用系統的效能,對於資料庫進行效能測試能更加準確地分析識別資料庫是否可以有效地承受來自多個使用者的併發訪問。因此,資料庫效能測試對應用系統效能有重要意義,在應用系統的測試工作中,將資料庫作為一個獨立的部分進行充分測試,能更準確地發現資料庫相關問題並做出相關優化,為應用系統的質量增加可靠的保障。
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得不到修復、使用得不到支援等風險。因此每種工具都有自身的優勢和劣勢,大家可以針對自身需求選取合適的工具。