SignalR パフォーマンス (SignalR 1.x)
警告
このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。
このトピックでは、SignalR アプリケーションのパフォーマンスを設計、測定、および改善する方法について説明します。
SignalR のパフォーマンスとスケーリングに関する最近のプレゼンテーションについては、「ASP.NET SignalR を使用したリアルタイム Web のスケーリング」を参照してください。
このトピックは、次のセクションで構成されています。
- 設計上の考慮事項
- SignalR サーバーをパフォーマンスに合わせて調整する
- パフォーマンスに関する問題のトラブルシューティング
- SignalR パフォーマンス カウンターの使用
- その他のパフォーマンス カウンターの使用
- その他のリソース
設計上の考慮事項
このセクションでは、不要なネットワーク トラフィックを生成することでパフォーマンスが低下しないように、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 というユーティリティを使用してサーバーに追加できます。 このユーティリティをインストールするには、次の手順に従います。
Visual Studio で、[ツール>] [NuGet パッケージ マネージャー>] [ソリューションの NuGet パッケージの管理] の順に選択します
signalr.utils を検索し、[インストール] を選択します。
使用許諾契約書に同意してパッケージをインストールします。
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 詳細については、次のトピックを参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示