В статье рассмотрим особенности и преимущества нагрузочного тестирования веб-сервера, поговорим о том, почему оно важно и как правильно его проводить.
Под нагрузочным тестированием понимают проверку работоспособности веб-сервера, для чего используются специальные инструменты, позволяющие имитировать реальные нагрузки на серверные мощности. Такие программы создают эмуляцию активности заданного количества пользователей и документируют нагрузки. После этого собранные данные анализируются, и дается оценка производительности аппаратных мощностей, каналов связи и серверного ПО.
Большинство сайтов и приложений создаются для извлечения прибыли, или доходность проекта ставится в качестве одной из целей. И производительность сервера, его возможность обслуживать запланированное количество пользователей одновременно, становится ключевым фактором успеха.
Если сервер не справляется с наплывом посетителей, это приводит к уменьшению посещаемости, что, в свою очередь, становится причиной ухудшения поведенческих показателей сайта. В результате ресурс понижается в выдаче, а значит, снижается и естественный трафик, что приводит к сокращению продаж и доходов от рекламы. Не менее катастрофично это и для веб-приложения, которым пользуются тысячи людей.
Целью нагрузочного тестирования является проверка серверных мощностей в экстремальных условиях, когда они работают на пределе возможностей. Это позволяет оценить, нужно ли покупать дополнительные мощности или имеющихся будет достаточно для стабильной работы ресурса. Результат — предупреждение рисков падения сайта или приложения и значительная экономия в перспективе.
Для начала давайте разобьем всю процедуру на последовательные этапы:
Итак, перед тем как запускать нагрузочное тестирование, необходимо провести функциональное, которое выявит правильность выбранного ПО для решения задач пользователей. Далее определяем задачи тестирования, разрабатываем пользовательские сценарии и выбираем подходящие инструменты. Поговорим о каждом из этих этапов подробнее.
Тип и мощность нагрузки, а также отслеживание конкретных показателей будет зависеть от того, какие перед нами будут стоять задачи. Из конкретных задач отметим определение границ производительности сервера, проверка надежности конфигурации, отслеживание создаваемых бэкапов, выявление проблемных участков системы.
Если говорить о требованиях, то они тоже бывают разными, но чаще определяют времени обслуживания пользователей в процентах. И здесь важно знать, что стремление к 100% обслуженных пользователей в течение определенного времени неразумно, поскольку нужно оставлять запас (обычно около 10%). Запас понадобится, например, для действий системы, которые она выполнит при возникновении нештатной ситуации.
Здесь всё зависит от того, как устроена работа пользователей на сайте. Вот один из сценариев на примере интернет-магазина:
Конкретная схема будет зависеть от функционала сайта или приложения. После моделирования одного или нескольких типичных сценариев, определяем наиболее нагрузочные страницы и переходим к подбору инструментов, которые будут эмулировать нагрузку на эти места ресурса.
Если позволяют задачи, разумно пользоваться бесплатными инструментами для тестирования. Одним из самых популярных является JMeter от Apache. Это гибко настраиваемое кроссплатформенное ПО, которое поддерживает все веб-протоколы. Кроме того, под JMeter легко разрабатывать скрипты, имитирующие действия посетителей сайта или пользователей приложения. После разработки скриптов в программе задается уровень нагрузки, и тестировщики приступают к главному процессу.
Добавим, что JMeter не единственное приложение для нагрузочного тестирования. Для некоторых задач используются WAPT, NeoLoad, Siege, Gobench, WRK, Curl-loader, Tsung и ряд других инструментов. Каждый из этих продуктов имеет свои особенности, и перед выбором одного или нескольких стоит внимательно изучить их описания и дополнительную информацию (многое можно почерпнуть в обзорах и на тематических форумах).
Следуя типичным сценариям и выбрав подходящие инструменты, приступаем к тестам. Для большинства сценариев подойдет последовательное увеличение нагрузки. Постепенно повышаем количество посылаемых потоков до тех пор, пока не будет зафиксировано увеличение времени ответа. Это первая проблемная точка, которую часто называют «точкой деградации».
Вторая точка, которую уже можно назвать подкритической, наступает, когда время обслуживания превышает установленные пределы. Иными словами, это точка нарушения уровня SLA, обслуживания сервисных процессов. Сервер всё ещё в состоянии обрабатывать запросы, однако время ответа достигло порогового уровня. Начиная с этого момента, задержки начинают накапливаться, как снежный ком, и система быстро достигает критической точки.
Критическая точка называется «точкой отказа». Это момент, когда либо иссякают ресурсы процессора, либо заканчивается свободная память. В результате сервер повисает, а значит, время завершать тесты и подводить итоги.
Анализируем собранные тестировщиками данные и выявляем «узкие» места. В некоторых случаях проблему можно решить, просто изменив настройки или поправив код. Бывает и так, что из нескольких сервисов проекта тормозит работу какой-то один, и тогда нужно поработать с ним. Это решается изменением настроек или масштабированием. Но при значительном количестве пользователей наиболее частая проблема заключается в перегрузке физических мощностей. Так что придется провести модернизацию аппаратной части: добавить оперативной памяти, перейти на более производительный процессор и т. п.
Нагрузочное тестирование сервера — обязательная процедура для тех, кто не хочет столкнуться с отказом растущего сайта, сервиса или приложения. Как показывает практика, с помощью только настройки конфигурации или корректировки кода можно в разы увеличить производительность сервера. Но для того, чтобы это сделать, нужно выявить те самые «узкие» места в системе, а это как раз и есть цель нагрузочного тестирования.