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

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

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

目標

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

料金

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

  • Google Compute Engine
  • Windows Server

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Platform プロジェクトを選択または作成します。

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

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

    課金を有効にする方法について

  4. ローカルマシンで Windows を使用していない場合は、FusionLabs の Chrome RDP など、サードパーティの RDP クライアントをインストールしておきます。

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 Platform コンソールで、[VM インスタンス] のページに移動します。

    [VM インスタンス] ページに移動

  2. [名前] を「hammerdb-instance」に設定します。

  3. [マシンの構成] で、データベース インスタンスに半数以上の CPU を設定します。

  4. [ブートディスク] セクションで、[変更] をクリックしてブートディスクの構成を開始します。

  5. [OS イメージ] タブで、[Windows Server 2012 R2] を選択します。

  6. [ブートディスクの種類] セクションで、[標準の永続ディスク] を選択します。

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

  8. [作成] をクリックします。

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

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

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 スプレッドシートに保存し、複数のテストの比較に使用します。

クリーンアップ

SQL Server 負荷テストのチュートリアルが終了したら、GCP で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

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

プロジェクトを削除する手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

インスタンスの削除

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

  1. GCP Console の [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. 次のチェックボックスをオンにします。 削除するインスタンス。
  3. インスタンスを削除するには、[削除] () をクリックします。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...