本教學課程說明如何使用 HammerDB 在 Compute Engine SQL Server 執行個體上執行負載測試。您可以透過下列教學課程瞭解如何安裝 SQL Server 執行個體:
可以使用的負載測試工具有很多。有些是免費的開放原始碼工具,有些則需要授權。HammerDB 是一項開放原始碼工具,通常很適合用來展示 SQL Server 資料庫的效能。雖然本教學課程提供的是 HammerDB 的基本使用步驟,但可以使用的工具還有很多,您應選擇最適合您工作負載的工具。
目標
本教學課程涵蓋下列目標:- 設定 SQL Server 進行負載測試
- 安裝及執行 HammerDB
- 收集執行階段統計資料
- 執行從 TPC「C」規格 (TPROC-C) 衍生而來的交易處理基準負載測試
費用
除了在 Compute Engine 上執行的現有 SQL Server 執行個體外,本教學課程還會使用 Google Cloud的計費元件,包括:
- Compute Engine
- Windows Server
Pricing Calculator 可根據您預計的使用量來產生預估費用。提供的連結可讓您查看本教學課程中所用產品的預估費用,每天平均可能為 16 美元。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- 如果您的本機電腦並非使用 Windows,請安裝第三方遠端桌面通訊協定 (RDP) 用戶端。詳情請參閱「Microsoft 遠端桌面用戶端」。
設定 SQL Server 執行個體以進行負載測試
開始之前,請務必檢查 Windows 防火牆規則是否已設定為允許來自新建立 Windows 執行個體 IP 位址的流量。接著,透過下列步驟為 TPCC 負載測試建立新資料庫並設定使用者帳戶:
- 在 SQL Server Management Studio 中,以滑鼠右鍵點選「Databases」資料夾,然後選擇「New Database」。
- 將新的資料庫命名為「TPCC」。
- 將資料檔案的初始大小設為 190,000 MB,並將記錄檔的初始大小設為 65,000 MB。
點選省略號按鈕,將「自動成長」限制設為較高的值,如下方螢幕截圖所示:
將資料檔案設為會以 64 MB 的幅度無限制成長。
將記錄檔設為停用自動成長。
按一下 [OK] (確定)。
在「New Database」(新增資料庫) 對話方塊的左側窗格中,選擇 [Options] (選項) 頁面。
將「相容性層級」設為「SQL Server 2022 (160)」。
將「復原模式」設為「簡單」,以免載入作業填滿交易記錄。
按一下 [OK] (確定) 以建立 TPCC 資料庫,這可能需要幾分鐘才能完成。
預先設定的 SQL Server 映像檔僅有啟用 Windows 驗證,因此您需要依照這個指南在 SSMS 內啟用混合模式驗證。
按照這些步驟,在資料庫伺服器上建立具有 DBOwner 權限的新 SQL Server 使用者帳戶。請將帳戶命名為「loaduser」,並設定安全的密碼。
使用
Get-NetIPAddress指令列記下 SQL Server 內部 IP 位址,因為使用內部 IP 對於效能和安全性非常重要。
安裝 HammerDB
您可以直接在 SQL Server 執行個體上執行 HammerDB。然而,為了要讓測試更加準確,請另外建立 Windows 執行個體並遠端測試 SQL Server 執行個體。
建立執行個體
按照下列步驟建立新的 Compute Engine 執行個體:
前往 Google Cloud 控制台的「建立執行個體」頁面。
在「Name」(名稱) 中輸入
hammerdb-instance。在「機器設定」部分,選取的機型 CPU 數量至少要達到資料庫執行個體的一半。
在「Boot disk」(開機磁碟) 部分,按一下「Change」(變更),然後執行下列操作:
- 在「Public images」(公開映像檔) 分頁中,選擇 Windows Server 作業系統。
- 在「Version」(版本) 清單中,按一下「Windows Server 2022 Datacenter」。
- 在「開機磁碟類型」清單中,選取「標準永久磁碟」。
- 按一下「Select」(選取) 來確認開機磁碟選項。
如要建立並啟動 VM,請按一下 [Create] (建立)。
安裝軟體
準備就緒後,請使用 RDP 用戶端連線至新的 Windows Server 執行個體,並安裝下列軟體:
執行 HammerDB
安裝 HammerDB 後,執行 hammerdb.bat 檔案。HammerDB 不會顯示在「開始」選單的應用程式清單中。請透過下列指令執行 HammerDB:
C:\Program Files\HammerDB-VERSION\hammerdb.bat將 VERSION 替換為已安裝的 HammerDB 版本。
建立連線與結構定義
在應用程式執行時,首先設定連線以建構結構定義。
- 按兩下「Benchmark」面板上的 [SQL Server]。
- 選取「TPROC-C」。
摘錄自 HammerDB 網站:
TPROC-C 是在 HammerDB 中實作的 OLTP 工作負載,衍生自 TPROC-C 規格,並經過修改,可在任何支援的資料庫環境中,以簡單且經濟實惠的方式執行 HammerDB。HammerDB TPROC-C 工作負載是衍生自 TPROC-C 基準標準的開放原始碼工作負載,因此無法與已發布的 TPROC-C 結果比較,因為這些結果符合 TPROC-C 基準標準的子集,而非完整標準。HammerDB 工作負載 TPROC-C 的名稱是指「衍生自 TPC『C』規格的交易處理基準」。
按一下「確定」。
按一下「結構定義」,然後按兩下「選項」。
使用 IP 位址、使用者名稱和密碼填寫表單,如下圖所示:
將 SQL Server ODBC 驅動程式設為適用於 SQL Server 的 ODBC 驅動程式 18
在本例中,「倉庫數量」 (規模) 設為 460,但你可以選擇其他值。部分指南建議每個 CPU 應有 10 到 100 個倉庫。就本教學課程來說,請將此值設為核心數的 10 倍:16 核心的執行個體就設為「160」。
如要建立結構定義的虛擬使用者,請選擇介於用戶端 vCPU 數量 1 到 2 倍之間的數字。您可以點選滑桿旁的灰色長條來增加數值。
清除「使用 BPC 選項」
按一下「確定」。
在「結構定義建構」部分下方,按兩下「建構」選項,即可建立結構定義並載入表格。完成後,按一下畫面正上方的紅色手電筒圖示來刪除虛擬使用者並移至下個步驟。
如果您使用 Simple 復原模式建立資料庫,此時可能想將模式改回 Full,以便更準確地測試實際運作情境。您必須先執行完整或差異備份,觸發新的記錄鏈啟動,這項變更才會生效。
建立驅動程式指令碼
HammerDB 使用驅動程式指令碼自動化調度管理 SQL 陳述式至資料庫的流程以產生所需負載。
- 在「Benchmark」(基準) 面板中,展開 [Driver Script] 部分,並按兩下 [Options] (驅動程式指令碼)。
- 認設定符合您在 [Schema Build] (結構定義建構) 對話方塊中使用的設定。
- 選擇「Timed Driver Script」。
- [Checkpoint when complete] (完成後選項核點) 會強制資料庫在測試結束時將一切資訊寫入磁碟,因此請只在您要連續執行多次測試時,再勾選這個選項。
- 為確保測試能完整執行,請將「Minutes of Rampup Time」(查核時間 (分鐘)) 設為 5,並將「Minutes for Test Duration」(測試時間長度 (分鐘)) 設為 20。
- 按一下 [OK] (確定) 以結束對話方塊。
- 在「Benchmark」面板的「Driver Script」區段中,按兩下 [Load]以啟動驅動程式指令碼。
建立虛擬使用者
建立與實際情況類似的負載,通常需要有多位不同的使用者來執行指令碼。請為測試建立幾位虛擬使用者。
- 展開「虛擬使用者」部分,然後按兩下「選項」。
- 如果將倉庫數量 (規模) 設為 160,則請將虛擬使用者設為 16,因為 TPROC-C 指南建議採用 10 倍比率,以避免資料列鎖定。請選取 [Show Output] 核取方塊,以啟用主控台的錯誤訊息。
- 按一下 [OK] (確定)。
收集執行階段統計資料
HammerDB 和 SQL Server 無法輕鬆為您收集詳細的執行階段統計資料。雖然這些統計資料就藏在 SQL Server 中,但需要定期擷取與計算來取得。如果您還沒有程序或工具來擷取這項資料,可以使用本節中的程序,在測試期間擷取一些實用指標。結果會寫入 Windows temp 目錄中的 CSV 檔案。您可以使用「貼上特殊內容」>「貼上 CSV」選項,將資料複製到 Google 試算表。
如要使用這項程序,您必須先暫時啟用「OLE Automation Procedures」,才能將檔案寫入磁碟。測試完成後記得停用該程序:
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO
以下是在 SQL Server Management Studio 中建立 sp_write_performance_counters 程序所需的程式碼。開始負載測試前,您需要在 Management Studio 執行此程序:
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/***
LogFile path has to be in a directory that SQL Server can Write To.
*/
CREATE PROCEDURE [dbo].[sp_write_performance_counters] @LogFile varchar (2000) = 'C:\\WINDOWS\\TEMP\\sqlPerf.log', @SecondsToRun int =1600, @RunIntervalSeconds int = 2
AS
BEGIN
--File writing variables
DECLARE @OACreate INT, @OAFile INT, @FileName VARCHAR(2000), @RowText VARCHAR(500), @Loops int, @LoopCounter int, @WaitForSeconds varchar (10)
--Variables to save last counter values
DECLARE @LastTPS BIGINT, @LastLRS BIGINT, @LastLTS BIGINT, @LastLWS BIGINT, @LastNDS BIGINT, @LastAWT BIGINT, @LastAWT_Base BIGINT, @LastALWT BIGINT, @LastALWT_Base BIGINT
--Variables to save current counter values
DECLARE @TPS BIGINT, @Active BIGINT, @SCM BIGINT, @LRS BIGINT, @LTS BIGINT, @LWS BIGINT, @NDS BIGINT, @AWT BIGINT, @AWT_Base BIGINT, @ALWT BIGINT, @ALWT_Base BIGINT, @ALWT_DIV BIGINT, @AWT_DIV BIGINT
SELECT @Loops = case when (@SecondsToRun % @RunIntervalSeconds) > 5 then @SecondsToRun / @RunIntervalSeconds + 1 else @SecondsToRun / @RunIntervalSeconds end
SET @LoopCounter = 0
SELECT @WaitForSeconds = CONVERT(varchar, DATEADD(s, @RunIntervalSeconds , 0), 114)
SELECT @FileName = @LogFile + FORMAT ( GETDATE(), '-MM-dd-yyyy_m', 'en-US' ) + '.txt'
--Create the File Handler and Open the File
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OACreate OUT
EXECUTE sp_OAMethod @OACreate, 'OpenTextFile', @OAFile OUT, @FileName, 2, True, -2
--Write the Header
EXECUTE sp_OAMethod @OAFile, 'WriteLine', NULL,'Transactions/sec, Active Transactions, SQL Cache Memory (KB), Lock Requests/sec, Lock Timeouts/sec, Lock Waits/sec, Number of Deadlocks/sec, Average Wait Time (ms), Average Latch Wait Time (ms)'
--Collect Initial Sample Values
SET ANSI_WARNINGS OFF
SELECT
@LastTPS= max(case when counter_name = 'Transactions/sec' then cntr_value end),
@LastLRS = max(case when counter_name = 'Lock Requests/sec' then cntr_value end),
@LastLTS = max(case when counter_name = 'Lock Timeouts/sec' then cntr_value end),
@LastLWS = max(case when counter_name = 'Lock Waits/sec' then cntr_value end),
@LastNDS = max(case when counter_name = 'Number of Deadlocks/sec' then cntr_value end),
@LastAWT = max(case when counter_name = 'Average Wait Time (ms)' then cntr_value end),
@LastAWT_Base = max(case when counter_name = 'Average Wait Time base' then cntr_value end),
@LastALWT = max(case when counter_name = 'Average Latch Wait Time (ms)' then cntr_value end),
@LastALWT_Base = max(case when counter_name = 'Average Latch Wait Time base' then cntr_value end)
FROM sys.dm_os_performance_counters
WHERE counter_name IN (
'Transactions/sec',
'Lock Requests/sec',
'Lock Timeouts/sec',
'Lock Waits/sec',
'Number of Deadlocks/sec',
'Average Wait Time (ms)',
'Average Wait Time base',
'Average Latch Wait Time (ms)',
'Average Latch Wait Time base') AND instance_name IN( '_Total' ,'')
SET ANSI_WARNINGS ON
WHILE @LoopCounter <= @Loops
BEGIN
WAITFOR DELAY @WaitForSeconds
SET ANSI_WARNINGS OFF
SELECT
@TPS= max(case when counter_name = 'Transactions/sec' then cntr_value end) ,
@Active = max(case when counter_name = 'Active Transactions' then cntr_value end) ,
@SCM = max(case when counter_name = 'SQL Cache Memory (KB)' then cntr_value end) ,
@LRS = max(case when counter_name = 'Lock Requests/sec' then cntr_value end) ,
@LTS = max(case when counter_name = 'Lock Timeouts/sec' then cntr_value end) ,
@LWS = max(case when counter_name = 'Lock Waits/sec' then cntr_value end) ,
@NDS = max(case when counter_name = 'Number of Deadlocks/sec' then cntr_value end) ,
@AWT = max(case when counter_name = 'Average Wait Time (ms)' then cntr_value end) ,
@AWT_Base = max(case when counter_name = 'Average Wait Time base' then cntr_value end) ,
@ALWT = max(case when counter_name = 'Average Latch Wait Time (ms)' then cntr_value end) ,
@ALWT_Base = max(case when counter_name = 'Average Latch Wait Time base' then cntr_value end)
FROM sys.dm_os_performance_counters
WHERE counter_name IN (
'Transactions/sec',
'Active Transactions',
'SQL Cache Memory (KB)',
'Lock Requests/sec',
'Lock Timeouts/sec',
'Lock Waits/sec',
'Number of Deadlocks/sec',
'Average Wait Time (ms)',
'Average Wait Time base',
'Average Latch Wait Time (ms)',
'Average Latch Wait Time base') AND instance_name IN( '_Total' ,'')
SET ANSI_WARNINGS ON
SELECT @AWT_DIV = case when (@AWT_Base - @LastAWT_Base) > 0 then (@AWT_Base - @LastAWT_Base) else 1 end ,
@ALWT_DIV = case when (@ALWT_Base - @LastALWT_Base) > 0 then (@ALWT_Base - @LastALWT_Base) else 1 end
SELECT @RowText = '' + convert(varchar, (@TPS - @LastTPS)/@RunIntervalSeconds) + ', ' +
convert(varchar, @Active) + ', ' +
convert(varchar, @SCM) + ', ' +
convert(varchar, (@LRS - @LastLRS)/@RunIntervalSeconds) + ', ' +
convert(varchar, (@LTS - @LastLTS)/@RunIntervalSeconds) + ', ' +
convert(varchar, (@LWS - @LastLWS)/@RunIntervalSeconds) + ', ' +
convert(varchar, (@NDS - @LastNDS)/@RunIntervalSeconds) + ', ' +
convert(varchar, (@AWT - @LastAWT)/@AWT_DIV) + ', ' +
convert(varchar, (@ALWT - @LastALWT)/@ALWT_DIV)
SELECT @LastTPS = @TPS,
@LastLRS = @LRS,
@LastLTS = @LTS,
@LastLWS = @LWS,
@LastNDS = @NDS,
@LastAWT = @AWT,
@LastAWT_Base = @AWT_Base,
@LastALWT = @ALWT,
@LastALWT_Base = @ALWT_Base
EXECUTE sp_OAMethod @OAFile, 'WriteLine', Null, @RowText
SET @LoopCounter = @LoopCounter + 1
END
--CLEAN UP
EXECUTE sp_OADestroy @OAFile
EXECUTE sp_OADestroy @OACreate
print 'Completed Logging Performance Metrics to file: ' + @FileName
END
GO
執行 TPROC-C 負載測試
在 SQL Server Management Studio 中,使用下列指令碼執行收集程序:
Use master Go exec dbo.sp_write_performance_counters
請在您安裝 HammerDB 的 Compute Engine 執行個體中,使用 HammerDB 應用程式來啟動測試:
- 在「Benchmark」(基準) 面板中,按兩下「Virtual Users」(虛擬使用者) 下方的 [Create] (建立) 以建立虛擬使用者,如此將會啟動「Virtual User Output」(虛擬使用者輸出) 分頁。
- 按兩下 [Create] (建立) 項正下方的 [Run] (啟動)。
- 測試完成後,您會在「Virtual User Output」分頁標籤中看到「每分鐘交易數」(TPM) 的計算結果。
- 您可以在
c:\Windows\temp目錄中找到收集程序的結果。 - 將這些值儲存到 Google 試算表,並利用這些值來比較多次測試。
清除所用資源
完成教學課程後,您可以清除所建立的資源,這樣資源就不會繼續使用配額,也不會產生費用。下列各節將說明如何刪除或關閉這些資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除執行個體
如要刪除 Compute Engine 執行個體:
- 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
- 勾選要刪除的執行個體核取方塊。
- 如要刪除執行個體,請依序點選 「More actions」(更多動作) 和「Delete」(刪除),然後按照指示操作。
後續步驟
- 查看 SQL Server 最佳做法指南。
- 探索 Google Cloud 的參考架構、圖表和最佳做法。歡迎瀏覽我們的 Cloud Architecture Center。