Aracılığıyla paylaş


Azure Web Rolünde SignalR performans sayaçlarını kullanma

Tarafından Luke Latham

Uyarı

Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.

SignalR performans sayaçları, azure web rolünde uygulamanızın performansını izlemek için kullanılır. Sayaçlar Microsoft Azure Tanılama tarafından yakalanır. Tek başına veya şirket içi uygulamalar için kullanılan aynı araç olan signalr.exe ile Azure'a SignalR performans sayaçları yüklersiniz. Azure rolleri geçici olduğundan, bir uygulamayı başlangıçta SignalR performans sayaçlarını yükleyecek ve kaydedecek şekilde yapılandırabilirsiniz.

Önkoşullar

SignalR performans sayaçlarını kullanıma sunan bir Azure Web Rolü uygulaması oluşturma

  1. Visual Studio'yu açın.

  2. Visual Studio'da Dosya>Yeni Proje'yi> seçin.

  3. Yeni Proje iletişim kutusunda, soldaki Visual C#>Cloud kategorisini ve ardından Azure Cloud Service şablonunu seçin. Uygulamaya SignalRPerfCounters adını verin ve Tamam'ı seçin.

    Yeni Bulut Uygulaması

    Not

    Bulut şablonu kategorisini veya Azure Bulut Hizmeti şablonunu görmüyorsanız Visual Studio 2017 için Azure geliştirme iş yükünü yüklemeniz gerekir. Yeni Proje iletişim kutusunun sol alt tarafındaki Visual Studio Yükleyicisi Aç bağlantısını seçerek Visual Studio Yükleyicisi açın. Azure geliştirme iş yükünü seçin ve ardından değiştir'i seçerek iş yükünü yüklemeye başlayın.

    Visual Studio Yükleyicisi'de Azure geliştirme iş yükü

  4. Yeni Microsoft Azure Bulut Hizmeti iletişim kutusunda Web Rolü'ASP.NET seçin ve rolü projeye eklemek için düğmeyi seçin>. Tamam'ı seçin.

    ASP.NET Web Rolü Ekle

  5. Yeni ASP.NET Web Uygulaması - WebRole1 iletişim kutusunda MVC şablonunu ve ardından Tamam'ı seçin.

    MVC ve Web API'sini ekleme

  6. Çözüm Gezgini'da WebRole1 altında diagnostics.wadcfgx dosyasını açın.

    Çözüm Gezgini diagnostics.wadcfgx

  7. Dosyanın içeriğini aşağıdaki yapılandırmayla değiştirin ve dosyayı kaydedin:

    <?xml version="1.0" encoding="utf-8"?>
    <DiagnosticsConfiguration xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
      <PublicConfig>
        <WadCfg>
          <DiagnosticMonitorConfiguration overallQuotaInMB="4096">
            <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter="Error" />
            <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Error" />
            <Directories scheduledTransferPeriod="PT1M">
              <IISLogs containerName ="wad-iis-logfiles" />
              <FailedRequestLogs containerName ="wad-failedrequestlogs" />
            </Directories>
            <WindowsEventLog scheduledTransferPeriod="PT1M">
              <DataSource name="Application!*[System[(Level=1 or Level=2 or Level=3)]]" />
              <DataSource name="Windows Azure!*[System[(Level=1 or Level=2 or Level=3 or Level=4)]]" />
            </WindowsEventLog>
            <CrashDumps containerName="wad-crashdumps" dumpType="Mini">
              <CrashDumpConfiguration processName="WaIISHost.exe" />
              <CrashDumpConfiguration processName="WaWorkerHost.exe" />
              <CrashDumpConfiguration processName="w3wp.exe" />
            </CrashDumps>
            <PerformanceCounters scheduledTransferPeriod="PT1M">
              <PerformanceCounterConfiguration counterSpecifier="\Memory\Available MBytes" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\ISAPI Extension Requests/sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\Bytes Total/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Requests/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Errors Total/Sec" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Queued" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Rejected" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT3M" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\% Time in GC" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Exceptions(w3wp)\# of Exceps Thrown / sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current logical Threads" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current physical Threads" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Current Queue Length" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Contention Rate / sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# Bytes in all Heaps" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# GC Handles" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# of Pinned Objects" sampleRate="PT10S" />
    
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Connected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Reconnected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Disconnected" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Message Bus Messages Received/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Allocated Workers" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Busy Workers" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Topics Current" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Tranport Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Transport/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Open" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Buffering" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors Total" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors/Sec" sampleRate="PT10S" />
              <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Send Queue Length" sampleRate="PT10S" />
            </PerformanceCounters>
          </DiagnosticMonitorConfiguration>
        </WadCfg>
        <StorageAccount></StorageAccount>
      </PublicConfig>
      <PrivateConfig>
        <StorageAccount name="" key="" endpoint="" />
      </PrivateConfig>
      <IsEnabled>true</IsEnabled>
    </DiagnosticsConfiguration>
    
  8. Araçlar>NuGet Paket Yöneticisi Paket Yöneticisi Konsolunu açın. SignalR'nin en son sürümünü ve SignalR yardımcı programları paketini yüklemek için aşağıdaki komutları girin:

    install-package microsoft.aspnet.signalr
    install-package microsoft.aspnet.signalr.utils
    
  9. Başlatma veya geri dönüşüm sırasında signalr performans sayaçlarını rol örneğine yüklemek için uygulamayı yapılandırın. Çözüm Gezgini WebRole1 projesine sağ tıklayın ve Yeni Klasör Ekle'yi>seçin. Yeni klasöre Başlangıç adını verin.

    Başlangıç Klasörü Ekle

  10. Proje klasöründen>/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils dosyasından <signalr.exe dosyasını (Microsoft.AspNet.SignalR.Utils paketiyle birlikte eklenir) kopyalayın.<önceki adımda oluşturduğunuz Başlangıç klasörüne sürüm>/araçlar.

  11. Çözüm Gezgini'da Başlangıç klasörüne sağ tıklayın ve Varolan Öğeyi Ekle'yi>seçin. Görüntülenen iletişim kutusunda signalr.exe'ı ve ardından Ekle'yi seçin.

    Projeye signalr.exe ekleme

  12. Oluşturduğunuz Başlangıç klasörüne sağ tıklayın. Yeni Öğe Ekle'yi>seçin. Genel düğümünü seçin, Metin Dosyası'nı seçin ve yeni öğeyi SignalRPerfCounterInstall.cmd adlandırın. Bu komut dosyası SignalR performans sayaçlarını web rolüne yükler.

    SignalR performans sayacı yükleme toplu iş dosyası oluşturma

  13. Visual Studio SignalRPerfCounterInstall.cmd dosyasını oluşturduğunda, otomatik olarak ana pencerede açılır. Dosyanın içeriğini aşağıdaki betikle değiştirin, ardından dosyayı kaydedip kapatın. Bu betik, SignalR performans sayaçlarını rol örneğine ekleyen signalr.exe yürütür.

    SET SignalR_LogDir=%~dp0Log\
    MKDIR "%SignalR_LogDir%"
    cd %~dp0
    signalr.exe ipc >> "%SignalR_LogDir%SignalR_Log.txt" 2>&1
    net localgroup "Performance Monitor Users" "Network Service" /ADD >> "%SignalR_LogDir%NetworkAdd.txt" 2>&1
    
  14. Çözüm Gezgini'da signalr.exe dosyasını seçin. Dosyanın Özellikleri'nde, Kopyala'yı Çıkış Dizini olarak Her Zaman Kopyala olarak ayarlayın.

    Çıkış Dizinine Kopyala'yı Her Zaman Kopyala olarak ayarlama

  15. SignalRPerfCounterInstall.cmd dosyası için önceki adımı yineleyin.

  16. SignalRPerfCounterInstall.cmd dosyasına sağ tıklayın ve Birlikte Aç'ı seçin. Görüntülenen iletişim kutusunda İkili Düzenleyici'yi ve ardından Tamam'ı seçin.

    İkili Düzenleyici ile aç

  17. İkili düzenleyicide, dosyadaki öndeki baytları seçin ve silin. Dosyayı kaydedip kapatın

    Baştaki baytları silme

  18. ServiceDefinition.csdef dosyasını açın ve hizmet başlatıldığında SignalrPerfCounterInstall.cmd dosyasını yürüten bir başlangıç görevi ekleyin:

    <?xml version="1.0" encoding="utf-8"?>
    <ServiceDefinition name="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
      <WebRole name="WebRole1" vmsize="Small">
        <Startup>
          <Task commandLine="Startup\SignalRPerfCounterInstall.cmd" executionContext="elevated" taskType="background" />
        </Startup>
        <Sites>
          <Site name="Web">
            <Bindings>
              <Binding name="Endpoint1" endpointName="Endpoint1" />
            </Bindings>
          </Site>
        </Sites>
        <Endpoints>
          <InputEndpoint name="Endpoint1" protocol="http" port="80" />
        </Endpoints>
      </WebRole>
    </ServiceDefinition>
    
  19. jQuery paket betiğini açın Views/Shared/_Layout.cshtml ve dosyanın sonundan kaldırın.

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    </body>
    </html>
    
  20. Sunucuda yöntemini sürekli olarak çağıran increment bir JavaScript istemcisi ekleyin. İçeriği açın Views/Home/Index.cshtml ve aşağıdaki kodla değiştirin:

    @{
        ViewBag.Title = "Home Page";
    }
    
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="~/signalr/hubs" type="text/javascript"></script>
    
    <div id="body">
        <section class="featured">
            <div class="content-wrapper">
                <p>
                    Hello World!
                </p>
                <div style="font-size:large;">
                    My Counter: <span id="counter"></span>
                </div>
            </div>
        </section>
        <section class="content-wrapper main-content clear-fix"></section>
    </div>
    
    <script type="text/javascript">
      $(document).ready(function () {
        var hub = $.connection.myHub;
    
        hub.client.sendResult = function (x) {
          console.log('sendResult(' + x + ')');
          $("#counter").text(x);
          window.setTimeout(function () {
            hub.server.increment(x);
          }, 1000);
        };
    
        $.connection.hub.connected = function () {};
        $.connection.hub.disconnected = function () {};
    
        $.connection.hub.stateChanged(function (change) {
          console.log('new State' + change.newState);
          if (change.newState === $.signalR.connectionState.disconnected) {
            $.connection.hub.start();
          }
          if (change.newState === $.signalR.connectionState.reconnecting) {
            console.log('Re-connecting');
          } else if (change.newState === $.signalR.connectionState.connected) {
            console.log('The server is online');
          }
        });
    
        $.connection.hub.error(function (error) {
          console.log('error ' + error);
        });
        
        $.connection.hub.logging = true;
        
        $.connection.hub.reconnected(function () {
          console.log('Reconnected');
          hub.server.increment(0);
        });
    
        $.connection.hub.start().done(function () {
          console.log('hub started');
          hub.server.increment(0);
        });
      });
    </script>
    
  21. WebRole1 projesinde Hubs adlı yeni bir klasör oluşturun. Çözüm Gezgini'da Hubs klasörüne sağ tıklayın ve Yeni Öğe Ekle'yi> seçin. Yeni Öğe Ekle iletişim kutusunda Web>SignalR kategorisini ve ardından SignalR Hub Sınıfı (v2) öğe şablonunu seçin. Yeni hub MyHub.cs adlandırın ve Ekle'yi seçin.

    Yeni Öğe Ekle iletişim kutusundaki Hubs klasörüne SignalR Hub Sınıfı ekleme

  22. MyHub.cs otomatik olarak ana pencerede açılır. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:

    using System.Threading.Tasks;
    using Microsoft.AspNet.SignalR;
    
    namespace WebRole1.Hubs
    {
        public class MyHub : Hub
        {
            public async Task Increment(int x)
            {
                await this.Clients.Caller.sendResult(x + 1);
            }
        }
    }
    
  23. Crank.exe SignalR kod tabanı ile sağlanan bir bağlantı yoğunluğu test aracıdır. Crank kalıcı bir bağlantı gerektirdiğinden, test sırasında kullanmak üzere sitenize bir bağlantı eklersiniz. WebRole1 projesine PersistentConnections adlı yeni bir klasör ekleyin. Bu klasöre sağ tıklayın ve Sınıf Ekle'yi>seçin. Yeni sınıf dosyasını MyPersistentConnections.cs adlandırın ve Ekle'yi seçin.

  24. Visual Studio MyPersistentConnections.cs dosyasını ana pencerede açar. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:

    using System.Threading.Tasks;
    using Microsoft.AspNet.SignalR;
    using Microsoft.AspNet.SignalR.Infrastructure;
    
    namespace WebRole1.PersistentConnections
    {
        public class MyPersistentConnection : PersistentConnection
        {
            protected override Task OnReceived(IRequest request, string connectionId, string data)
            {
                //Return data to calling user
                return Connection.Send(connectionId, data);        
            }
        }
    }
    
  25. sınıfını Startup kullanarak SignalR nesneleri OWIN başlatıldığında başlar. Startup.cs açın veya oluşturun ve içeriği aşağıdaki kodla değiştirin:

    using Microsoft.Owin;
    using Owin;
    using WebRole1.PersistentConnections;
    
    // Marks this class for automatic OWIN startup
    [assembly: OwinStartup(typeof(WebRole1.Startup))]
    namespace WebRole1
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                ConfigureAuth(app);
                // Only needed if "No Authentication" was not selected for the project
                app.MapSignalR();
                app.MapSignalR<MyPersistentConnection>("/echo");
            }
        }
    }
    

    Yukarıdaki kodda OwinStartup özniteliği, OWIN'i başlatmak için bu sınıfı işaretler. yöntemi SignalR'yi Configuration başlatır.

  26. F5 tuşuna basarak uygulamanızı Microsoft Azure Öykünücüsü test edin.

    Not

    MapSignalR'da bir FileLoadException ile karşılaşırsanız web.config'deki bağlama yeniden yönlendirmelerini aşağıdaki şekilde değiştirin:

    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    
  27. Bir dakika bekleyin. Visual Studio'da Bulut Gezgini araç penceresini açın (Bulut Gezgini'ni Görüntüle>) ve yolunu (Local)/Storage Accounts/(Development)/Tablesgenişletin. WADPerformanceCountersTable'a çift tıklayın. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Tabloyu Bulut Gezgini'nde görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.

    Visual Studio Bulut Gezgini'nde WAD Performans Sayaçları Tablosunu Seçme

    WAD Performans Sayaçları Tablosunda toplanan sayaçları gösterme

  28. Uygulamanızı bulutta test etmek için ServiceConfiguration.Cloud.cscfg dosyasını güncelleştirin ve bağlantı dizesi geçerli bir Azure Depolama hesabı olarak ayarlayınMicrosoft.WindowsAzure.Plugins.Diagnostics.ConnectionString.

    <?xml version="1.0" encoding="utf-8"?>
    <ServiceConfiguration serviceName="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2015-04.2.6">
      <Role name="WebRole1">
        <Instances count="1" />
        <ConfigurationSettings>
          <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=&lt;account-name&gt;;AccountKey=&lt;account-key&gt;" />
        </ConfigurationSettings>
      </Role>
    </ServiceConfiguration>
    
  29. Uygulamayı Azure aboneliğinize dağıtın. Azure'a uygulama dağıtma hakkında ayrıntılı bilgi için bkz . Bulut Hizmeti Oluşturma ve Dağıtma.

  30. Birkaç dakika bekleyin. Bulut Gezgini'nde, yukarıda yapılandırdığınız depolama hesabını bulun ve içindeki tabloyu bulunWADPerformanceCountersTable. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Tabloyu Bulut Gezgini'nde görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.

Bu öğreticide kullanılan özgün içerik için Martin Richard'a özel teşekkürler.