カスタムSQL負荷テスト用ツール

カスタムSQL負荷テスト用ツール

いくつかのテストを実行して、複数の構成で MySQL アプリケーションを比較したいと思います。ただし、ストアド プロシージャ ロジックが大量にあるため、sysbench や oltp テストのようなものは使いたくありません。そのため、プロシージャに対してテストを行いたいのです。

カスタム クエリ (オプションとして並列) を実行し、統計情報を表示するために使用できるテスト アプリケーション/フレームワークはありますか? Web 用の Siege のようなものですか? 私がすでに見つけたものは通常、独自に生成されたデータベース スキーマとシナリオを使用します。

開発者にカスタム Java インターフェイスを作成して Siege を使用するように依頼することもできますが、オーバーヘッドを追加したり数値に影響を与えたりすることは望ましくありません。

よろしく、イゴール。

答え1

Jmeter は JDBC を使用してデータベース負荷テストを実行できます。http://jakarta.apache.org/jmeter/usermanual/build-db-test-plan.html

これまで jdbc 機能を使用したことがないので、複雑なクエリを処理できるかどうかはわかりません。

答え2

ほとんどのユニット テスト エンジンの一般的な原則に従って、シンプルな mySQL ユニット テスト エンジンを構築できます。

過去にMS SQL用にこのようなものを構築したことがあります

そのアイデアは次の通りでした

1) ユニット テスト プロシージャを作成し、それらに「test_」のような同じ名前のプレフィックスを付けます。MS SQL では、テストの特定のパラメーターを記述するためのメタ情報として拡張プロパティも使用しました (NUnit で異なるテスト属性を使用できるのと同じです)

2) カーソルを開き、カタログから「test_」で始まるすべてのプロシージャ名を選択し、EXEC (@procedure_name) ステートメントでそれぞれを実行するプロシージャ/スクリプトを作成します。テストが失敗した場合、テスト プロシージャはエラーを発生させる必要があります。

3) テスト実行の結果はテーブルに保存されます。

4) 同じデータでテストを実行し、予測可能な結果を​​得るために、サンプルテストデータベースを用意し、これを一度バックアップしておき、各テスト実行前にバックアップから復元します。

答え3

MySQL 5.1に同梱されているツールをご希望の場合は、ぜひお試しください。MySQL スラップ (別名 mysqlslap)ドキュメントから直接引用した例:

50 のクライアントがクエリを実行し、それぞれに対して 200 の選択を実行する、独自の作成およびクエリ SQL ステートメントを指定します。

mysqlslap --delimiter=";" \  
--create="CREATE TABLE a (b int);INSERT INTO a VALUES (23)" \  
--query="SELECT * FROM a" --concurrency=50 --iterations=200

これにより、テストを並列実行するオプションが提供されますが、複数のクライアントを使用した並列処理の実装は、必ずしも好みに合わない可能性があります。以下に簡単な説明を示します (これも逐語的に)。

mysqlslap は 3 つの段階で実行されます。

  1. テストに使用するスキーマ、テーブル、およびオプションで保存されたプログラムやデータを作成します。このステージでは、単一のクライアント接続を使用します。

  2. 負荷テストを実行します。このステージでは、多数のクライアント接続を使用できます。

  3. クリーンアップ (切断、指定されている場合はテーブルの削除)。このステージでは、単一のクライアント接続が使用されます。

これが好みに合わない場合は、cron スクリプトを使用して、多数のユーザーに対して特定の時間に MySQL Slap をトリガーするか、サーバーなどへのネットワーク パスが同じ多数の同一構成/仕様のマシンに対して MySQL Slap をトリガーすることができます (後者は非常に重要です。ベンチマークでは、不明瞭な結論を防ぐために、起こり得る矛盾を排除する必要があるためです)。

以前のバージョンのMySQLを実行している場合は(おそらく)、このリンク5.1 ソースを 5.0 用にコンパイルする方法に関する有用な情報を提供します。これ以上のバックポートはおそらく不可能です。

基本的なウォークスルーは次のとおりです。

答え4

私は結局SQLIO ディスクに負荷をかけるために、いくつかのカスタム クエリを作成して大量のデータを生成し、大きなテーブルでさまざまな計算を実行して、負荷が高く最適化されていないデータベースをシミュレートしました。その後、同時接続の数を増やしていき、最終的にクラッシュしました。

関連情報