Azure Web Rolünde SignalR performans sayaçlarını kullanma
Tarafından Luke Latham
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
- Visual Studio 2015 veya 2017
- Visual Studio için Microsoft Azure SDK Not: SDK'yi yükledikten sonra makinenizi yeniden başlatın.
- Microsoft Azure aboneliği: Ücretsiz bir Azure deneme hesabına kaydolmak için bkz . Azure Ücretsiz Deneme sürümü.
SignalR performans sayaçlarını kullanıma sunan bir Azure Web Rolü uygulaması oluşturma
Visual Studio'yu açın.
Visual Studio'da Dosya>Yeni Proje'yi> seçin.
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.
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.
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.
Yeni ASP.NET Web Uygulaması - WebRole1 iletişim kutusunda MVC şablonunu ve ardından Tamam'ı seçin.
Çözüm Gezgini'da WebRole1 altında diagnostics.wadcfgx dosyasını açın.
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>
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
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.
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.
Çö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.
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.
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
Çö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.
SignalRPerfCounterInstall.cmd dosyası için önceki adımı yineleyin.
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üzenleyicide, dosyadaki öndeki baytları seçin ve silin. Dosyayı kaydedip kapatın
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>
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>© @DateTime.Now.Year - My ASP.NET Application</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
Sunucuda yöntemini sürekli olarak çağıran
increment
bir JavaScript istemcisi ekleyin. İçeriği açınViews/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>
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.
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); } } }
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.
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); } } }
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'yiConfiguration
başlatır.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>
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)/Tables
geniş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.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ın
Microsoft.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=<account-name>;AccountKey=<account-key>" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
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.
Birkaç dakika bekleyin. Bulut Gezgini'nde, yukarıda yapılandırdığınız depolama hesabını bulun ve içindeki tabloyu bulun
WADPerformanceCountersTable
. 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.