Інструменти тестування Visual Studio Online, досвід використання та порівняння з ручним підходом
У попередньому пості ми розглянули створення інфраструктури для хмарного тестування навантаження на віртуальних машинах Microsoft Azure. Тепер ми розглянемо інструмент для тестування навантаження - Visual Studio Online - і порівняємо його з ручним підходом.
Навантажувальне тестування з використанням Visual Studio Online дозволяє автоматично створювати та конфігурувати всю необхідну інфраструктуру у хмарі – розгортаючи контролер та необхідну кількість агентів із певними налаштуваннями. Результати прогону того чи іншого тесту завжди залишаються в базі VS Online, і до них у будь-який момент можна отримати доступ.
Раніше я не використовував даний підхід з 2м основних причин: - інфраструктура працювала нестабільно і часто падала - не було можливості зняття лічильників продуктивності з системи, що навантажується, т. результати тестування обмежувалися даними пропускної спроможності.
У Update 3 на Visual Studio 2013 з'явилася можливість прямо в процесі навантажувального тестування динамічно підвантажувати необхідні лічильники продуктивності з телеметрії Application Insights (докладніше можна прочитати тут, проте лише для загальної освіти – з часу написання статті відбулося багато змін).
Ми розглянемо налаштування Application Insights для простого WCF сервісу Calculator (з попередньої статті) і протестуємо його на навантаження за допомогою Visual Studio Online.
Також ми порівняємо новий підхід із описаним у минулому пості. Нам знадобиться:
- Visual Studio Ultimate 2013 (Update 4), - Акаунт Visual Studio Online - Одна віртуальна машина в Microsoft Azure. — Тестові дані
Завантажити проект, який використовується у статті. (тепер хостом для WCF сервісу буде не WindowsService, IIS).
Конфігурування оточення
Створюємо через Azure консоль нову віртуальну машину (я експериментував на образі Windows Server 2012 R2). При створенні віртуальної машини слід відкрити 80-й порт (HTTP).
Після успішного створення віртуальної машини підключаємось до неї через RDP. Щоб запустити на нашій віртуальній машині WCF HTTP сервіс, слід поставити туди додаткові компоненти (IIS і т.п.). Робиться це дуже просто:
- ВідкритиService Managerі в менюManageвибратиAdd Roles and Feature.
- На кроціInstallation Typeвибрати пунктRole-based або feature based installation.
- На кроціFeaturesрозкрити список фіч.NET Framework 4.5 Features => WCF Servicesі відзначити чекбоксомHTTP Activation.Інсталятор сам підключить інші залежні компоненти IIS, ASP.NET тощо.
- Запустити процес встановлення

Після успішного налаштування інфраструктури слід задеплоїти наш WCF сервіс. Для цього:
- З папки з тестовими даними, скопіювати папкуServiceу довільну директорію на віртуальній машині.
- Відкривати консоль керуванняIIS(Server Manager=> Tools=> Internet Information Service (IIS))
- Створити всередині дефолтового веб-сайту новий Application з сервісом калькулятора

Далі, щоб переконатися, що все працює правильно, можна прямо в браузері відкрити сервіс - http://localhost/applicationName/Calculator.svc
Повинна відкритися сторінка, що містить посилання для створення wsdl

Налаштування Application Insights
Далі перейти в меню управління VS Online у браузері та клацнути на посилання ApplicationInsights.

Далі натиснутиClick here to show instructions.
На наступній сторінці потрібно буде вказати довільне ім'я програми та натиснутиCreate(якщо бути точніше, то ім'я віртуального контейнера Application Insights, де зберігатиметься діагностична інформація).

Після цього портал автоматично згенерує ApplicationInsights.config (конфіг файл з персональними налаштуваннями діагностики) та інсталяторMicrosoftMonitoringAgent. Далі слід скопіювати ApplicationInsights.config у кореневу папку сервісу Calculator на віртуальній машині та встановити агент.
Зверніть увагу, що під час встановлення треба поставити галочку

Після інсталяції слід перезапустити IIS.
За промовчанням ApplicationInsights.config налаштований таким чином, що статистика буде збиратися лише з кількох базових лічильників продуктивності. Але ми можемо додати до цього файлу додаткові лічильники – для цього їх достатньо перерахувати у спеціальному вигляді всередині XML секції PerformanceCounters, наприклад:
Для того, щоб дізнатися про правильне найменування потрібних лічильників, я рекомендую їх вивантажити через утилітуperfmon.Для цього додайте в Performance Monitor необхідні лічильники, виділіть їх і збережіть правою кнопкою миші в html-формат.

Якщо відкрити збережений файл у блокноті, то там можна подивитися правильне найменування лічильників ось у такому вигляді:
Запуск тестів

Далі в солюшині відкрити файл Remote.testsetting і на першій же вкладці вибратиRuntestsusingVisualStudioOnline.

Далі в апконфізі проекту RemoteTestProject треба прописати правильний URI, який прослуховує WCF Service Calculator.
Тепер можна переходити до налаштування тесту навантаження.
За умовчанням навантажувальний тест запускатиметься у 250 потоків на 2х одноядерних агентах, тобто. кожен агент буде генерувати навантаження 125 потоків. Для збільшення кількості агентів, слід використовувати налаштуванняRunSettings=>AgentCount(TotalCores).Переглянути деякі додаткові налаштування, а також можливі проблеми можна за посиланням.
Для підключення лічильників продуктивності зApplicationInsightsнеобхідно правою мишею клікнути наRunSettings=>GetPerformanceDatafromApplicationInsightsі вибрати лічильники, що цікавлять.

Під час запуску тестів навантаження Visual Studio Online почне виділяти ресурси для агентів

Після того, як ресурси буде виділено, почнеться сам навантажувальний тест

Лічильники продуктивності зApplicationInsightsу процесі навантажувального тесту будуть на вкладціApplication

Після завершення тесту звіт можна завантажити та подивитися у звичному вигляді

Порівняння методик
Для експерименту я провів тестування навантаження даного WCF сервісу із застосуванням обох підходів.
У першому випадку я розгорнув 2 одноядерні віртуальні машини і встановив на них Агенти Visual Studio. Поставив локальний контролер та запустивтест. В результаті два агенти змогли згенерувати навантаження приблизно 500 викликів в секунду, при цьому завантаження CPU на обох агентах доходило до 100%, в той же час завантаження процесора на віртуальній машині з тестовим сервісом становило приблизно 15-20% (основний внесок природно вносив процес w3wp).
Повторив цей тест, але із застосуванням Visual Studio Online + Application Insights (Agent total count = 2). Результат виявився ідентичним першому, 2а одноядерних хмарних агента генерували безперервне навантаження приблизно 500 запитів на секунду. Дочекавшись завершення тесту, я скачав звіт і виявив, що на віртуальних агентах CPU також завантажили на 100%

Збільшення кількості ядер агентів до 4х показало майже лінійне зростання навантаження в середньому майже до 800 запитів в секунду (завантаження сервера при цьому становило в середньому 40%). Таким чином я припустив - наш простенький WCF сервіс Calculator здатний витримати навантаження в 3000 паралельних запитів за секунду (працюючи на одноядерній машині) з урахуванням того, що ми ще запитаємо передаємо тайм-аут 1 мс. Насправді все виявилося не так. Коли я запустив тест навантаження на 10 агентах (250 потоків), максимальна продуктивність склала приблизно 1000 запитів в секунду, при цьому агенти були недовантажені (завантаження CPU 30%), а сервер перевантажений (CPU 100%).
Я почав розбиратися і переписав свій навантажувальний тест, щоб побачити зростання залежності CPU сервера від зростаючого навантаження. Кожні 10 секунд навантаження зростало на 5 користувачів.
Приблизно на позначці 100 користувачів спостерігається максимальна продуктивність
1000 запитів на секунду, подальше збільшення навантаження призводить до швидкої деградації CPU сервера Calculator.

VS Online дозволяєпіднімати хмарну інфраструктуру навантажувального тестування, необхідної потужності, практично перемиканням однієї кнопки. Причому варто відзначити — ця інфраструктура нічим не поступається класичною (з агентами та контролером). Тепер про ціну. Application Insights зараз знаходиться в Preview і надається безкоштовно. Одна хвилина віртуального користувача коштує 1 копійку, в т.ч. навантажувальний тест 1000 віртуальних користувачів на 10 хвилин обійдеться вам приблизно в 100 рублів (незалежно на одному агенті у вас генерується навантаження або 10).