Счетчики производительности можно использовать в приложении Windows Azure для сбора данных, позволяющих определять узкие места системы и настраивать производительность системы и приложений. Windows Azure предоставляет несколько счетчиков производительности, доступных для Windows Server 2008, IIS и ASP.NET. Список счетчиков производительности, которые можно использовать для приложений Windows Azure, см. в разделе «Общие сведения о создании и использовании счетчиков производительности в приложении Windows Azure».
Для реализации этой задачи выполните следующие действия.
- Шаг 1. Сбор данных из счетчиков производительности
- Шаг 2. Создание настраиваемых счетчиков производительности (опция)
- Шаг 3. Запрос данных от счетчиков производительности
Шаг 1. Сбор данных от счетчиков производительности
Для настройки сбора данных от счетчиков производительности в приложении Windows Azure используется метод GetDefaultInitialConfiguration, добавляется источник данных PerformanceCounters с экземпляром PerformanceCounterConfiguration, а затем вызывается метод Start с измененной конфигурацией. Чтобы собрать данные от счетчиков производительности, выполните следующие действия.
Откройте исходный файл для роли.
Примечание. Как правило, в следующих действиях код добавляется к методу OnStart роли.
Получите экземпляр конфигурации монитора диагностики. В следующем примере кода показано, как получить заданный по умолчанию объект конфигурации монитора диагностики.
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
Укажите отслеживаемые счетчики производительности. В следующем примере показан счетчик производительности, добавляемый в конфигурацию монитора диагностики.
config.PerformanceCounters.DataSources.Add(
new PerformanceCounterConfiguration())
{
CounterSpecifier = @"Processor(_Total)% Processor Time",
SampleRate = TimeSpan.FromSeconds(5)
});
Запустите монитор диагностики с измененной конфигурацией. В следующем примере кода показан запуск монитора.
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
Примечание. В этом примере кода показано использование строки подключения. Дополнительные сведения о строках подключения приведены в разделе «Настройка строк подключения».
Сохраните и постройте проект, а затем разверните приложение.
После выполнения этих действий монитор диагностики Windows Azure начнет сбор данных от счетчиков производительности.
Шаг 2. Создание настраиваемых счетчиков производительности (опция)
Новые настраиваемые счетчики производительности можно добавить из приложения в конфигурацию монитора диагностики. Для этого следует использовать настраиваемую категорию и имена счетчиков, чтобы создать экземпляры PerformanceCounterConfiguration для каждого счетчика и добавить их в коллекцию источника данных PerformanceCounters в DiagnosticMonitorConfiguration. Чтобы создать настраиваемые счетчики производительности, выполните следующие действия.
Откройте файл определений службы (CSDEF) для приложения.
Добавьте элемент Runtime в элемент WebRole или WorkerRole, чтобы разрешить выполнение с более высоким уровнем привилегий.
<Runtime executionContext="elevated" />
Сохраните файл. Откройте исходный файл для роли. Если следующий оператор using отсутствует, добавьте его.
using System.Diagnostics;
Создайте настраиваемую категорию счетчика производительности в методе OnStart своей роли. В следующем примере показано, как создать настраиваемую категорию с двумя счетчиками (если она отсутствует).
if (!PerformanceCounterCategory.Exists("MyCustomCounterCategory"))
{
CounterCreationDataCollection counterCollection = new CounterCreationDataCollection();
// add a counter tracking user button1 clicks
CounterCreationData operationTotal1 = new CounterCreationData();
operationTotal1.CounterName = "MyButton1Counter";
operationTotal1.CounterHelp = "My Custom Counter for Button1";
operationTotal1.CounterType = PerformanceCounterType.NumberOfItems32;
counterCollection.Add(operationTotal1);
// add a counter tracking user button2 clicks
CounterCreationData operationTotal2 = new CounterCreationData();
operationTotal2.CounterName = "MyButton2Counter";
operationTotal2.CounterHelp = "My Custom Counter for Button2";
operationTotal2.CounterType = PerformanceCounterType.NumberOfItems32;
counterCollection.Add(operationTotal2);
PerformanceCounterCategory.Create(
"MyCustomCounterCategory",
"My Custom Counter Category",
PerformanceCounterCategoryType.SingleInstance, counterCollection);
Trace.WriteLine("Custom counter category created.");
}
else{
Trace.WriteLine("Custom counter category already exists.");
}
Добавьте новые настраиваемые счетчики производительности в конфигурацию монитора диагностики и запустите монитор диагностики в методе OnStart до вызова base.OnStart.
DiagnosticMonitorConfiguration config =
DiagnosticMonitor.GetDefaultInitialConfiguration();
config.PerformanceCounters.ScheduledTransferPeriod =
TimeSpan.FromMinutes(2D);
config.PerformanceCounters.BufferQuotaInMB = 512;
TimeSpan perfSampleRate = TimeSpan.FromSeconds(30D);
// Add configuration settings for custom performance counters.
config.PerformanceCounters.DataSources.Add(
new PerformanceCounterConfiguration()
{
CounterSpecifier = @"MyCustomCounterCategoryMyButton1Counter",
SampleRate = perfSampleRate
});
config.PerformanceCounters.DataSources.Add(
new PerformanceCounterConfiguration()
{
CounterSpecifier = @"MyCustomCounterCategoryMyButton2Counter",
SampleRate = perfSampleRate
});
// Apply the updated configuration to the diagnostic monitor.
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
Обновите счетчики в приложении. В следующем примере показано, как обновлять настраиваемый счетчик производительности в событиях Button1_Click.
protected void Button1_Click(object sender, EventArgs e)
{
button1Counter = new PerformanceCounter(
"MyCustomCounterCategory",
"MyButton1Counter",
string.Empty,
false);
button1Counter.Increment();
this.Button1.Text = "Button 1 count: " +
button1Counter.RawValue.ToString();
}
Сохраните и постройте проект, а затем разверните приложение.
После выполнения этих действий монитор диагностики Windows Azure начнет сбор данных от настраиваемых счетчиков производительности.
Шаг 3. Запрос данных от счетчиков производительности
После того как будет выполнена настройка монитора диагностики Windows Azure с целью сбора и передачи данных счетчиков производительности в хранилище Windows Azure, эти данные можно будет использовать для создания отчетов. Данные от счетчиков производительности в приложении Windows Azure передаются с помощью перечисления результатов выполнения запроса CloudTableQuery в WADPerformanceCountersTable в хранилище Windows Azure. Чтобы запросить данные от счетчиков производительности, выполните следующие действия.
Откройте исходный файл для роли, содержащей код. Если следующие операторы using отсутствуют, добавьте их.
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
Создайте класс представления схемы таблицы для запросов таблиц счетчиков производительности.
public class PerformanceCountersEntity : TableServiceEntity
{
public long EventTickCount { get; set; }
public string DeploymentId { get; set; }
public string Role { get; set; }
public string RoleInstance { get; set; }
public string CounterName { get; set; }
public string CounterValue { get; set; }
}
Получите экземпляр контекста служб таблиц. В следующем примере кода показано, как получать заданный по умолчанию контекст служб таблиц монитора диагностики.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
CloudTableClient cloudTableClient =
storageAccount.CreateCloudTableClient();
TableServiceContext serviceContext =
cloudTableClient.GetDataServiceContext();
Создайте запрос для указания возвращаемых записей таблицы. В следующем примере показано, как возвращать записи использования ЦП за последние пять минут для текущего экземпляра роли.
IQueryable<PerformanceCountersEntity> performanceCountersTable =
serviceContext.CreateQuery<PerformanceCountersEntity>(
"WADPerformanceCountersTable");
var selection = from row in performanceCountersTable
where row.EventTickCount > DateTime.UtcNow.AddMinutes(-5.0).Ticks
&& row.CounterName.Equals(@"Processor(_Total)% Processor Time")
select row;
CloudTableQuery<PerformanceCountersEntity> query =
selection.AsTableServiceQuery<PerformanceCountersEntity>();
// Use the Execute command explicitly on the TableServiceQuery to
// take advantage of continuation tokens automatically and get all the data.
IEnumerable<PerformanceCountersEntity> result = query.Execute();
Примечание. Дополнительные сведения о синтаксисе запросов см. в разделе LINQ: .NET Language-Integrated Query.
Используйте полученные данные для анализа и создания отчета о производительности приложения.
List<PerformanceCountersEntity> list = result.ToList();
// Display list members here.
Сохраните и постройте проект, а затем разверните приложение.
После выполнения этих действий данные от счетчика производительности будут доступны для формирования отчетов.
Дополнительные ресурсы
- Сбор данных журнала с помощью системы диагностики Windows Azure
- Отладка приложения Windows Azure
- Использование функционального блока для автоматического масштабирования
Автор: XaocCPS