HammerDB を使用した SQL Server の負荷テスト


このチュートリアルでは、HammerDB を使用して Compute Engine の SQL Server インスタンスに負荷テストを実施する方法を説明します。SQL Server インスタンスをインストールする方法については、次のチュートリアルで学習できます。

利用可能な負荷テストツールは複数あります。一部はフリーのオープンソースですが、その他はライセンスが必要です。HammerDB はオープンソース ツールですが、一般的に SQL Server データベースのパフォーマンスを実証するために適切に機能します。このチュートリアルでは、HammerDB を使用するための基本的な手順に対応していますが、他にも利用可能なツールがあります。使用する特定のワークロードに最適なツールを選択してください。

目標

  • SQL Server を負荷テストのために設定する。
  • HammerDB をインストールし、実行する。
  • ランタイムの統計情報を収集する。
  • TPC-C 負荷テストを実行する。

料金

Compute Engine 上で実行される既存の SQL Server インスタンスに加えて、このチュートリアルでは、Google Cloud の課金対象となる次のようなコンポーネントを使用しています。

  • Compute Engine
  • Windows Server

料金計算ツールは予想使用量に基づいて費用の見積もりを作成できます。表示されたリンクは、このチュートリアルで使用されるプロダクトの費用の見積もりを示します。これは、1 日あたり平均 16 米ドル以上のコストがかかる可能性があります。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

  6. ローカルマシンで Windows を使用していない場合は、サードパーティのリモート デスクトップ プロトコル(RDP)クライアントをインストールします。詳細については、Microsoft リモート デスクトップ クライアントをご覧ください。

SQL Server インスタンスを負荷テスト用に構成する

開始する前に、Windows ファイアウォール ルールが、作成された新しい Windows インスタンスの IP アドレスからのトラフィックを許可するように設定されていることを、再度確認してください。次に、TPCC 負荷テスト用の新しいデータベースを作成し、次の手順を使用してユーザー アカウントを構成します。

  1. SQL Server Management Studio で [データベース] フォルダを右クリックし、[新しいデータベース] を選択します。
  2. 新しいデータベースに「TPCC」という名前を付けます。
  3. データファイルの初期サイズを 190,000 MB に、またログファイルの初期サイズを 65,000 MB に設定します。
  4. 次のスクリーンショットに示す省略記号ボタンをクリックして、[自動拡張] の制限値をより高い値に設定します。

    自動拡張の上限の設定

  5. データファイルを、64 MB ずつ無制限のサイズまで拡張されるように設定します。

  6. ログファイルの自動拡張を無効に設定します。

  7. [OK] をクリックします。

  8. [新しいデータベース] ダイアログで、左側のペインから [オプション] ページを選択します。

  9. [互換性レベル] を [SQL Server 2012 (110)] に設定します。

  10. [復旧モデル] を [単純] に設定し、負荷によってトランザクション ログがいっぱいにならないようにします。

    復旧モデルを [シンプル] に設定

  11. [OK] をクリックして、TPCC データベースを作成します。これには数分かかることがあります。

  12. 事前構成された SQL Server イメージは、Windows 認証が有効な場合にのみ表示されます。そのため、こちらのガイドに沿って、SSMS 内で混合モード認証を有効にする必要があります。

  13. こちらの手順に沿って、お使いのデータベース サーバーに DBOwner 権限がある SQL Server ユーザー アカウントを作成します。アカウントに「loaduser」という名前を付け、安全なパスワードを設定します。

  14. Get-NetIPAddress コマンドレットを使用して SQL Server の内部 IP アドレスをメモしておきます。内部 IP の使用は、パフォーマンスとセキュリティの面で重要だからです。

HammerDB のインストール

SQL Server インスタンス上で直接 HammerDB を実行することができますが、より正確にテストするため、新しい Windows インスタンスを作成してリモートで SQL Server インスタンスをテストします。

インスタンスを作成する

次の手順で新規の Compute Engine インスタンスを作成します。

  1. Google Cloud コンソールで、[インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [名前] に「hammerdb-instance」と入力します。

  3. [マシンの構成] セクションで、データベース インスタンスとして半数以上の CPU があるマシンタイプを選択します。

  4. [ブートディスク] セクションで [変更] をクリックし、次の操作を行います。

    1. [公開イメージ] タブで、Windows Server オペレーティング システムを選択します。
    2. [バージョン] リストで、[Windows Server 2012 R2] または [Windows Server 2012 R2 Core] をクリックします。
    3. [ブートディスクの種類] プルダウン リストで、[標準永続ディスク] を選択します。
    4. ブートディスクのオプションを確認するには、[選択] をクリックします。
  5. VM を作成して起動するには、[作成] をクリックします。

ソフトウェアのインストール

準備ができたら、RDP クライアントを使用して新しい Windows Server インスタンスに接続し、次のソフトウェアをインストールします。

HammerDB の実行

HammerDB をインストールしたら、hammerdb.bat ファイルを実行します。HammberDB は、[スタート] メニューのアプリケーション リストに表示されません。次のコマンドを実行して、HammerDB を実行します。

C:\Program Files\HammerDB-2.20\hammerdb.bat

接続とスキーマの作成

アプリケーションが実行されたら、最初のステップは、スキーマを構築するための接続を設定することです。

  1. [Benchmark] パネルで [SQL Server] をダブルクリックします。
  2. [TPC-C] を選択します。TPC-C とは、Transaction Processing Performance Council - Benchmark C(トランザクション処理性能評議会 - ベンチマーク C)の略です。TPC.org サイトからの引用を次に示します。
    TPC-C は、オンライン実行される、または遅延実行のためにキューに入れられる、種類と複雑さの異なる 5 つの同時トランザクションの組み合わせを含みます。データベースは 9 種類のテーブルからなり、幅広いレコードサイズと母数サイズを持ちます。TPC-C は、1 分あたりのトランザクション数(tpmC)で測定されます。
  3. [OK] をクリックします。

    TPC-C ベンチマーク オプションの設定

  4. [Benchmark] パネルで、[SQL Server] の隣にあるプラス記号(+)をクリックしてオプションを展開します。

  5. [TPC-C] の下にある [Schema Build] をクリックし、[Options] をダブルクリックします。

  6. 下の図のように、自分の IP アドレス、ユーザー名、パスワードを使用してフォームに必要事項を記入します。

    TPC-C ビルド オプションの設定

  7. [Schema] オプションでは [Updated] を選択します。これにより、より適切な構造とより優れたインデックスを持つ、優れた TPC-C スキーマが作成されます。

  8. この場合、[Number of Warehouses](規模)は 2,000 件に設定されますが、それ以上大きくする必要はありません。2,000 件のウェアハウスの作成が完了するまで数時間かかります。一部のガイドラインでは、ウェアハウスの数を 1 CPU あたり 10~100 にすることを推奨しています。このチュートリアルでは、この値をコア数の 10 倍に設定します。16 コアのインスタンスでは 160 です。

  9. [Virtual Users to Build Schema] は、クライアント vCPU 数の 1~2 倍の値を選択します。スライダーの隣にある灰色のバーをクリックすると、数値を変更できます。

  10. [OK] をクリックします。

  11. [Schema Build] セクションの下にある [Build] オプションをダブルクリックして、スキーマを作成し、テーブルを読み込みます。完了したら、画面の上部中央にある赤色灯のアイコンをクリックして仮想ユーザーを破棄し、次の手順に進みます。

Simple の復旧モデルでデータベースを作成した場合、本番環境シナリオをより正確にテストできるように、この時点で Full に戻す必要が生じることもあります。これは、完全または差分バックアップを取って新しいログチェーンの開始をトリガーするまで有効になりません。

ドライバ スクリプトの作成

HammerDB はドライバ スクリプトを使用してデータベースに対する SQL ステートメントのフローをオーケストレートし、必要な負荷を生成します。

  1. [Benchmark] パネルで、[Driver Script] セクションを展開して [Options] をダブルクリックします。
  2. 設定が、[Schema Build] ダイアログで使用した設定と一致していることを確認します。
  3. [Timed Test Driver Script] を選択します。
  4. [Checkpoint when complete] オプションをオンにすると、テスト終了時にデータベースの内容がすべてディスクに書き込まれます。そのため、複数のテストを連続して行う場合にのみオンにします。
  5. テストを確実に完遂するため、[Minutes of Rampup Time] を 5 に、[Minutes for Test Duration] を 20 に設定します。
  6. [OK] をクリックして、ダイアログを終了します。
  7. [Benchmark] パネルの [Driver Script] セクションで、[Load] をダブルクリックしてドライバ スクリプトをアクティブにします。

TPC-C ドライバ オプションの設定

仮想ユーザーの作成

一般に、現実的な負荷を作成するには、複数の異なるユーザーとしてスクリプトを実行する必要があります。そのため、テスト用に仮想ユーザーをいくつか作成します。

  1. [Virtual Users] セクションを展開して [Options] をダブルクリックします。
  2. ウェアハウス数(規模)を 160 に設定した場合、[Virtual Users] を 16 に設定します。これは TPC-C のガイドラインが、行のロックを防止するために 10 倍の比率を推奨していることによります。[Show Output] チェックボックスをオンにしてコンソールのエラー メッセージを有効にします。
  3. [OK] をクリックします。

ランタイム統計情報の収集

HammerDB および SQL Server では、詳細なランタイム統計情報は、簡単には収集されません。統計情報は、SQL Server 内部にありますが、捕捉して定期的に計算する必要があります。このデータをキャプチャするために役立つ手順やツールがまだない場合は、次の手順を利用して、テストの間にいくつかの有用な指標をキャプチャすることができます。結果は、Windows の temp ディレクトリで CSV ファイルに書き込まれます。データを Google スプレッドシートに、[特殊貼付け] > [CSV の貼付け] オプションを使用してコピーできます。

この手順を使用するには、OLE 自動プロシージャを一時的に有効にして、ファイルをディスクに書き込みます。テスト後に無効にすることを忘れないでください。

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

TPC-C 負荷テストの実行

SQL Server Management Studio で、次のスクリプトを使用してコレクション手順を実施します。

Use master
Go
exec dbo.sp_write_performance_counters

HammerDB をインストールした Compute Engine インスタンスで、HammerDB アプリケーションのテストを開始します。

  1. [Benchmark] パネルの [Virtual Users] で、[Create] をダブルクリックして仮想ユーザーを作成します。これにより、[Virtual User Output] タブがアクティブになります。
  2. [Create] のすぐ下にある [Run] をダブルクリックして、テストを開始します。
  3. テストが完了すると、[Virtual User Output] タブに 1 分あたりのトランザクション数(TPM)の計算値が表示されます。
  4. コレクション手順の結果は、c:\Windows\temp ディレクトリにあります。
  5. これらの値をすべて Google スプレッドシートに保存し、複数のテストの比較に使用します。

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

インスタンスの削除

Compute Engine インスタンスを削除するには:

  1. Google Cloud コンソールで、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. 削除するインスタンスのチェックボックスを選択します。
  3. インスタンスを削除するには、 [その他の操作] をクリックし、[削除] をクリックしてから、指示に沿って操作します。

次のステップ