SignalR パフォーマンス (SignalR 1.x)

作成者: Patrick Fletcher

警告

このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。

このトピックでは、SignalR アプリケーションのパフォーマンスを設計、測定、および改善する方法について説明します。

SignalR のパフォーマンスとスケーリングに関する最近のプレゼンテーションについては、「ASP.NET SignalR を使用したリアルタイム Web のスケーリング」を参照してください。

このトピックは、次のセクションで構成されています。

設計上の考慮事項

このセクションでは、不要なネットワーク トラフィックを生成することでパフォーマンスが低下しないように、SignalR アプリケーションの設計時に実装できるパターンについて説明します。

メッセージの頻度の調整

高頻度でメッセージを送信するアプリケーション (リアルタイム ゲーム アプリケーションなど) でも、ほとんどのアプリケーションで 1 秒に数件以上のメッセージを送信する必要はありません。 各クライアントが生成するトラフィックの量を減らすために、メッセージ ループを実装して、キューに入れ、メッセージを送信する頻度を固定レート以下にできます (つまり、送信する時間間隔にメッセージがある場合、1 秒ごとに一定の数のメッセージが送信されます)。 (クライアントとサーバーの両方から) メッセージを特定のレートに調整するサンプル アプリケーションについては、「 SignalR を使用した高頻度リアルタイム」を参照してください。

メッセージ サイズの縮小

シリアル化されたオブジェクトのサイズを小さくすることで、SignalR メッセージのサイズを小さくできます。 サーバー コードで、送信する必要のないプロパティを含むオブジェクトを送信する場合は、 属性を使用 JsonIgnore してこれらのプロパティがシリアル化されないようにします。 プロパティの名前もメッセージに格納されます。プロパティの名前は、 属性を使用して JsonProperty 短縮できます。 次のコード サンプルは、クライアントに送信されるプロパティを除外する方法と、プロパティ名を短くする方法を示しています。

クライアントへのデータの送信を除外する JsonIgnore 属性と、メッセージ サイズを小さくするための JsonProperty 属性を示す .NET サーバー コード

using Newtonsoft.Json; 
using System; 
public class ShapeModel
{
[JsonProperty("l")]
    public double Left { get; set; }
[JsonProperty("t")]
    public double Top { get; set; }
    // We don't want the client to get the "LastUpdatedBy" property
[JsonIgnore]
    public string LastUpdatedBy { get; set; }
}

クライアント コードで読みやすさと保守性を維持するために、省略形のプロパティ名は、メッセージの受信後に人間にわかりやすい名前に再マップできます。 次のコード サンプルは、メッセージ コントラクト (マッピング) を定義し、 関数を使用して reMap 最適化されたメッセージ クラスにコントラクトを適用することで、短縮名を長い名前に再マップする方法の 1 つを示しています。

短縮されたプロパティ名を人間が判読できる名前に再マップするクライアント側の JavaScript コード

function reMap(smallObject, contract) {
    var largeObject = {};
    for (var smallProperty in contract) {
        largeObject[contract[smallProperty]] = smallObject[smallProperty];
    }
    return largeObject;
}
var shapeModelContract = {
    l: "left",
    t: "top"
};
myHub.client.setShape = function (shapeModelSmall) {
    var shapeModel = reMap(shapeModelSmall, shapeModelContract);
    // shapeModelSmall has "l" and "t" properties  but after remapping
    // shapeModel now has "left" and "top" properties
};

同じメソッドを使用して、クライアントからサーバーへのメッセージでも名前を短縮できます。

メッセージ オブジェクトのメモリ占有領域 (つまり、メッセージに使用されるメモリの量) を減らすと、パフォーマンスも向上します。 たとえば、 の int 全範囲が必要ない場合は、 short または byte を代わりに使用できます。

メッセージはメッセージ バスにサーバー メモリに格納されるため、メッセージのサイズを小さくすると、サーバー メモリの問題にも対処できます。

SignalR サーバーをパフォーマンスに合わせて調整する

SignalR アプリケーションのパフォーマンスを向上させるために、次の構成設定を使用してサーバーを調整できます。 ASP.NET アプリケーションのパフォーマンスを向上させる方法の一般的な情報については、「 ASP.NET パフォーマンスの向上」を参照してください。

SignalR 構成設定

  • DefaultMessageBufferSize: 既定では、SignalR は接続ごとにハブごとに 1000 個のメッセージをメモリに保持します。 大きなメッセージが使用されている場合は、この値を減らすことで軽減できるメモリの問題が発生する可能性があります。 この設定は、ASP.NET アプリケーションの Application_Start イベント ハンドラー、または Configuration セルフホステッド アプリケーションの OWIN スタートアップ クラスのメソッドで設定できます。 次の例では、使用されるサーバー メモリの量を減らすために、アプリケーションのメモリ占有領域を減らすためにこの値を減らす方法を示します。

    既定のメッセージ バッファー サイズを小さくするための Global.asax の .NET サーバー コード

    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalHost.Configuration.DefaultMessageBufferSize = 500;
    }
    

IIS 構成設定

  • アプリケーションあたりの最大同時要求数: 同時 IIS 要求の数を増やすと、要求を処理するために使用できるサーバー リソースが増加します。 既定値は 5000 です。この設定を増やすには、管理者特権のコマンド プロンプトで次のコマンドを実行します。

    cd %windir%\System32\inetsrv\
    appcmd.exe set config /section:system.webserver/serverRuntime 
            /appConcurrentRequestLimit:10000
    

ASP.NET 構成設定

このセクションには、ファイルで設定できる構成設定が aspnet.config 含まれています。 このファイルは、プラットフォームに応じて、次の 2 つの場所のいずれかで見つかります。

  • %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
  • %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet.config

SignalR のパフォーマンスを向上させる可能性がある ASP.NET の設定は次のとおりです。

  • CPU あたりの最大同時要求数: この設定を増やすと、パフォーマンスのボトルネックが軽減される可能性があります。 この設定を増やすには、次の構成設定をファイルに aspnet.config 追加します。

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
        <system.web>
            <applicationPool maxConcurrentRequestsPerCPU="20000" />
        </system.web>
    </configuration>
    
  • 要求キューの制限: 接続の合計数が設定を maxConcurrentRequestsPerCPU 超えると、ASP.NET はキューを使用して要求の調整を開始します。 キューのサイズを大きくするには、設定を requestQueueLimit 増やします。 これを行うには、(ではなくaspnet.config) のノードにprocessModel次のconfig/machine.config構成設定を追加します。

    <processModel autoConfig="false" requestQueueLimit="250000" />
    

パフォーマンスに関する問題のトラブルシューティング

このセクションでは、アプリケーションでパフォーマンスのボトルネックを見つける方法について説明します。

WebSocket が使用されていることを確認する

SignalR では、クライアントとサーバー間の通信にさまざまなトランスポートを使用できますが、WebSocket はパフォーマンスに大きな利点があり、クライアントとサーバーでサポートされている場合は使用する必要があります。 クライアントとサーバーが WebSocket の要件を満たしているかどうかを確認するには、「 トランスポートとフォールバック」を参照してください。 アプリケーションで使用されているトランスポートを確認するには、ブラウザー開発者ツールを使用し、ログを調べて、接続に使用されているトランスポートを確認します。 インターネット エクスプローラーと Chrome でブラウザー開発ツールを使用する方法については、「トランスポートとフォールバック」を参照してください。

SignalR パフォーマンス カウンターの使用

このセクションでは、パッケージにある SignalR パフォーマンス カウンターを有効にして使用する Microsoft.AspNet.SignalR.Utils 方法について説明します。

signalr.exeのインストール

パフォーマンス カウンターは、SignalR.exe というユーティリティを使用してサーバーに追加できます。 このユーティリティをインストールするには、次の手順に従います。

  1. Visual Studio で、[ツール>] [NuGet パッケージ マネージャー>] [ソリューションの NuGet パッケージの管理] の順に選択します

  2. signalr.utils を検索し、[インストール] を選択します。

    [Microsoft A S P dot NET Signal R Utilities Command line utilities for A S P dot NET Signal R]\(S P ドット NET Signal R のコマンド ライン ユーティリティ\) が強調表示されているスクリーンショット。

  3. 使用許諾契約書に同意してパッケージをインストールします。

  4. SignalR.exeが に <project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/toolsインストールされます。

SignalR.exeを使用したパフォーマンス カウンターのインストール

SignalR パフォーマンス カウンターをインストールするには、管理者特権のコマンド プロンプトで次のパラメーターを使用してSignalR.exeを実行します。

SignalR.exe ipc

SignalR パフォーマンス カウンターを削除するには、管理者特権のコマンド プロンプトで次のパラメーターを使用してSignalR.exeを実行します。

SignalR.exe upc

SignalR パフォーマンス カウンター

ユーティリティ パッケージには、次のパフォーマンス カウンターがインストールされます。 "Total" カウンターは、前回のアプリケーション プールまたはサーバーの再起動以降のイベント数を測定します。

接続のメトリック

次のメトリックは、発生する接続の有効期間イベントを測定します。 詳細については、「 接続の有効期間イベントの概要と処理」を参照してください。

  • 接続されている接続
  • 再接続された接続
  • 接続が切断されました
  • 現在の接続数

メッセージのメトリック

次のメトリックは、SignalR によって生成されたメッセージ トラフィックを測定します。

  • 受信した接続メッセージの合計
  • 接続メッセージ送信合計
  • 受信した接続メッセージ数/秒
  • 送信された接続メッセージ数/秒

メッセージ バスメトリック

次のメトリックは、内部 SignalR メッセージ バス (すべての受信および送信 SignalR メッセージが配置されるキュー) を介したトラフィックを測定します。 メッセージは、送信またはブロードキャスト時に 発行されます 。 このコンテキストの サブスクライバー は、メッセージ バス上のサブスクリプションです。これは、クライアントの数とサーバー自体の数と同じである必要があります。 割り当てられたワーカーは、アクティブな接続にデータを送信するコンポーネントです。ビジー状態のワーカーは、メッセージをアクティブに送信しているワーカーです。

  • Message Bus Messages Received Total
  • Message Bus Messages Received/Sec
  • Message Bus メッセージ発行済み合計
  • Message Bus Messages Published/Sec
  • Message Bus サブスクライバーの現在の状態
  • Message Bus サブスクライバー合計
  • Message Bus サブスクライバー/秒
  • Message Bus によって割り当てられたワーカー
  • メッセージ バスビジーワーカー
  • Message Bus トピックの現在の状態

エラー メトリック

次のメトリックは、SignalR メッセージ トラフィックによって生成されるエラーを測定します。 ハブ解決 エラーは、ハブまたはハブメソッドを解決できない場合に発生します。 ハブ呼び出し エラーは、ハブ メソッドの呼び出し中にスローされる例外です。 トランスポート エラーは、HTTP 要求または応答中にスローされる接続エラーです。

  • エラー: すべての合計
  • エラー: すべて/秒
  • エラー: ハブ解決の合計
  • エラー: ハブ解像度/秒
  • エラー: ハブ呼び出しの合計
  • エラー: ハブ呼び出し/秒
  • エラー: トランスポートの合計
  • エラー: トランスポート/秒

スケールアウト メトリック

次のメトリックは、スケールアウト プロバイダーによって生成されたトラフィックとエラーを測定します。 このコンテキストの Stream は、スケールアウト プロバイダーによって使用されるスケール ユニットです。これは、SQL Serverが使用されている場合はテーブル、Service Bus を使用する場合はトピック、Redis を使用する場合はサブスクリプションです。 既定では、ストリームは 1 つだけ使用されますが、これは SQL Server と Service Bus の構成によって増やすことができます。 バッファリング ストリームは、障害状態になったストリームです。ストリームが障害状態の場合、バックプレーンに送信されるすべてのメッセージは、ストリームの障害がなくなったまですぐに失敗します。 送信キューの長さは、まだ送信されていないメッセージの数です。

  • スケールアウト メッセージ バス メッセージ受信数/秒
  • スケールアウト ストリームの合計
  • スケールアウト ストリームを開く
  • スケールアウト ストリームのバッファリング
  • スケールアウト エラーの合計
  • スケールアウト エラー/秒
  • スケールアウト送信キューの長さ

これらのカウンターの測定の詳細については、「signalR Scaleout with Azure Service Bus」を参照してください。

その他のパフォーマンス カウンターの使用

次のパフォーマンス カウンターは、アプリケーションのパフォーマンスを監視する場合にも役立ちます。

[メモリ]

  • すべてのヒープ内の .NET CLR Memory# バイト (w3wp の場合)

ASP.NET

  • ASP.NET\Requests Current
  • ASP.NET\Queued
  • ASP.NET\Rejected

CPU

  • プロセッサ情報\プロセッサ時間

TCP/IP

  • TCPv6/接続の確立
  • TCPv4/接続の確立

Web サービス

  • Web サービス\現在の接続
  • Web サービス\最大接続数

スレッド化

  • 現在の論理スレッドの .NET CLR LocksAndThreads#
  • 現在の物理スレッドの .NET CLR LocksAnd Threads#

その他の参照情報

パフォーマンスの監視とチューニング ASP.NET 詳細については、次のトピックを参照してください。