Crank による SignalR 接続密度テスト

作成者: Tom FitzMacken

警告

このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。

この記事では、Crank ツールを使って、複数のクライアントをシミュレートしてアプリケーションをテストする方法について説明します。

アプリケーションがホスティング環境 (Azure Web ロール、IIS、または Owin を使ったセルフホステッド) で実行されている場合、Crank ツールを使って、高レベルの接続密度に対するアプリケーションの応答をテストできます。 インターネット インフォメーション サービス (IIS) サーバー、Owin ホスト、または Azure Web ロールをホスティング環境にできます。 (注: Azure App Service Web Apps ではパフォーマンス カウンターを利用できないため、接続密度テストからパフォーマンス データを取得できません)。

接続密度とは、サーバーで同時に確立できる TCP 接続の数のことです。 TCP 接続ごとに独自のオーバーヘッドが発生し、多数のアイドル接続が開かれて、最終的にメモリのボトルネックが発生します。

SignalR コードベースには、Crank という名前のロード テスト ツール含まれます。 最新バージョンの Crank は、GitHub の Dev ブランチで見つかります。 こちらで、SignalR コードベースの Dev ブランチの ZIP アーカイブをダウンロードできます。

Crank を使ってサーバーのメモリを完全に飽和させ、サーバーのハードウェアで可能なアイドル接続の合計数を計算できます。 または、Crank を使って、特定の数または特定のメモリしきい値に達するまで接続を増やして、一定量のメモリ負荷の下でサーバーのロード テストを行うこともできます。

テストするときは、リモート クライアントを使って、リソース (つまり TCP 接続とメモリ) の競合を回避することが重要です。 クライアントを監視し、サーバーが完全な容量 (メモリまたは CPU) に達するのを妨げる可能性のあるボトルネックが発生していないことを確認します。 サーバーに完全な負荷をかけるには、クライアントの数を増やすことが必要な場合があります。

接続密度テストの実行

このセクションでは、SignalR アプリケーションで接続密度テストを実行するために必要な手順について説明します。

  1. SignalR コードベースの Dev ブランチをダウンロードしてビルドします。 コマンド プロンプトで、<プロジェクト ディレクトリ>\src\Microsoft.AspNet.SignalR.Crank\bin\debug に移動します。
  2. 目的のホスティング環境にアプリケーションをデプロイします。 アプリケーションで使っているエンドポイントを記録しておきます。たとえば、入門チュートリアルで作成したアプリケーションでは、エンドポイントは http://<yourhost>:8080/signalr です。
  3. SignalR パフォーマンス カウンターをサーバーにインストールします。 アプリケーションが Azure で実行されている場合は、「Azure Web ロールでの SignalR パフォーマンス カウンターの使用」をご覧ください。

コードベースをダウンロードしてビルドし、ホストにパフォーマンス カウンターをインストールしたら、src\Microsoft.AspNet.SignalR.Crank\bin\Debug フォルダーで Crank コマンド ライン ツールが見つかるようになります。

Crank ツールでは、次のオプションを使用できます。

  • /?: ヘルプ画面を表示します。 Url パラメーターを省略した場合も、使用できるオプションが表示されます。
  • /Url: SignalR 接続の URL。 このパラメーターは必須です。 既定のマッピングを使っている SignalR アプリケーションの場合、パスは "/signalr" で終わります。
  • /Transport: 使用されるトランスポートの名前。 既定値は auto であり、使用できる最適なプロトコルが選ばれます。 オプションには、WebSocketsServerSentEventsLongPolling が含まれます (Internet Explorer ではなく .NET クライアントが使われるため、Crank のオプションに ForeverFrame は含まれません)。 SignalR でトランスポートが選ばれる方法について詳しくは、「トランスポートとフォールバック」をご覧ください。
  • /BatchSize: 各バッチで追加されたクライアントの数。 既定値は 50 です。
  • /ConnectInterval: 接続を追加する間隔 (ミリ秒単位)。 既定値は 500 です。
  • /Connections: アプリケーションのロード テストに使われる接続の数。 既定値は 100,000 です。
  • /ConnectTimeout: テストを中止するまでのタイムアウト (秒単位)。 既定値は 300 です。
  • MinServerMBytes: 到達する最小サーバー メガバイト数。 既定値は 500 です。
  • SendBytes: サーバーに送信されるペイロードのサイズ (バイト単位)。 既定値は 0 です。
  • SendInterval: サーバーへのメッセージ間の遅延 (ミリ秒単位)。 既定値は 500 です。
  • SendTimeout: サーバーへのメッセージのタイムアウト (ミリ秒単位)。 既定値は 300 です。
  • ControllerUrl: 1 つのクライアントがコントローラー ハブをホストする URL。 既定値は null (コントローラー ハブなし) です。 コントローラー ハブは、Crank セッションの開始時に開始されます。コントローラー ハブと Crank の間にそれ以上の接触はありません。
  • NumClients: アプリケーションに接続するシミュレートされたクライアントの数。 既定値は 1 です。
  • Logfile: テスト実行のログ ファイルのファイル名。 既定値は、crank.csv です。
  • SampleInterval: パフォーマンス カウンターのサンプル間の時間 (ミリ秒単位)。 既定値は 1000 です。
  • SignalRInstance: サーバー上のパフォーマンス カウンターのインスタンス名。 既定では、クライアント接続状態が使われます。

次のコマンドでは、ポート 8080 および "ControllerHub" という名前のハブでアプリケーションをホストしている Azure 上の pfsignalr というサイトが、100 の接続を使ってテストされます。

crank /Connections:100 /Url:http://pfsignalr.cloudapp.net:8080/signalr