3

Windows Azure の WebRole で .NET 4.5 の下で実行されている MVC アプリケーションがあり、SignalR 1.0 -alpha2 を採用し、ServiceBus バックプレーンを使用しています。私の App_Start フォルダーには、次のように RegisterHubs.cs があります。

[assembly: PreApplicationStartMethod(typeof(pageengine.studio.RegisterHubs), "Start")]

namespace pageengine.studio
{
    public static class RegisterHubs
    {
        public static void Start()
        {
            // Register the default hubs route: ~/signalr/hubs
            RouteTable.Routes.MapHubs();
        }
    }
}

そして Global.asax には、次のものがあります。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    String connectionString = "Endpoint=sb://MYNAMESPACE.servicebus.windows.net/;SharedSecretIssuer=MY_ISSUER;SharedSecretValue=MY_SECRET_VALUE";
    GlobalHost.DependencyResolver.UseWindowsAzureServiceBus(connectionString, 1);
}

上記のようにテストを実行し (これを MVC + SignalR + ServiceBus と呼びます)、GlobalHost.DependencyResolver ...Global.asax の行をコメント アウト (MVC + SignalR) し、両方の行[assembly: PreApplicationStartMethod ...RouteTable.Routes.MapHubs();コメント アウト (MVC Alone) を使用しました。

開始する前に、Start Without Debugging (および IIS Express へのデプロイ) を使用して Azure エミュレーターを起動し、コメントを付けたりコメントを外したりした後、アプリケーションを再構築し、Google Chrome でハード リロードを行います。10 回のテストでの平均読み込み時間は次のとおりです。

MVC のみ: 1.33 秒

MVC + SignalR: 31.95 秒

MVC + SignalR + ServiceBus: 53.1 秒

実際の Azure サイトで同じ比較を実行したことはありませんが、これらのテストを実行する理由は、SignalR を実装した後、実行速度が著しく低下したためです。

これは、SignalR がアルファ版であることが原因であると想定していましたが、他の場所での議論 ( signalR インストール後に signalR MVC サイトが無期限にロードされる ) は、そうであってはならないことを示唆しています。上記の実装に問題があるのか​​、それとも Azure 固有の問題なのか、それ以外の問題なのかはわかりません。

他の誰かが同様のパフォーマンスの問題を経験していますか? 上記のコードに何か問題がありますか? 誰かが潜在的な救済策を持っていますか?

アップデート

WebRole の Start メソッドと Run メソッド、メソッドの最初と最後、RegisterHubsおよびメソッドの最初と最後に trace ステートメントを追加Application_Startし、ServiceBus コードをコメントアウトして、MVC + SignalR をテストしているだけです。

繰り返しになりますが、多くのテストで、結果は一貫しています。

Web ロール OnStart: 20:55:17

Web ロールの実行: 20:55:17

RegisterHubs 開始: 20:55:28

RegisterHubs 開始: 20:56:10 // 42 秒。平均は45に近かった。

Application_Start In: 20:56:14

アプリケーション_開始: 20:56:21

参考までに、私の RegisterHubs メソッドは次のようになります。

public static void Start()
{
    System.Diagnostics.Debug.WriteLine("RegisterHubs Start In: " + DateTime.Now.ToLongTimeString());
    // Register the default hubs route: ~/signalr/hubs
    RouteTable.Routes.MapHubs();
    System.Diagnostics.Debug.WriteLine("RegisterHubs Start Out: " + DateTime.Now.ToLongTimeString());
}

更なるアップデート

問題は(皮肉なことに)PerformaceCounterManagerクラス、Microsoft.AspNet.SignalR.Coreアセンブリにあります。

関数は23 の異なる のループをSetCounterProperties()呼び出します。これらの呼び出しはそれぞれ失敗し、例外が処理されて が返されますが、失敗が発生するまでに 1 ~ 2 秒かかり、これが累積して 40 秒のラグが発生します (これらすべてのタイミングは、デバッガーがオンになっている場合に発生します。 、もちろんですが、それでもかなり遅れています)。LoadCounter_counterProperties_noOpCounter

役に立つ場合に備えて、処理された例外のトレースを次に示します。

A first chance exception of type 'System.InvalidOperationException' occurred in System.dll InvalidOperation: SignalR - Errors: Hub Invocation Total - deployment18(966).Azure.Studio_IN_0_Web - System.InvalidOperationException: Cannot load Counter Name data because an invalid index '' was read from the registry. at System.Diagnostics.PerformanceCounterLib.GetStringTable(Boolean isHelp) at System.Diagnostics.PerformanceCounterLib.get_NameTable() at System.Diagnostics.PerformanceCounterLib.get_CategoryTable() at System.Diagnostics.PerformanceCounterLib.CategoryExists(String category) at System.Diagnostics.PerformanceCounterLib.CategoryExists(String machine, String category) at System.Diagnostics.PerformanceCounterCategory.Exists(String categoryName, String machineName) at System.Diagnostics.PerformanceCounterCategory.Exists(String categoryName) at Microsoft.AspNet.SignalR.Infrastructure.PerformanceCounterManager.LoadCounter(String categoryName, String counterName, String instanceName) in d:\Work\CLIENTS\PageEngine\Resources\SignalR-master\src\Microsoft.AspNet.SignalR.Core\Infrastructure\PerformanceCounterManager.cs:line 275

私が見つけた最も簡単な回避策は、PerformanceCounters を持たないことでした。とりあえずGetPropertyInfo()単純に返すように修正しましたnew PropertyInfo[0]LoadCounter常に返すように変更しました_noOpCounter。起動時間は約 5 秒になり、Service Bus では 10 秒になりました。

4

1 に答える 1

4

これは SignalR 1-alpha2 のバグであり、現在 github で報告されています: https://github.com/SignalR/SignalR/issues/1063

アップデート

...そして修正されました:https://github.com/SignalR/SignalR/commit/fda3aa41a9250a072e8487882ae806ffe547f2bb

于 2012-11-30T13:26:57.250 に答える