Статьи

Понимание (и контроль) затрат на диагностику Windows Azure


Давайте немного поговорим о WAD — особенно о том, как хранятся данные.
Если вы знакомы с WAD и его хранилищем данных, пожалуйста, не стесняйтесь пропустить этот раздел.

По сути, хранилище Windows Azure (таблицы и двоичные объекты) используется для хранения данных WAD, собранных вашим приложением. В следующей таблице приведены таблицы / контейнеры BLOB-объектов, используемые для хранения данных WAD:

Имя контейнера таблицы / блоба Цель
WADLogsTable Таблица для хранения данных трассировки приложения.
WADDiagnosticInfrastructureLogsTable Таблица для хранения данных инфраструктуры диагностики, собранных Windows Azure.
WADPerformanceCountersTable Таблица для хранения данных счетчиков производительности.
WADWindowsEventLogsTable Таблица для хранения данных журналов событий.
WADDirectoriesTable Таблица указателей для некоторых диагностических данных, хранящихся в хранилище BLOB-объектов.
WAD-МИС-лога Контейнер BLOB-объектов для хранения журналов IIS.
пыж-МИС-failedrequestlogfiles Контейнер BLOB-объектов для хранения журналов неудачных запросов IIS.
WAD-краш-отвалы Контейнер BLOB-объектов для хранения данных аварийного дампа.
пыж-контейнер контрольно- Контейнер BLOB-объектов для хранения данных конфигурации WAD.

 

В этом посте мы остановимся только на таблицах.

Понимание общих затрат

Теперь давайте на минутку и поймем, как вы заряжены. Поскольку данные хранятся в хранилище Windows Azure, существует два компонента:

Затраты на хранение

Это стоимость хранения данных. Поскольку данные хранятся в виде объектов в таблицах, упомянутых выше, можно рассчитать размер хранилища. Формула для расчета стоимости хранения объекта:

4 байта + Len (PartitionKey + RowKey) * 2 байта + свойство For-Each (8 байтов + Len (имя свойства) * 2 байта + Sizeof (тип свойства .Net))

Где, Sizeof (тип свойства .Net) для различных типов:

  • String — Количество символов * 2 байта + 4 байта для длины строки
  • DateTime — 8 байт
  • GUID — 16 байт
  • Double — 8 байт
  • Int — 4 байта
  • INT64 — 8 байт
  • Bool — 1 байт
  • Binary — размер (значение) в байтах + 4 байта для длины двоичного массива

Ссылка : http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/30/how-the-size-of-an-entity-is-caclulated-in-windows-azure-table-storage. ASPX

На момент написания этого блога стоимость хранения 1 ГБ данных в хранилище Windows Azure составляла:

$ 0,125 — Geo избыточное хранилище

$ 0,093 — локально избыточное хранилище

Операционные расходы

Это стоимость вставки записей в хранилище таблиц Windows Azure. WAD использует транзакции группы объектов, а таблицы PartitionKey для WAD фактически представляют дату / время (в UTC) с точностью до минут. Это означает, что за каждую минуту диагностических данных, хранящихся в табличном хранилище, вы берете плату за одну транзакцию. Это основано на предположении, что

  1. Вы не собираете более 100 точек данных в минуту, поскольку существует ограничение в 100 сущностей на одну транзакцию группы сущностей. Например, если вы собираете 5 счетчиков производительности каждую секунду, то через минуту вы собираете 300 точек данных в минуту. В этом случае для передачи этих данных WAD потребуется выполнить 3 транзакции.
  2. Общий размер полезной нагрузки составляет менее 4 МБ из-за ограничения размера в транзакции группы объектов. Например, если объект WAD имеет размер, скажем, 1 МБ, и у вас есть 10 таких объектов WAD в минуту. Поскольку общая полезная нагрузка составляет 10 МБ, для передачи этих данных WAD потребуется выполнить 3 транзакции.

На момент написания этого поста стоимость выполнения 100 000 транзакций с вашей учетной записью хранилища составляла 0,01 доллара США.

Расходы на пропускную способность

Также существуют затраты на пропускную способность, но мы не будем учитывать это в наших расчетах, потому что я предполагаю, что ваши вычислительные экземпляры и учетная запись хранилища диагностики расположены в одном и том же центре обработки данных (даже в одной группе соответствия), и вы не платите за пропускную способность. если данные не выходят из центра обработки данных.

Калькулятор стоимости хранения

Теперь давайте возьмем пример данных и посчитаем, сколько нам стоило бы хранить только эти данные. Затем можно экстраполировать эти данные для расчета общих затрат на хранение.

Поскольку все таблицы имеют разные атрибуты, мы будем рассматривать каждую таблицу отдельно.

WADLogsTable

атрибут

Тип данных

Образец данных

Размер (Формула)

Размер (в байтах)

PartitionKey строка 0634012319400000000 2 * (19) 38
RowKey строка 43b7f32f389648639f16b55c6dcd7c4b

___WorkerRole1___WorkerRole1_IN_

0___0000000001652032029

2 * (87) 174
EventTickCount Int64 634012319404982640 2 * (14) + 8 + 8 44
DeploymentId строка 43b7f32f389648639f16b55c6dcd7c4b 2 * (12) + 2 * 32 + 4 + 8 100
Роль строка WorkerRole1 2 * (4) + 2 * 11 + 4 + 8 42
RoleInstance строка WorkerRole1_IN_0 2 * (12) + 2 * 16 + 4 + 8 68
уровень Int32 5 2 * (5) + 4 + 8 22
EventId Int32 0 2 * (7) + 4 + 8 26
Pid Int32 1652 2 * (3) + 4 + 8 18
Врем Int32 2128 2 * (3) + 4 + 8 18
Сообщение строка Роль работника работает. 2 * (7) + 2 * 32 + 4 + 8 100
         
накладные расходы       4
Всего / сущность 654

Так что, если я пишу следующую строку кода один раз в секунду:


1
Trace.WriteLine("Worker Role is working.: Working");

Вот сколько я стою за месяц с точки зрения стоимости хранения:

654 байта * 60 (секунд / минут) * 60 (минут / часов) * 24 (часов / дней) * 30 (дней / месяцев) * 0,125 долл. США / ГБ = 0,20 долл. США.

С точки зрения транзакций с хранилищем общая стоимость за месяц составит:

1 пакетная транзакция сущности за минуту * 60 (минуты / час) * 24 (часы / день) * 30 (дни / месяц) * $ 0,01 / 100000 = $ 0,004.

WADDiagnosticInfrastructureLogsTable

атрибут

Тип данных

Образец данных

Размер (Формула)

Размер (в байтах)

PartitionKey строка 0634012319400000000 2 * (19) 38
RowKey строка 43b7f32f389648639f16b55c6dcd7c4b

___WorkerRole1___WorkerRole1_IN_

0___0000000001652032029

2 * (87) 174
EventTickCount Int64 634012319404982640 2 * (14) + 8 + 8 44
DeploymentId строка 43b7f32f389648639f16b55c6dcd7c4b 2 * (12) + 2 * 32 + 4 + 8 100
Роль строка WorkerRole1 2 * (4) + 2 * 11 + 4 + 8 42
RoleInstance строка WorkerRole1_IN_0 2 * (12) + 2 * 16 + 4 + 8 68
уровень Int32 5 2 * (5) + 4 + 8 22
Pid Int32 1652 2 * (3) + 4 + 8 18
Врем Int32 2245 2 * (3) + 4 + 8 18
функция строка XTableConnection :: PushOutMessages 2 * (8) + 2 * 33 + 4 + 8 94
Линия Int32 +969 2 * (4) + 4 + 8 20
MDRESULT Int32 327705 2 * (8) + 4 + 8 28
ErrorCodeMsg строка Некоторое сообщение об ошибке. 2 * (12) + 2 * 19 + 4 + 8 74
Сообщение строка

Данные успешно отправлены (1 сообщение),

«–batch_36522ad7-fc75-4b56-8c71-56071383e000

Тип содержимого: multipart / mixed;

border = changeset_77162fcd-b8da-41ac-a9f8-9357efbbd000

Длина содержимого: 1811

–Changeset_77162fcd-b8da-41ac-a9f8-9357efbbd000

Тип содержимого: application

/ http

Content-Transfer-Encoding: двоичный

POST https: //cerebrataqa.table.core .

windows.net//WADDiagnosticInfrastr

uctureLogsTable HTTP / 1.1

Хост:

https://cerebrataqa.table.core.windows.net/

Content-ID: 1

Content-Type:

application / atom + xml; type = entry

Content-Length: 1329

x-ms-date:

пт, 23 апреля 2010 07:24:09 GMT

<? xml version = «1.0» encoding = «utf-8»

standalone = «yes»?> <entry xmlns: d = » http://schemas.microsoft.com

/ ado / 2007/08 / dataservices»

xmlns: m = » http://schemas.microsoft.com

/ ado / 2007/08 / dataservices / metadata»

xmlns = » http://www.w3.org/2005

/ Atom»> <title /> <updated> 2010-04 -23T07: 22: 00.711Z </ updated>

<автор> <имя /> </ author> <id /> <content type = «application / xml»>

<m: properties> <d: PartitionKey>

0634076041200000000 </ d: PartitionKey>

<d: RowKey> 0851db6534634c1fbc

e8496c6c57a2e3

___WorkerRole1___

WorkerRole1_IN_0___0000000001735393281

</ d: RowKey> <d: EventTickCount

m: type = «Edm.Int64»> 634076041207111524

</ d: EventTickCount>

<d: DeploymentId m: type = «Edm.String»> 0851db6534634c1fbce84

96c6c57a2e3 </ d: DeploymentId> <d: Роль m: type = «Edm.String»> Wo

rkerRole1 </ d: Role> <d: RoleInstance m: type = «Edm.String»> Worke

rRole1_IN_0 </ d: RoleInstance> <d: Уровень m: type = «Edm.Int32»> 4 </ d

: Level> <d: Pid m: type = «Edm.Int32»> 1400 </ d: Pid> <d: Tid
m: type = «E

dm.Int32″> 2712 </ d: Tid> <d: Функция m: type = «Edm.String»> </ d: Функция

> <d: Линия m: type = «Edm.Int32»> 0 </ d: Линия> <d: MDRESULT
m: type = »

Edm.Int32″> 0 </ d: MDRESULT> < d: ErrorCode m: type = «Edm.I

nt32″> 0 </ d: ErrorCode> <d: ErrorCodeMsg m: type = «Edm.String»>

</ d: ErrorCodeMsg> <d: Сообщение m: type = «Edm.String»> Проверка

обновлений конфигурации 23.04.2010 07 : 21: 55 .; TraceSource

Событие «Microsoft.WindowsAzure.Diagnostics» </ d: Message>

</ m: properties> </ content> </ entry>

–changeset_77162fcd-b8

da-41ac-a9f8-9357efbbd000–

–batch_36522ad7-fc75-4b56-8c71-5607138

2 * (7) + 2 * 1980 + 4 + 8 3986
         
накладные расходы       4
Всего / сущность       4730

Опять же, если я пишу одну запись / секунду, вот сколько я стою за месяц с точки зрения стоимости хранения:

4730 байт * 60 (секунд / минут) * 60 (минут / часов) * 24 (часов / дней) * 30 (дней / месяцев) * 0,125 долл. США / ГБ = 1,43 долл. США.

WADPerformanceCountersTable

атрибут

Тип данных

Образец данных

Размер (Формула)

Размер (в байтах)

PartitionKey строка 0634012319400000000 2 * (19) 38
RowKey строка 43b7f32f389648639f16b55c6dcd7c4b

___WorkerRole1___WorkerRole1_IN_

0___0000000001652032029

2 * (87) 174
EventTickCount Int64 634012319404982640 2 * (14) + 8 + 8 44
DeploymentId строка 43b7f32f389648639f16b55c6dcd7c4b 2 * (12) + 2 * 32 + 4 + 8 100
Роль строка WorkerRole1 2 * (4) + 2 * 11 + 4 + 8 42
RoleInstance строка WorkerRole1_IN_0 2 * (12) + 2 * 16 + 4 + 8 68
CounterName строка \% Процессора (_Total) \% времени процессора 2 * (11) + 2 * 35 + 4 + 8 104
Значение счетчика двойной 0.173347 2 * (12) + 8 + 8 40
         
накладные расходы       4
Всего / сущность 614

Если моя частота выборки составляет один раз в секунду, это то, сколько я в месяц несу с точки зрения стоимости хранения:

614 байтов * 60 (секунд / минут) * 60 (минут / часов) * 24 (часов / дней) * 30 (дней / месяцев) * 0,125 долл. США / ГБ = 0,185 долл. США.

Однако мы обычно собираем больше счетчиков производительности. Поэтому, если мы собираем 5 счетчиков производительности с одинаковой скоростью, стоимость хранилища возрастет в 5 раз и составит примерно 0,90 доллара.

WADWindowsEventLogsTable

атрибут

Тип данных

Образец данных

Размер (Формула)

Размер (в байтах)

PartitionKey строка 0634012319400000000 2 * (19) 38
RowKey строка 43b7f32f389648639f16b55c6dcd7c4b

___WorkerRole1___WorkerRole1_IN_

0___0000000001652032029

2 * (87) 174
EventTickCount Int64 634012319404982640 2 * (14) + 8 + 8 44
DeploymentId строка 43b7f32f389648639f16b55c6dcd7c4b 2 * (12) + 2 * 32 + 4 + 8 100
Роль строка WorkerRole1 2 * (4) + 2 * 11 + 4 + 8 42
RoleInstance строка WorkerRole1_IN_0 2 * (12) + 2 * 16 + 4 + 8 68
ProviderGuid строка {555908D1-A6D7-4695-8E1E-26931D2012F4} 2 * (12) + 2 * 38 + 4 + 8 112
Имя провайдера строка Диспетчер управления службами 2 * (12) + 2 * 23 + 4 + 8 82
EventId Int32 0 2 * (7) + 4 + 8 26
уровень Int32 5 2 * (5) + 4 + 8 22
Pid Int32 1652 2 * (3) + 4 + 8 18
Врем Int32 2128 2 * (3) + 4 + 8 18
канал строка система 2 * (7) + 2 * 6 + 4 + 8 38
RawXml строка <Event xmlns = ‘ http://schemas.microsoft.com/win/

2004/08 / events / event’

> <Система> <Имя поставщика =

‘Менеджер управления службами’ Guid = ‘{555908D1-A6D7

-4695-8E1E- 26931D2012F4} ‘EventSourceName =

‘ Диспетчер управления службами ‘/> <Qualifiers EventID =’ 163

84 ′> 7036 </ EventID> <Version> 0

</ Version> <Level> 4 </ Level> <Task> 0 </ Task>

<

Код операции > 0 </ код операции > <ключевые слова> 0 × 80000000000000 </ Keywords> <TimeCreated SystemTime =

‘2010-06-20T06: 35: 04.000Z’ /> <EventRecordID>

2237

</ EventRecordID> <Correlation /> <выполнение

ProcessID = ‘0 ′ ThreadID =’ 0 ′ /> <Channel>

System </ Channel>

<Компьютер> RD00155D317B6C </ Компьютер>

<Security /> </ System> <EventData> <Data Name = ‘param1 ′> SLUINotify </ Data> <Data
Name =’ param2 ′> остановлен </ Data>

</ EventData> </ Event>

2 * (6) + 2 * 676 + 4 + 8 1376
         
накладные расходы       4
Всего / сущность 2162

Предполагая, что я пишу одну запись / секунду, вот сколько я стою за месяц с точки зрения стоимости хранения:

2162 байта * 60 (секунд / минут) * 60 (минут / часов) * 24 (часов / дней) * 30 (дней / месяцев) * 0,125 долл. США / ГБ = 0,65 долл. США.

WADDirectoriesTable

атрибут

Тип данных

Образец данных

Размер (Формула)

Размер (в байтах)

PartitionKey строка 0634012319400000000 2 * (19) 38
RowKey строка 43b7f32f389648639f16b55c6dcd7c4b

___WorkerRole1___WorkerRole1_IN_

0___0000000001652032029

2 * (87) 174
EventTickCount Int64 634012319404982640 2 * (14) + 8 + 8 44
DeploymentId строка 43b7f32f389648639f16b55c6dcd7c4b 2 * (12) + 2 * 32 + 4 + 8 100
Роль строка WorkerRole1 2 * (4) + 2 * 11 + 4 + 8 42
RoleInstance строка WorkerRole1_IN_0 2 * (12) + 2 * 16 + 4 + 8 68
AbsolutePath строка C: \ Users \ Gaurav.Mantri \ AppData \ Local \ dftmp \ s0 \ deploy (60)
\ res \ deploy (60) .WAD_Basic.WADDemo.0 \ directory
\ DiagnosticStore \ LogFiles \ W3SVC1 \ u_ex1101191313.log
2 * (12) + 2 * 158 + 4 + 8 352
RelativePath строка развертывание (60) / WADDemo / развертывание (60) .WAD_Basic.WADDemo.0
/W3SVC1\u_ex11011913.log
2 * (12) + 2 * 81 + 4 + 8 198
Контейнер строка WAD-МИС-лога 2 * (9) + 2 * 16 + 4 + 8 62
Корневая директория строка C: \ Users \ Gaurav.Mantri \ AppData \ Local \ dftmp \ s0 \ deploy (60)
\ res \ deploy (60) .WAD_Basic.WADDemo.0 \ directory \ DiagnosticStore \ LogFiles
2 * (13) + 2 * 134 + 4 + 8 306
         
накладные расходы       4
Всего / сущность 1388

Предполагая, что я пишу одну запись / секунду, вот сколько я стою за месяц с точки зрения стоимости хранения:

1388 байт * 60 (секунд / минут) * 60 (минут / часов) * 24 (часов / дней) * 30 (дней / месяцев) * 0,125 долл. США / ГБ = 0,42 долл. США.

Некоторые соображения

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

Необходимо помнить несколько вещей:

  • Это очень упрощенный сценарий. В реальном коде у вас, вероятно, будет больше данных, особенно для атрибутов сообщений (или аналогичных).
  • Это для одного экземпляра. В зависимости от количества имеющихся у вас экземпляров эти суммы будут умножаться на этот коэффициент.
  • Обратите внимание, что это не разовые платежи. Если вы ничего не сделаете с этими данными, вы будете продолжать нести эти сборы месяц за месяцем.

Контроллинг затрат

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

Передача только тех данных, которые вам нужны для анализа

WAD дает вам возможность собирать много диагностических данных и передавать только выбранные. Если вы используете клиентскую библиотеку .Net Storage, вы можете указать, какие данные вы хотите собирать и какие данные вы хотите сохранить в Windows Azure Storage. Например, с помощью инфраструктуры трассировки / диагностики / журналов событий вы можете собрать все, но затем выбрать передачу только ошибок и выше типов журналов:

// Filter what will be sent to persistent storage.
var myLogLevel = LogLevel.Error;
config.Logs.ScheduledTransferLogLevelFilter = myLogLevel;
config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = myLogLevel;
config.WindowsEventLog.ScheduledTransferLogLevelFilter = myLogLevel;

Очевидно, что многое зависит от того, на какой стадии находится ваше приложение (другими словами, насколько оно стабильно) и какие данные важны для вас.

Полегче на счетчиках производительности!

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

Следите за журналами инфраструктуры диагностики!

Они могут быть изогнутым (или, как мы говорим в крикете) мячом, которого вы никогда не ожидали Улыбка. По сути, они автоматически создаются Windows Azure, т.е. вы не пишете в эти журналы, а Windows Azure делает, и обычно они довольно многословны, как мы видели в приведенном выше примере.

Убирать время от времени

Может не помешать время от времени чистить диагностические данные. Существует два подхода очистки данных:

Частичное удаление

Это будет означать удаление некоторых старых данных, например, удаление данных, которым исполнился один месяц. Вы можете использовать один из существующих инструментов для этого. Я знаю, что все инструменты Cerebrata способны на это, и они оптимизированы специально для удаления диагностических данных. Вы также можете написать свой собственный инструмент для этого. Этот инструмент будет извлекать диагностические данные для указанного вами диапазона дат, а затем удалять эти данные. Если вы в конечном итоге пишете свой собственный инструмент, просто помните, что НЕ нужно извлекать данные из атрибута Timestamp или EventTickCount . Всегда используйте PartitionKey. Некоторое время назад я написал сообщение в блоге об эффективной загрузке диагностических данных, которое вы можете прочитать здесь:

http://gauravmantri.com/2012/02/17/effective-way-of-fetching-diagnostics-data-from-windows-azure-diagnostics-table-hint-use-partitionkey/ .

Частичное удаление обычно обременительно в том смысле, что оно требует больше времени, а поскольку вы выполняете несколько операций чтения и удаления, вы несете расходы на транзакции и пропускную способность. Однако они дают вам большую гибкость.

Полное удаление

Полное удаление просто означает полное удаление таблицы. Например, если вы используете Cloud Storage Studio, вы можете просто щелкнуть правой кнопкой мыши по одной из этих таблиц и нажать «Удалить». Кажется простым и довольно безболезненным, не так ли? К сожалению, это не так. Время, необходимое для фактического удаления таблицы, зависит от объема данных, которые вы можете иметь в одной из этих таблиц. На самом деле удаление данных может занять несколько секунд или несколько дней.

Вот моя теория: когда вы удаляете таблицу, Windows Azure помечает эту таблицу как «Удаленную», поэтому дальнейшие операции с этой таблицей не могут быть выполнены, однако таблица не удаляется сразу. Вместо этого он передается какому-то процессу сбора мусора, который удаляет эту таблицу по собственному желанию, и вы не можете это контролировать.

Хуже всего то, что во время «удаления» таблицы любая попытка воссоздания таблицы приведет к ошибке. Таким образом, если ваше приложение постоянно записывает данные в таблицы WAD, это не получится.

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

Переключитесь на локально избыточное хранилище для диагностических данных

Поскольку локально избыточное хранилище примерно на 25% дешевле, чем хранилище с геоизбыточным хранилищем, вы, возможно, сможете сократить свои расходы на хранилище на такую ​​величину. Опять же, решение об этом должно основываться не только на стоимости, но и на требованиях доступности.

Резюме

Это были некоторые из моих мыслей о стоимостных аспектах WAD и о том, как вы можете это контролировать. Не стесняйтесь, если у вас есть больше информации, чтобы поделиться по этому поводу. Как всегда, если вы обнаружите какие-либо проблемы с этим сообщением в блоге, пожалуйста, дайте мне знать как можно скорее, и я исправлю их.

Примечание куратора: вы можете тестировать Azure сейчас в течение 3 месяцев, но это стоит НОЛЬ долларов . Они попросят номер вашей кредитной карты, но это только потому, что MS не хочет помогать в создании сверхмощного ботнета.