Recopilación de contadores de rendimiento para Azure Cloud Services (clásico)

Importante

Cloud Services (clásico) ahora está en desuso para los nuevos clientes y se retirará el 31 de agosto de 2024 para todos los clientes. Las nuevas implementaciones deben utilizar el nuevo modelo de implementación basado en Azure Resource Manager Azure Cloud Services (soporte extendido) .

Los contadores de rendimiento le ofrecen una forma de realizar un seguimiento del rendimiento de su aplicación y host. Windows Server proporciona diferentes contadores de rendimiento relacionados con hardware, aplicaciones, sistema operativo, etc. Al recopilar y enviar información de los contadores de rendimiento a Azure, puede analizar esta información para ayudar a tomar mejores decisiones.

Detectar contadores disponibles

Un contador de rendimiento se compone de dos partes, un nombre de conjunto (también conocido como categoría) y uno o varios contadores. Puede usar PowerShell para obtener una lista de los contadores de rendimiento disponibles:

Get-Counter -ListSet * | Select-Object CounterSetName, Paths | Sort-Object CounterSetName

CounterSetName                                  Paths
--------------                                  -----
.NET CLR Data                                   {\.NET CLR Data(*)\SqlClient...
.NET CLR Exceptions                             {\.NET CLR Exceptions(*)\# o...
.NET CLR Interop                                {\.NET CLR Interop(*)\# of C...
.NET CLR Jit                                    {\.NET CLR Jit(*)\# of Metho...
.NET Data Provider for Oracle                   {\.NET Data Provider for Ora...
.NET Data Provider for SqlServer                {\.NET Data Provider for Sql...
.NET Memory Cache 4.0                           {\.NET Memory Cache 4.0(*)\C...
AppV Client Streamed Data Percentage            {\AppV Client Streamed Data ...
ASP.NET                                         {\ASP.NET\Application Restar...
ASP.NET Apps v4.0.30319                         {\ASP.NET Apps v4.0.30319(*)...
ASP.NET State Service                           {\ASP.NET State Service\Stat...
ASP.NET v2.0.50727                              {\ASP.NET v2.0.50727\Applica...
ASP.NET v4.0.30319                              {\ASP.NET v4.0.30319\Applica...
Authorization Manager Applications              {\Authorization Manager Appl...

#... results cut to save space ...

La propiedad CounterSetName representa un conjunto (o categoría) y es un buen indicador de con qué están relacionados los contadores de rendimiento. La propiedad Paths representa una colección de contadores de un conjunto. También puede obtener la propiedad Description para obtener más información acerca del conjunto de contadores.

Para obtener todos los contadores de un conjunto, use el valor CounterSetName y expanda la colección Paths. Cada elemento de ruta de acceso es un contador que se puede consultar. Por ejemplo, para obtener los contadores disponibles relacionadas con el conjunto Processor, expanda la colección Paths:

Get-Counter -ListSet * | Where-Object CounterSetName -eq "Processor" | Select -ExpandProperty Paths

\Processor(*)\% Processor Time
\Processor(*)\% User Time
\Processor(*)\% Privileged Time
\Processor(*)\Interrupts/sec
\Processor(*)\% DPC Time
\Processor(*)\% Interrupt Time
\Processor(*)\DPCs Queued/sec
\Processor(*)\DPC Rate
\Processor(*)\% Idle Time
\Processor(*)\% C1 Time
\Processor(*)\% C2 Time
\Processor(*)\% C3 Time
\Processor(*)\C1 Transitions/sec
\Processor(*)\C2 Transitions/sec
\Processor(*)\C3 Transitions/sec

Estas rutas de contadores individuales se pueden agregar al marco de diagnóstico que usa su servicio en la nube. Para obtener más información acerca de cómo se crea una ruta del contador de rendimiento, consulte Specifying a Counter Path (Especificar una ruta de contador).

Recopilar un contador de rendimiento

Puede agregar un contador de rendimiento a su servicio en la nube para Azure Diagnostics o Application Insights.

Application Insights

Azure Application Insights para Cloud Services le permite especificar qué contadores de rendimiento quiere recopilar. Después de agregar Application Insights al proyecto, se agregar un archivo de configuración denominado ApplicationInsights.config al proyecto de Visual Studio. Este archivo de configuración define qué tipo de información Application Insights recopila y envía a Azure.

Abra el archivo ApplicationInsights.config y busque el elemento ApplicationInsights>TelemetryModules. Cada elemento secundario <Add> define un tipo de telemetría para recopilar, junto con su configuración. El tipo de módulo de telemetría del contador de rendimiento es Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector. Si este elemento ya está definido, no lo agregue por segunda vez. Cada contador de rendimiento que se puede recopilar se define en un nodo denominado <Counters>. Este es un ejemplo que recopila los contadores de rendimiento de la unidad:

<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">

  <TelemetryModules>

    <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
      <Counters>
        <Add PerformanceCounter="\LogicalDisk(C:)\Disk Write Bytes/sec" ReportAs="Disk write (C:)" />
        <Add PerformanceCounter="\LogicalDisk(C:)\Disk Read Bytes/sec" ReportAs="Disk read (C:)" />
      </Counters>
    </Add>

  </TelemetryModules>

<!-- ... cut to save space ... -->

Cada contador de rendimiento se representa como un elemento <Add> en <Counters>. El atributo PerformanceCounter define el contador de rendimiento que se va a recopilar. El atributo ReportAs es el título que se mostrará en Azure Portal para el contador de rendimiento. Cualquier contador de rendimiento que recopile se colocará en una categoría denominada Personalizada en el portal. A diferencia de Azure Diagnostics, no puede establecer el intervalo durante el cual estos contadores de rendimiento se recopilan y envían a Azure. Con Application Insights, los contadores de rendimiento se recopilan y se envían cada minuto.

Application Insights recopila automáticamente los siguientes contadores de rendimiento:

  • \Process(??APP_WIN32_PROC??)% de tiempo del procesador
  • \Memoria\Bytes disponibles
  • .NET CLR Exceptions(??APP_CLR_PROC??) of Exceps Thrown / sec
  • \Process(??APP_WIN32_PROC??)\Private Bytes
  • \Process(??APP_WIN32_PROC??)\IO Data Bytes/sec
  • \Procesador(_Total)% de tiempo del procesador

Para más información, vea Contadores de rendimiento de sistema en Application Insights y Application Insights para Azure Cloud Services.

Azure Diagnostics

Importante

Aunque todos estos datos se agregan a la cuenta de almacenamiento, el portal no ofrece una forma nativa de crear gráficos de los datos. Se recomienda encarecidamente que integre otro servicio de diagnóstico, como Application Insights, en la aplicación.

La extensión de Azure Diagnostics para Cloud Services le permite que especificar qué contadores de rendimiento quiere recopilar. Para configurar Azure Diagnostics, consulte Introducción a la supervisión de servicios en la nube.

Los contadores de rendimiento que quiere recopilar se definen en el archivo diagnostics.wadcfgx. Abra este archivo (se define según el rol) en Visual Studio y busque el elemento DiagnosticsConfiguration>PublicConfig>WadCfg>DiagnosticMonitorConfiguration>PerformanceCounters. Agregue un nuevo elemento PerformanceCounterConfiguration como secundario. Este elemento tiene dos atributos: counterSpecifier y sampleRate. El atributo counterSpecifier define qué conjunto de contadores de rendimiento del sistema (descrito en la sección anterior) se van a recopilar. El valor sampleRate indica la frecuencia con la que se sondea ese valor. En conjunto, los contadores de rendimiento se transfieren a Azure según el valor del atributo scheduledTransferPeriod del elemento principal PerformanceCounters.

Para obtener más información acerca del elemento del esquema PerformanceCounters, vea el esquema de Azure Diagnostics.

El período definido por el atributo sampleRate usa el tipo de datos de duración XML para indicar con qué frecuencia se sondea el contador de rendimiento. En el ejemplo siguiente, la frecuencia se establece en PT3M, lo que significa [P]eriod[T]ime[3][M]inutes, es decir cada tres minutos.

Para obtener más información acerca de cómo se definen sampleRate y scheduledTransferPeriod, consulte la sección Tipo de datos de duración en el tutorial W3 XML Date and Time Date Types (Tipos W3 XML Date y Time Date).

<?xml version="1.0" encoding="utf-8"?>
<DiagnosticsConfiguration  xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
  <PublicConfig>
    <WadCfg>
      <DiagnosticMonitorConfiguration overallQuotaInMB="4096">

        <!-- ... cut to save space ... -->

        <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" />

          <!-- This is a new perf counter which will track the C: disk read activity in bytes per second, every minute -->
          <PerformanceCounterConfiguration counterSpecifier="\LogicalDisk(C:)\Disk Read Bytes/sec" sampleRate="PT1M" />

        </PerformanceCounters>
      </DiagnosticMonitorConfiguration>
    </WadCfg>
    
    <!-- ... cut to save space ... -->

  </PublicConfig>
</DiagnosticsConfiguration>

Crear un nuevo contador de rendimiento

Puede crear un nuevo contador de rendimiento y permitir que su código lo use. El código que crea un nuevo contador de rendimiento se debe ejecutar con privilegios elevados, de lo contrario se producirá un error. El código de inicio OnStart del servicio en la nube puede crear el contador de rendimiento, y puede solicitarle que ejecute el rol en un contexto con privilegios elevados. O bien, puede crear una tarea de inicio que se ejecuta con privilegios elevados y crea el contador de rendimiento. Para más información, consulte Configuración y ejecución de tareas de inicio para un servicio en la nube.

Para configurar el rol para ejecutarse con privilegios elevados, agregue un elemento <Runtime> al archivo .csdef.

<ServiceDefinition name="CloudServiceLoadTesting" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
  <WorkerRole name="WorkerRoleWithSBQueue1" vmsize="Large">

    <!-- ... cut to save space ... -->

    <Runtime executionContext="elevated">
      
    </Runtime>

    <!-- ... cut to save space ... -->

  </WorkerRole>
</ServiceDefinition>

Puede crear y registrar un nuevo contador de rendimiento con unas pocas líneas de código. Use la sobrecarga del método System.Diagnostics.PerformanceCounterCategory.Create que crea la categoría y el contador. El código siguiente comprueba primero si existe la categoría y, si no se especifica, crea la categoría y el contador.

using System.Diagnostics;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRoleWithSBQueue1
{
    public class WorkerRole : RoleEntryPoint
    {
        // Perf counter variable representing times service was used.
        private PerformanceCounter counterServiceUsed;

        public override bool OnStart()
        {
            // ... Other startup code here ...

            // Define the category and counter names.
            string perfCounterCatName = "MyService";
            string perfCounterName = "Times Used";

            // Create the counter if needed. Our counter category only has a single counter.
            // Both the category and counter are created in the same method call.
            if (!PerformanceCounterCategory.Exists(perfCounterCatName))
            {
                PerformanceCounterCategory.Create(perfCounterCatName, "Collects information about the cloud service.", 
                                                  PerformanceCounterCategoryType.SingleInstance, 
                                                  perfCounterName, "How many times the cloud service was used.");
            }

            // Get reference to our counter
            counterServiceUsed = new PerformanceCounter(perfCounterCatName, perfCounterName);
            counterServiceUsed.ReadOnly = false;
            
            return base.OnStart();
        }

        // ... cut class code to save space
    }
}

Cuando quiera usar el contador, solo tiene que llamar al método Increment o al método IncrementBy.

// Increase the counter by 1
counterServiceUsed.Increment();

Ahora que la aplicación usa el contador personalizado, debe configurar Azure Diagnostics o Application Insights para que realicen un seguimiento del contador.

Application Insights

Como se mencionó anteriormente, los contadores de rendimiento para Application Insights se definen en el archivo ApplicationInsights.config. Abra el archivo ApplicationInsights.config y busque el elemento ApplicationInsights>TelemetryModules>Add>Counters. Cree un elemento secundario <Add> y establezca el atributo PerformanceCounter en la categoría y el nombre del contador de rendimiento que creó en el código. Asigne un nombre descriptivo al atributo ReportAs que desea ver en el portal.

<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">

  <TelemetryModules>

    <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
      <Counters>
        <!-- ... cut other perf counters to save space ... -->

        <!-- This new perf counter matches the [category name]\[counter name] defined in your code -->
        <Add PerformanceCounter="\MyService\Times Used" ReportAs="Service used counter" />
      </Counters>
    </Add>

  </TelemetryModules>

<!-- ... cut to save space ... -->

Azure Diagnostics

Como se indicó anteriormente, los contadores de rendimiento que quiere recopilar se definen en el archivo diagnostics.wadcfgx. Abra este archivo (se define según el rol) en Visual Studio y busque el elemento DiagnosticsConfiguration>PublicConfig>WadCfg>DiagnosticMonitorConfiguration>PerformanceCounters. Agregue un nuevo elemento PerformanceCounterConfiguration como secundario. Establezca el atributo counterSpecifier en la categoría y el nombre del contador de rendimiento que creó en el código.

<?xml version="1.0" encoding="utf-8"?>
<DiagnosticsConfiguration  xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration">
  <PublicConfig>
    <WadCfg>
      <DiagnosticMonitorConfiguration overallQuotaInMB="4096">

        <!-- ... cut to save space ... -->

        <PerformanceCounters scheduledTransferPeriod="PT1M">
          <!-- ... cut other perf counters to save space ... -->
          
          <!-- This new perf counter matches the [category name]\[counter name] defined in your code -->
          <PerformanceCounterConfiguration counterSpecifier="\MyService\Times Used" sampleRate="PT1M" />

        </PerformanceCounters>
      </DiagnosticMonitorConfiguration>
    </WadCfg>
    
    <!-- ... cut to save space ... -->

  </PublicConfig>
</DiagnosticsConfiguration>

Más información