Нагрузочное тестирование, используя облачный сервис
Всем доброго дня!
Недавно для одного из заказчиков проводил нагрузочное тестирование веб портала. Результат оказался достаточно неожиданным, веб сайт лег раньше, чем предполагалось:) Посему в данной статье хочу поделится опытом проведения нагрузочных тестов, используя инструмент Visual Studio и облачный сервис Visual Studio Team Services (бывший Visual Studio Online).
Зачем проводить нагрузочные тесты
Но прежде, чем мы начнем погружаться в технические детали, немного теории. Зачем вообще проводить нагрузочные тесты? Вопрос достаточно важный, и в зависимости от того, как вы на него отвечаете, выбирается та или иная стратегия тестирования нагрузки.
Во многих случаях нагрузочные тесты проводят для того, чтоб определить максимальное количество пользователей, которые могут обслуживаться на выбранном сервере. Соответственно, нагрузочные тесты проводят перед запуском продукта на продуктиве. Казалось бы, вроде ничего криминального... Но подобный подход не дает вам ответа на вопрос: а можно ли на данном сервере обслужить большее количество пользователей? Возможно, нужно немного оптимизировать код, и сервер сможет корректно обслуживать большее количество запросов?
Конечно, можно перед запуском проекта покопаться в коде, найти слабые места, попробовать поправить, но все же не самый эффективный способ оптимизации, так как отсутствуют адекватные метрики. Откуда вы знаете, что улучшения, которые вы сделали, достаточны, чтобы сказать: лучше это приложение работать не будет. Что такое «лучше»? Где эталон? Насколько далеко мы от него ушли?
Задавая эти вопросы, мы плавно переходим во второй подход проведения нагрузочных тестов. Нагрузочные тесты нужно проводить регулярно во время работы над проектом (например, в конце спринта). Причем начинать нужно с момента, когда у вас готов каркас. Результат проведения нагрузочного теста на эталонном сервере, куда вы публикуете каркас вашего приложения, — это и есть эталон. Дальнейшие измерения вам покажут изменения относительно эталона. И если изменения драматические, это повод провести дополнительные работы для оптимизации кода. Проще искать проблемы с производительностью на ранних этапах, нежели пытаться перелопатить весь проект в конце.
Оборудование для генерации нагрузки
Есть еще одна проблема проведения нагрузочных тестов. Это оборудование (сервера), которое будут генерить нагрузку. Проблема в том, что для проведения адекватных нагрузочных тестов рядом с эталонным сервером, приближенным по параметрам к боевому, нужно поставить такой же или лучше для генерации нагрузки. Более того, вы рискуете получить неадекватные результаты в том случае, если ваш боевой сервер торчит наружу по порту 80, а тестируете вы его используя локальную сеть организации, где стоит ваш генерирующий нагрузку сервер.
Попробуйте обосновать для службы закупок покупку сервера, который вы собираетесь использовать раз в 2 недели один-два часа. Очень часто в этом случае задействуют сервера, которые не используются (устаревшие), либо на время тушат какие-то приложения внутри организации, дабы задействовать высвободившиеся ресурсы под нагрузочные тесты (такой сценарий большая редкость, но на своем опыте видал и такое). В обеих вариантах есть свои недостатки. Наприем, не использующееся сервера могут либо списать, либо отключить для экономии электропитания, либо снять с поддержки и т.д. А процесс согласования прерывания работы какого-то приложения внутри организации — это ад для всех.
В общем, вы, наверное, поняли, на что я намекаю: надо использовать облачные ресурсы с оплатой по часам. На серверы нужно залить и настроить необходимый софт для генерации нагрузки (иногда это не тривиальная задача).
Тестирование с помощью Visual Studio Team Services
Я предлагаю для генерации нагрузки использовать Visual Studio Team Services (бывший Visual Studio Online). Итак, что нам надо:
— Аккаунт в Visual Studio Team Services. >Бесплатно его можно взять тут.
— Visual Studio Enterprise. Триальная версия тут.
Итак, приступим:
После того, как вы создали бесплатный аккаунт в Visual Studio Team Services, вам необходимо создать новый проект, указав название и систему контроля версий, которую вы будете использовать (для этой демонстрации не принципиально, какую выбирать):
После этого нам необходимо привязать созданный аккаунт к Visual Studio. Для этого в Team Explorer в Visual Studio нам нужно ввести параметры соединения к нашему проекту:
Также необходимо будет добавить нового пользователя в список аккаунтов Visual Studio и ввести пароль:
После соединения в окне «Connect to Team Foundation Server» отобразится список проектов. У нас он один, его и выбираем:
Далее создаем новый проект в Visual Studio. В разделе «Test» выбираем «Web performance and Load Test Project», задаем новое имя проекту:
После нажатия на кнопку «ОК» у нас появится новый проект веб теста. Собственно, сейчас наша задача записать этот веб тест. Для этого в нашем веб тесте жмем кнопку «Add recording»:
Откроется веб браузер. Все, что вы будете в нем делать, будет записано. Я просто зашел на главную страничку dou.ua, собственно ее и будем тестировать :)
Возвращаемся в Visual Studio и жмем Stop recording:
Если после нажатия «Stop recording» ничего не поменялось (в веб тесте не появился записанный url с набором атрибутов), нужно включить аддон в веб браузере «Microsoft Web Test Recorder Helper»:
В итоге картина должна быть примерно такая:
Поудаляем лишнее:
Все, веб тест записан, теперь его нужно запустить из под нужного количества виртуальных пользователей. Для этого в наш проект Visual Studio добавляем Load Test. Клин по проекту нашего веб теста в Solution Explorer -> Add -> Load Test:
У нас откроется wizard, который нужно пройти. На первом шаге выбираем «Cloud-based Load Test with Visual Studio Team Services»:
Далее выбираем локацию дата центра, откуда будет генерироваться нагрузка:
Далее устанавливаем длительность теста:
После доходим до «Load Pattern». Выбираем «Step Load». Смысл тут в том, что есть стабильная нагрузка. Это значит, что нагрузка будет генерировать от заданного количества пользователей на протяжении теста.
Мы же выбираем более интересный сценарий, в камках которого количество одновременных пользователей будет постепенно возрастать по заданному шаблону:
Как вы догадались, мы нагрузим DOU тысячей одновременных пользователей.
Далее в Test Mix добавляем наш веб тест:
После этого можем сконфигурировать микс браузеров, после чего жмем Finish. Запускаем нагрузочный тест:
Пройдет какое-то время, и мы начнем видеть графики зависимости времени ответа от количества одновременных пользователей:
По окончанию теста можно загрузить в Visual Studio детальный отчет и посмотреть, что происходит. В данном конкретном случае увидел, что почти сразу начали валится ошибки. Вот статистика по всем ошибкам теста:
Интересными являются
Прелесть в том, что мы можем проанализировать каждую запись отдельно:
Подозреваю, что это сработала защита веб сервера, так как с одного IP повалило куча запросов. При этом во время проведения теста я периодически рефрешил страничку у себя в браузере, все было ОК (помним, что нагрузка генерилась из облака).
Детальные отчеты вы можете выгрузить в Excel и проанализировать там. А если у вас есть предыдущие измерения, то Visual Studio умеет анализировать, насколько изменилась производительность с прошлого раза.
Это вкратце о нагрузочных тестах. В следующий раз планирую рассказать, как обнаружить виновных в деградации производительности вашего приложения.