Давайте немного поговорим о 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 байта для длины двоичного массива
На момент написания этого блога стоимость хранения 1 ГБ данных в хранилище Windows Azure составляла:
$ 0,125 — Geo избыточное хранилище
$ 0,093 — локально избыточное хранилище
Операционные расходы
Это стоимость вставки записей в хранилище таблиц Windows Azure. WAD использует транзакции группы объектов, а таблицы PartitionKey для WAD фактически представляют дату / время (в UTC) с точностью до минут. Это означает, что за каждую минуту диагностических данных, хранящихся в табличном хранилище, вы берете плату за одну транзакцию. Это основано на предположении, что
- Вы не собираете более 100 точек данных в минуту, поскольку существует ограничение в 100 сущностей на одну транзакцию группы сущностей. Например, если вы собираете 5 счетчиков производительности каждую секунду, то через минуту вы собираете 300 точек данных в минуту. В этом случае для передачи этих данных WAD потребуется выполнить 3 транзакции.
- Общий размер полезной нагрузки составляет менее 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 dm.Int32″> 2712 </ d: Tid> <d: Функция m: type = «Edm.String»> </ d: Функция > <d: Линия m: type = «Edm.Int32»> 0 </ d: Линия> <d: MDRESULT 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 </ 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. Некоторое время назад я написал сообщение в блоге об эффективной загрузке диагностических данных, которое вы можете прочитать здесь:
Частичное удаление обычно обременительно в том смысле, что оно требует больше времени, а поскольку вы выполняете несколько операций чтения и удаления, вы несете расходы на транзакции и пропускную способность. Однако они дают вам большую гибкость.
Полное удаление
Полное удаление просто означает полное удаление таблицы. Например, если вы используете Cloud Storage Studio, вы можете просто щелкнуть правой кнопкой мыши по одной из этих таблиц и нажать «Удалить». Кажется простым и довольно безболезненным, не так ли? К сожалению, это не так. Время, необходимое для фактического удаления таблицы, зависит от объема данных, которые вы можете иметь в одной из этих таблиц. На самом деле удаление данных может занять несколько секунд или несколько дней.
Вот моя теория: когда вы удаляете таблицу, Windows Azure помечает эту таблицу как «Удаленную», поэтому дальнейшие операции с этой таблицей не могут быть выполнены, однако таблица не удаляется сразу. Вместо этого он передается какому-то процессу сбора мусора, который удаляет эту таблицу по собственному желанию, и вы не можете это контролировать.
Хуже всего то, что во время «удаления» таблицы любая попытка воссоздания таблицы приведет к ошибке. Таким образом, если ваше приложение постоянно записывает данные в таблицы WAD, это не получится.
Некоторые люди рекомендуют сменить учетную запись хранилища для диагностики, прежде чем сделать это. Таким образом, ваша учетная запись хранения не будет активно использоваться ни одним из ваших приложений, пока вы удаляете таблицы из этой учетной записи хранения, а диагностические данные переходят в отдельную учетную запись хранения, и вы не теряете никакой информации.
Переключитесь на локально избыточное хранилище для диагностических данных
Поскольку локально избыточное хранилище примерно на 25% дешевле, чем хранилище с геоизбыточным хранилищем, вы, возможно, сможете сократить свои расходы на хранилище на такую величину. Опять же, решение об этом должно основываться не только на стоимости, но и на требованиях доступности.
Резюме
Это были некоторые из моих мыслей о стоимостных аспектах WAD и о том, как вы можете это контролировать. Не стесняйтесь, если у вас есть больше информации, чтобы поделиться по этому поводу. Как всегда, если вы обнаружите какие-либо проблемы с этим сообщением в блоге, пожалуйста, дайте мне знать как можно скорее, и я исправлю их.
Примечание куратора: вы можете тестировать Azure сейчас в течение 3 месяцев, но это стоит НОЛЬ долларов . Они попросят номер вашей кредитной карты, но это только потому, что MS не хочет помогать в создании сверхмощного ботнета.