SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server のクエリ実行テストをする際に実行タイミングの調整

leave a comment

先日、JMeter で SQL Server の負荷テスト (2018/08 版) という投稿を書きましたが、クエリの実行タイミングの調整もテストを実施する中でポイントとなってきそうなのでこの辺をまとめておきたいと思います。
基本の内容としては、次の内容を見ておくとよいかと。


スレッド生成タイミングの調整
初期設定で作ると次のような設定になるかと。
image

  • Number of Threads (users)
    • テストを実施する際のスレッド数
  • Ramp-Up Period (in seconds)
    • 何秒の期間をかけてそのスレッド数を生成するか
  • Loop Cout
    • 繰り返し数
  • Delay Thread creation until needed
    • スレッド生成のタイミングの調整
    • デフォルトの設定では、テストで必要となるスレッドをテスト実行時に生成する。
      大量のスレッドを使用する場合、実行時のスレッド生成で CPU を過剰に使う可能性があるため、大量のスレッドを使用したテストの場合は、設定を有効にし、使用するタイミングでスレッド生成を行うように遅延させることも検討

初期の設定では、このようなものを使うのではないでしょうか。
ランプアップ時間ですが、スレッドを何秒の期間をかけて生成するかの設定になります。
上記の画像の場合は、スレッド数 10 に対して 1 秒として、設定していますので、「1 秒の間に 10 スレッドを作成」することを目標としてテストが実行されます。
image
この設定でクエリを実行した場合の結果がこちらになるのですが、「21:23:38 ~ 39」にかけて、10 スレッド生成されています。
それでは、次のように「10 スレッドを 10 秒かけて生成」するような設定としてみます。
image
この場合は「21:25:15 ~ 21:25:24」にかけて 10 スレッドを生成しています。
約 1 秒間隔でのテストのためのスレッドを生成していますね。
image
一つのテストシナリオ内で、スレッドの生成タイミングをずらしたい場合は、

  • Number of Threads (users)
  • Ramp-Up Period (in seconds)

の 2 設定を使用して調整することができます。
 
実行タイミングの調整 (厳密にはこれもスレッド生成のタイミングの調整な気もしますが…)
JDBC のテストには、Pre / Post を設定することもできます。
以下は、PreProcessor を設定したものになりますが、これを設定するとどういう動きになるのでしょうか。
image
実行結果がこちらになります。
image
「jdbc test pre」と設定しているものが、PreProcessor で実行しているものになるのですが、各スレッドの初期処理として実行されていることが確認できますね。
DB のテストを実施する場合、

  • キャッシュのクリア
  • 複数スレッドでテストを実行

という順序で実施したいケースがあるのではないでしょうか。
各スレッドの前処理としてではなく、テストシナリオの初期処理として、特定の処理を実行する場合、テスト実行時の最初に、1 スレッドのみで実行されればよいものというのがあるかと思います。
そのような場合は、「setup Thread Group」を使用すると実現できます。
setup Thread Group は、通常の Thread Group より前に実行され、setup Thread Group の実行が完了してから、Thread Group の実行が開始されますので、前処理系については、このスレッドグループを使用すると制御できます。
今回は、「setup Thread Group」として、15 秒の待機を設定しているのですが、その待機が完了してから「Thread Group」の 5 秒待機のクエリが実行されていますね。
image
前処理でしたら、これでよいのですが、テストケースによっては「あるスレッドグループの実行の後に、特定のテストを開始させたい」ということもあるのではないでしょうか。
ロック競合系のテストがこれになるのですが、ロック競合のなる原因になるクエリを実行し、クエリの完了する前に、次のテストを実行したい場合などですね。
先ほどの「setup Thread Group」では、「完了した後」に Thread Group の実行が始まりますので、スレッドの実行中に他のスレッドを実行するというシナリオでは使うことができません。
以下のようなスレッド構成と、順番でテストを作成したとしてみます。
Thread Group には、5 秒 / Thread Group #2 には、 3 秒の待機が発生するクエリを指定しています。
image
今回は 4 スレッドを 1 秒で生成するように設定しているのですが、この実行結果が以下になります。
image
JMeter のスレッドグループの順は実行順序を保証するものではないので、5 秒待機と 3 秒待機のクエリが、実行タイミングが混在しながら実行されていますね。
これを解決するための方法としては 2 種類が考えられそうです。
一つ目が、「Constant Timer」を設定する方法です。
image
これにより、スレッドを生成するタイミングの調整ができます。
image
「21:56:32」に「Thread Group」のテストが実施されているのですが、その同タイミングでは、「Thread Group 2」のテストは実行されておらず、「21:56:35」秒程度から実行されており、実行タイミングをずらせていることが確認できますね。
Constant Imer はリクエストに紐づけることもできますので、特定のリクエストを開始する場合にのみ遅延を持たせるといったことも可能です。
以下の画像の場合は、「JDBC Request」を実行する場合にのみ、3 秒の開始の遅延を持たせることができます。
image
Constant Timer 以外の方法としては Therad Group の「Schedule」の設定でも制御はできるのかと。
この場合、「Duration (seconds)」も必ず設定しなくてはいけないのですが。
Thread Group の「Scheduler」のチェックを付けると追加で項目を設定できます。
image

  • Duration (seconds)
    • テストの継続時間
    • 実行回数に満たなくても、その秒数を経過した場合は、該当のスレッドは終了となる
      • 永久ループにしていた場合も同様
  • Startup delay (seconds)
    • 実行するタイミングの遅延時間

 
Duration については該当のスレッドの実行の継続時間になります。
例えば、以下のような設定をしてみます。
image
実行する要求は「5 秒待機するクエリ」で、それを「5 回」繰り返しますので、通常であれば「25 秒」は実行されるはずです。しかし、「Duration」を「5 秒」に設定しています。
実行するとこのようになります。
image
4 × 5 = 20 のサンプルが取得されてほしいのですが、5 秒の継続時間ですので 4 スレッド× 1 回の実行のみとなっていますね。
「Duration」を設定することで、そのスケジュールが開始されるまでの待機時間を制御することもできますので、先ほどの「Constant Timer」のように「該当スレッドの実行を開始させるまでの待機時間」として利用し、特定スレッドの実行タイミングをずらすことができます。
「Duration」の実行時間に達しなくても、「Loop Count」の回数に達した場合は、終了となります。
次のような設定をした場合「10,000 秒」経過する前に「5 回のループ」が完了すると、該当のスレッドの実行は終了となります。
image
20 回の実行で完了していることが確認できますね。image
テストケースによっては、実行順序を多少制御しなくてはいけないこともありますので、この辺は知っておくと役に立つのかなと。

Share

Written by Masayuki.Ozawa

9月 8th, 2018 at 10:34 pm

Posted in SQL Server

Tagged with ,

Leave a Reply