Ваше приложение может быть практически идеальным, но если оно не имеет возможности масштабирования, то внезапный пик трафика может подвесить всю систему. Поэтому обеспечить возможность быстрого расширения доступной базы ресурсов и протестировать возможности масштабирования в стресс-тестах на нагрузку – важно для обеспечения стабильности работы.

Важность масштабирования

Масштабируемость это, в первую очередь, способность сети, системы или процесса адаптироваться к внезапным изменениям. Это может быть резко возросший поток посетителей или объем передачи данных или какие-то другие нагрузки. Тесты масштабируемости симулируют различные сценарии возникновения подобных пиковых нагрузок, чтобы проверить готовность вашего приложения к критическим ситуациям.

Стресс-тесты очень важны, потому что неспособность вашего приложения справляться с нагрузками может похоронить все ваши усилия по развитию бизнеса. К примеру, если вы планируете большие продажи в рамках какой-то акции, то должны подготовиться к резкому увеличению привлеченных вами покупателей. Иначе сайт не выдержит нагрузки, и те покупатели, на привлечение которых вы тратили средства и силы, попросту уйдут, хотя были уже готовы что-то у вас купить. Например, так случилось с канадской железнодорожной компанией VIA Rail, которая объявила о скидках в честь 150-летия Канады. Акция оказалась настолько популярной, что приток покупателей практически остановил все онлайн продажи этой компании.

Масштабируемость, надежность и производительность – практически синонимы. Они характеризуют то, насколько ваша система готова к рабочим нагрузкам.

Для улучшения масштабируемости нет единого подхода. То, что годится для небольшого сайта, не подойдет для серверов MMORPG. Разработчик должен понимать особенности своего приложения. Например, если ваш сайт сильно зависит от производительности базы данных, вы должны обратить внимание на ее функционирование при резко возрастающем потоке посетителей.

Тестирование масштабирования

Основная задача нагрузочного теста проста – определить, в какой момент и почему система перестает справляться с нагрузкой и как это можно исправить. Но этот процесс не так прост, как кажется. И часто требуются определенные компромиссы и сложные решения. Например, при написании PHP-приложения придется пожертвовать скоростью, но организовать загрузку данных не одним файлом, а по частям.

Тестирование поможет вам определить как снижение производительности приложения на стороне клиента и ухудшение его клиентских качеств для пользователя, так и устойчивость ваших серверов к нагрузкам.

При тестировании масштабируемости нужно учитывать ряд факторов:

  • Время отклика
  • Время отрисовки на экране
  • Пропускную способность
  • Количество запросов в секунду
  • Использование сети
  • Использование памяти
  • Время, требуемое для выполнения задач

Цели тестирования масштабирования

В идеале, конечно, хотелось бы, чтобы приложение работало одинаково хорошо во всех ситуациях. Но это, увы, недостижимые мечты. Надо ставить реалистичные цели. И более конкретные.

Например, «приложение должно при определенной нагрузке иметь определенное время отклика». И уточнить – какое. Другая цель – «сервер должен оставаться работоспособным при большой нагрузке». И уточнить, что имеется в виду под «большой нагрузкой». Или – «время проведения транзакции при 100 одновременных посетителях не должно быть больше 4 секунд» — тоже конкретная цель.

Приложения нужно протестировать на различные параметры, и конечным итогом ваших тестов должно явиться понимание, что именно ограничивает производительность при пиковых нагрузках – сеть, базы данных, оборудование или программное обеспечение.

Подготовка к тестированию

Когда вы разрабатываете новое приложение, вы не знаете, сколько у него будет пользователей через несколько лет. И по мере того, как к вам будет приходить успех, у вас будут множиться проблемы. Например, если вы храните данные о новых посетителях в базе данных, внезапный рост посещаемости может замедлить работу всего, что завязано на базы данных.

Поскольку разные ситуации порождают разные проблемы, нужно тестировать приложения с малым, средним и большим приростом нагрузки. При небольших нагрузках все должно работать безупречно, и этот тест поможет вам определить базовую производительность вашей системы. Средние нагрузки помогут понять, как будет себя вести приложение в обычном режиме, под нагрузкой, а большие – как оно справляется с пиковым приростом посетителей. И на каждом этапе, наверняка, вскроются свои проблемы.

Нужно быть уверенным, что конфигурация оборудования и среды остается во всех режимах тестирования одной и той же.

Рисунок ниже показывает почти идеальную зависимость использования памяти от времени. В данном тесте нагрузка постепенно возрастает, и время показывает фактически величину нагрузки. Идеально масштабируемая система сначала демонстрирует рост потребляемых ресурсов, а затем – стабильные показатели. График говорит о том, что памяти хватает на все три режима нагрузки.

Другой график, ниже, иллюстрирует пропорциональный нагрузке рост использования ресурсов. В данном случае растет время исполнения запроса с ростом числа посетителей.

Пропорциональный рост говорит о том, что в принципе, ваше оборудование работает как положено и тут не возникнет внезапного ухудшения производительности при росте числа посетителей. Если же он не пропорционален нагрузке, надо обратить внимание на ресурсы оборудования, изменить их конфигурацию для достижения желаемого результата и снова – тестировать.

Масштабирование – вертикальное или горизонтальное

После первого цикла тестов вы будете менять конфигурацию оборудования. Расширять или же увеличивать производительность – масштабировать горизонтально или вертикально. Это не одно и то же.

  • Вертикальное масштабирование – замена оборудования на более производительное. Например, замена процессора на более мощный
  • Горизонтальное масштабирование – увеличение количества доступных ресурсов. Например, подключить для обслуживания вашего приложения еще один сервер

Оба этих подхода имеют как плюсы, так и минусы. Вертикальное масштабирование выглядит проще, но у процессоров есть предел производительности, и тут не получится повышать мощность сколько угодно. Горизонтальное масштабирование дает стабильный результат прироста мощности, но это может оказаться затратным.

Тестирование масштабирования – чек-лист

Вот типичная последовательность действий при тестировании масштабирования:

  1. Выберите какой-нибудь повторяющийся во время выполнения вашего приложения процесс
  2. Определите ваши критерии, по которым будете оценивать масштабируемость и производительность
  3. Составьте список инструментов для тестирования
  4. Зафиксируйте окружение и конфигурацию оборудования
  5. Составьте план, продумайте сценарии нагрузочного теста
  6. Напишите визуальный скрипт и загрузите тестовые сценарии
  7. Выполните тесты
  8. Проанализируйте результаты

Информация, полученная вами, послужит руководством для проведения апгрейдов. Например, если ваша компания ожидает рост посещаемости на 400 процентов в ближайшие месяцы, надо повышать производительность серверов. Или добавлять память. Возможно – надо менять серверное ПО. Все это вы должны выяснить в процессе тестирования. Тесты должны помочь вам выработать грамотную стратегию повышения производительности.

Разработка стресс-тестов

Нагрузочное тестирование имеет смысл и пользу только тогда, когда сценарии стресс-тестов хорошо проработаны. Параметры нагрузки продуманы в соответствии с реально ожидаемыми нагрузками и возможностями оборудования, а конфигурация аппаратной среды и окружения зафиксирована и одинакова для всех серий тестов. При этом должны контролироваться различные параметры, характеризующие загрузку – использование памяти, нагрузка на процессор и т.п.

Вот типичные шаги при разработке грамотного теста.

  1. Начните с разработки различных сценариев поведения пользователей. Проверьте их и задокументируйте – какие именно запросы поступают приложению в процессе их исполнения.
  2. Спроектируйте тест, моделирующий различное количество одновременных посетителей, с различной скоростью сети и различными версиями браузеров.
  3. Запустите тест, моделируя поступающие от пользователей запросы.
  4. Масштабируйте оборудование или программное обеспечение.
  5. Повторите тесты – и так до тех пор, пока производительность не будет соответствовать вашим требованиям.

Обеспечьте одинаковую конфигурацию и одинаковый сценарий роста нагрузки в различных тестах. IBM, кстати, разработало огромную инструкцию по проведению стресс-тестов.

Советы по улучшению масштабируемости и проведению тестов

  1. Разгрузите свою базу данных, ограничив количество открытых соединений и транзакций. Но не перекладывайте все на приложение – непропорциональное распределение нагрузки приведет к другим проблемам.
  2. Кэш может сильно помочь с выгрузкой ресурсов. Используйте CDN для разгрузки ваших серверов и даже более того – мощные сервера CDN ускорят работу вашего приложения.
  3. Не нужно хранить все подряд в базе данных. Используйте базы данных для хранения действительно важной для вашего бизнеса или для вашего приложения информации.
  4. Ограничьте доступ к тем ресурсам, которых не хватает. Если несколько процессов требуют выполнения одного и того же процесса, поставьте их в очередь – пусть ожидают завершения выполнения предыдущего запроса. Иначе зависнут все.
  5. Разбиение процессов на асинхронные потоки и параллельное их выполнение небольшим, ограниченным количеством обработчиков существенно повышает производительность.
  6. Обмен данными по сети гораздо более медленный, чем операции в памяти – уменьшите количество запросов-ответов от вашего приложения клиенту.
  7. Меняйте только одну переменную за один раз. Да, это потребует больше времени на отладку, но зато вы поймете, что конкретно привело к тем или иным изменениям.
  8. Обнулите всё, что возможно, до проведения теста, чтобы результаты работы предыдущего теста не влияли на последующий. Рекомендуется перезагрузка серверного ПО и пр., но само оборудование можно все-таки не перегружать.
  9. Каждый раз, когда вы проводите повторные тесты, выполняйте их все. Не стоит надеяться на результаты, полученные полгода назад – все могло существенно измениться.
  10. По максимуму автоматизируйте процесс тестирования. Тогда тесты можно будет запускать и в нерабочее время. Кроме того, автоматизация стандартизует условия проведения тестов.

Средства тестирования масштабирования

Выбор средств зависит от масштабов вашего проекта, его особенностей и т. п. К счастью, сейчас нет недостатка в бесплатных средствах для нагрузочного тестирования.

Вот некоторые из них:

TechBeacon приводит список из 12 бесплатных средств для нагрузочного тестирования.

Заключение

Масштабируемость, устойчивость к пиковым нагрузкам вещь далеко не второстепенная. От нее зависит успех любого приложения или интернет-магазина. Мудрый совет опытного бизнесмена – «Если вы не растете, вы умираете» в данном случае относится к ресурсам, которые обеспечат работоспособность и выживаемость вашей системы при внезапном наплыве посетителей. О котором, вы, как и все, мечтаете и к которому стремитесь.

По материалам Keycdn.com

Николай Мациевский
Технический директор облачного сервиса Айри.рф, продукта компании WEBO Group, позволяющего ускорить и защитить любой сайт от наиболее распространенных угроз. Профессионально занимается скоростью, надежностью и доступностью веб-сайтов уже много лет. Является автором книг «Разгони свой сайт» и «Реактивные веб-сайты». Основатель первой в России компании, профессионально занимающейся повышением качества и быстродействия сайтов различной сложности — WEBO Group. Работает в составе рабочих групп РАЭК, W3C и объединения разработчиков «Веб-стандарты».

Прокомментировать

Оставьте первый комментарий!

Notify of
wpDiscuz