Мы рассмотрим инструмент для нагрузочного тестирования — Visual Studio Online – и сравним его с ручным подходом.
Нагрузочное тестирование с использованием Visual Studio Online позволяет автоматически создавать и конфигурировать всю необходимую инфраструктуру в облаке — разворачивая контроллер и необходимое количество агентов с определенными настройками. Результаты прогона того или иного теста всегда остаются в облачной базе VS Online, и к ним в любой момент можно получить доступ.
Раньше я не использовал данный подход по двум основным причинам:
— инфраструктура работала нестабильно и часто падала,
— не было возможности снятия счетчиков производительности с нагружаемой системы,
т.о. результаты тестирования ограничивались данными по пропускной способности.
В Update 3 на Visual Studio 2013 появилась возможность прямо в процессе нагрузочного тестирования динамически подгружать необходимые счетчики производительности из телеметрии Application Insights (подробнее можно прочитать здесь, однако с только для общего образования – со времени написания статьи произошло много изменений).
Мы рассмотрим настройку Application Insights для простого WCF сервиса Calculator (из предыдущей статьи), а также протестируем его на нагрузку с помощью Visual Studio Online.
[ServiceContract]
public interface ICalculator
{
[OperationContract]
int Sum(int a, int b, int timeOutInMiliseconds);
}
Также мы сравним новый подход с описанным в прошлом посте.
Нам понадобится:
— Visual Studio Ultimate 2013 (Update 4),
— Аккаунт Visual Studio Online
— Одна виртуальная машина в Microsoft Azure.
— Тестовые данные
Загрузить проект, использующийся в статье.
(теперь хостом для WCF сервиса будет не Windows Service, a IIS).
Конфигурирование окружения
Создаем через Azure консоль новую виртуальную машину (я эксперементировал на образе Windows Server 2012 R2). При создании виртуальной машины следует открыть 80й порт (HTTP).
После успешного создания виртуальной машины подключаемся к ней через RDP. Для того, чтобы запустить на нашей виртуальной машине WCF HTTP сервис, следует поставить туда дополнительные компоненты (IIS и т.п.). Делается это очень просто:
- Открыть Service Manager и в меню Manage выбрать Add Roles and Feature.
- На шаге Installation Type выбрать пункт Role-based or 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
После успешной настройки виртуальной машины через портал Azure надо создать новый аккаунт Visual Studio Online (либо использовать уже созданный).
Далее перейти в меню управления VS Online в браузере и кликнуть по ссылке Application Insights.
По умолчанию, если в Application Insights не добавлено ни одного приложения, то откроется страничка настройки простого теста, проверяющего доступность некого URL адреса. Это можно пропустить и нажать ссылку Iwanttomonitorsomethingelse.
После этого для дальнейшей настройки надо будете ответить на несколько простых вопросов (см. скрин)
Увеличить
Далее нажать Click here to show instructions.
На следующей странице надо будет указать произвольное имя приложения и нажать Create (если быть точнее, то имя виртуального контейнера Application Insights, где будет храниться диагностическая информация).
Увеличить
После этого портал автоматически сгенерирует ApplicationInsights.config (конфиг файл с персональными настройками диагностики) и инсталлятор MicrosoftMonitoringAgent.
Далее следует скопировать ApplicationInsights.config в корневую папку сервиса Calculator на виртуальной машине и установить агент.
Обратите внимание, что во время установки надо поставить галочку
После установки следует перезапустить IIS.
По умолчанию ApplicationInsights.config настроен таким образом, что статистика будет собираться только с нескольких базовых счетчиков производительности. Но мы можем добавить в этот файл дополнительные счетчики — для этого их достаточно перечислить в специальном виде внутри XML секции PerformanceCounters, например:
Увеличить
Для того, чтобы узнать правильное наименование нужных счетчиков, я рекомендую их выгрузить через утилиту perfmon. Для этого добавьте в Performance Monitor необходимые счетчики, выделите их и сохраните правой кнопкой мыши в html-формат.
Увеличить
Если открыть сохраненный файл в блокноте, то там можно посмотреть правильное наименование счетчиков вот в таком виде:
Увеличить
Запуск тестов
Открыть в VisualStudio тестовый солюшин (из тестовых данных).
В меню студии Teamexplorer подключиться к созданному аккаунту Visual Studio Online.
Увеличить
Далее в солюшине открыть файл Remote.testsetting и на первой же вкладке выбрать RuntestsusingVisualStudioOnline.
Увеличить
Так как у нас очень простой тест, то дополнительные шаги в файле testsettings можно пропустить. С помощью этих шагов, можно конфигурировать виртуальные тестовые агенты (например, установить сертификаты, что актуально для HTTPS сервисов, запустить любые батники и др.).
Далее в аппконфиге проекта RemoteTestProject надо прописать правильный URI, который прослушивает WCF Service Calculator.
Теперь можно переходить к настройке нагрузочного теста.
По умолчанию нагрузочный тест будет запускаться в 250 потоков на 2х одноядерных агентах, т.е. каждый агент будет генерировать нагрузку в 125 потоков.
Для увеличения количества агентов, следует использовать настройку RunSettings =>AgentCount (TotalCores). Посмотреть некоторые дополнительные настройки, а также возможные проблемы можно по ссылке.
Для подключения счетчиков производительности из ApplicationInsights необходимо правой мышью кликнуть на RunSettings => GetPerformanceDatafromApplicationInsights и выбрать интересующие счетчики.
Увеличить
Во время запуска нагрузочных тестов Visual Studio Online начнет выделять ресурсы для агентов
Увеличить
После того, как ресурсы будет выделены, начнется cам нагрузочный тест
Увеличить
Счетчики производительности из 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).