Сбор данных счетчиков производительности для облачной службы Azure (классическая версия)

Важно!

Облачные службы (классическая версия) объявлены устаревшими для новых клиентов. Их поддержка будет полностью прекращена 31 августа 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой . Это новая модель развертывания на основе Azure Resource Manager.

Счетчики производительности предоставляют возможность отслеживать работу приложения и узла. Windows Server предоставляет множество различных счетчиков производительности, связанных с программным обеспечением, приложениями, ОС и т. д. Собирая и отправляя данные счетчика производительности в Azure, вы сможете анализировать их и принимать более взвешенные решения.

Поиск доступных счетчиков

Счетчик производительности состоит из двух частей: имени набора (также известного как категория) и одного или нескольких счетчиков. Вы можете получить список доступных счетчиков производительности с помощью PowerShell.

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 ...

Свойство CounterSetName представляет собой набор (категорию) и указывает на то, с чем связан счетчик производительности. Свойство Paths представляет собой коллекцию счетчиков для набора. Дополнительные сведения о наборе счетчиков содержатся в свойстве Description.

Все счетчики для набора можно найти в коллекции Paths с помощью значения CounterSetName. Каждый элемент пути является счетчиком. Его можно запросить. Например, чтобы получить доступные счетчики, связанные с набором Processor, раскройте коллекцию 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

Эти пути отдельных счетчиков можно добавить на платформу диагностики, используемую облачной службой. Дополнительные сведения о создании пути счетчика производительности см. в статье Specifying a Counter Path (Указание пути счетчика).

Сбор данных счетчика производительности

Счетчик производительности можно добавить в облачную службу для диагностики Azure или Application Insights.

Application Insights

Azure Application Insights для облачных служб позволяет указать счетчики производительности для сбора данных. После того как вы добавите Application Insights в свой проект, в проект Visual Studio добавляется файл конфигурации с именем ApplicationInsights.config. Он определяет, какой тип данных Application Insights собирает и отправляет в Azure.

Откройте файл ApplicationInsights.config и найдите элемент ApplicationInsights>TelemetryModules. Каждый дочерний элемент <Add> определяет тип телеметрии, собираемый вместе с его конфигурацией. Тип модуля телеметрического счетчика производительности следующий: Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector. Если этот элемент уже определен, не добавляйте его снова. Каждый счетчик производительности для сбора определяется в узле с именем <Counters>. Ниже приведен пример сбора данных счетчика производительности диска.

<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 ... -->

Каждый счетчик производительности представлен как элемент <Add> в разделе <Counters>. Атрибут PerformanceCounter определяет счетчик производительности для сбора данных. Атрибут ReportAs — это заголовок, отображаемый на портале Azure для счетчика производительности. Все счетчики производительности, данные которых вы собираете, помещаются в настраиваемую категорию на портале. Вы не можете установить интервал сбора и отправки в Azure данных счетчиков производительности, как это возможно в системе диагностики Azure. С Application Insights данные счетчиков производительности собираются и отправляются каждую минуту.

Application Insights автоматически собирает данные следующих счетчиков производительности:

  • \Процесс(??APP_WIN32_PROC??)% Процессорное время
  • \Память\доступные байты
  • .NET CLR Exceptions(??APP_CLR_PROC??)# Исключений в секунду
  • \Process(??APP_WIN32_PROC??)\Байт исключительного пользования
  • \Process(??APP_WIN32_PROC??)\I/O — обмен данными, байт в секунду
  • \Процессор(_общий объем ресурсов)% загруженности процессора

Дополнительные сведения см. в статье Системные счетчики производительности в Application Insights и в разделе Счетчики производительности.

Система диагностики Azure

Важно!

Все эти данные собираются в учетной записи хранения, но портал не содержит встроенных средств для их визуализации. Настоятельно рекомендуем интегрировать в приложение другую службу диагностики, например Application Insights.

Расширение системы диагностики Azure для облачных служб позволяет указать счетчики производительности для сбора данных. Сведения об установке диагностики Azure см. в разделе Настройка расширения системы диагностики.

Счетчики производительности, данные которых вы хотите собрать, определены в файле diagnostics.wadcfgx. Откройте этот файл (он определен для каждой роли) в Visual Studio и найдите элемент DiagnosticsConfiguration>PublicConfig>WadCfg>DiagnosticMonitorConfiguration>PerformanceCounters. Добавьте новый дочерний элемент PerformanceCounterConfiguration. Этот элемент имеет два атрибута: counterSpecifier и sampleRate. Атрибут counterSpecifier определяет набор счетчиков производительности системы (описанный в предыдущем разделе) для сбора данных. Значение sampleRate указывает, как часто выполняется опрос. В целом все счетчики производительности передаются в Azure в соответствии со значением атрибута scheduledTransferPeriod родительского элемента PerformanceCounters.

Дополнительные сведения об элементе схемы PerformanceCounters см. в разделе Схема Диагностики Azure.

Период, определенный атрибутом sampleRate, использует тип данных продолжительности XML, чтобы указать, как часто проверяется счетчик производительности. В приведенном ниже примере скорость равна PT3M, что означает [P]eriod[T]ime[3][M]inutes: каждые три минуты.

Дополнительные сведения об определении sampleRate и scheduledTransferPeriod см. в разделе Тип данных о длительности в руководстве XSD Date and Time Data Types (Типы даты и времени XSD).

<?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>

Создание счетчика производительности

С помощью вашего кода можно создать и использовать новый счетчик производительности. Уровень вашего кода, создающего счетчик производительности, должен быть повышен, иначе он не будет работать. Код запуска OnStart облачной службы может создать счетчик производительности, при этом необходимо, чтобы вы выполняли роль с повышенными правами. Или же вы можете создать задачу запуска, которая работает на повышенном уровне. Она создаст счетчик производительности. Дополнительные сведения см. в статье Как настроить и выполнить задачи запуска для облачной службы.

Чтобы настроить роль для повышения уровня, добавьте элемент <Runtime> в файл формата 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>

Вы можете создать и зарегистрировать счетчик производительности с несколькими строками кода. Используйте перегрузку метода System.Diagnostics.PerformanceCounterCategory.Create, которая создает категорию и счетчик. Следующий код сначала проверяет, существует ли категория (если она отсутствует, он создает категорию и счетчик).

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
    }
}

Если необходимо использовать счетчик, вызовите метод Increment или IncrementBy.

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

Теперь, когда приложение использует ваш счетчик, необходимо настроить службу диагностики Azure или Application Insights для отслеживания счетчика.

Application Insights

Как указывалось ранее, счетчики производительности для Application Insights определены в файле ApplicationInsights.config. Откройте файл ApplicationInsights.config и найдите элемент ApplicationInsights>TelemetryModules>Add>Counters. Создайте дочерний элемент <Add> и укажите для атрибута PerformanceCounter категорию и имя созданного в коде счетчика производительности. Для атрибута ReportAs задайте простое имя, которое вы хотите увидеть на портале.

<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.wadcfgx. Откройте этот файл (он определен для каждой роли) в Visual Studio и найдите элемент DiagnosticsConfiguration>PublicConfig>WadCfg>DiagnosticMonitorConfiguration>PerformanceCounters. Добавьте новый дочерний элемент PerformanceCounterConfiguration. Укажите для атрибута counterSpecifier категорию и имя созданного в коде счетчика производительности.

<?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>

Дополнительные сведения