Yandex танк

Yandex танк Хостинг

Способов проверить работу сайта под нагрузкой много от самых примитивных утилит до целых систем. Я покажу конкретный пример нагрузочного тестирования сайта с помощью Yandex. Tank. Это бесплатный инструмент с очень большим функционалом и простой в использовании.

Если у вас есть желание научиться администрировать системы на базе Linux, рекомендую познакомиться с онлайн-курсом «Linux для начинающих» в OTUS. Курс для новичков, для тех, кто с Linux не знаком. Подробная информация.

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

Первым делом сходите на overload.yandex.net, зарегистрируйтесь там и получите токен. Он нам нужен будет далее, чтобы в удобном виде просматривать визуализацию результатов. Это не обязательное условие для совершения тестов и можно обойтись без него. Будет простенький вывод в консоли, с помощью которого можно оценить результат нагрузочного тестирования. Но с помощью модуля overload гораздо удобнее и нагляднее интерпретировать полученные данные.

С помощью Yandex. Tank вы без проблем можете положить неподготовленный сайт. Главное найти в нем самые медленные и нагруженные места (например поиск или большой каталог) А потом одновременно запустите тест из разных мест. А если еще и хорошенько автоматизируете это с помощью terraform и ansible, то совсем хорошо получится. Или плохо для владельца сайта. Правда это дороговато может стоить, есть способы подешевле. Но сейчас не будем об этом.

От такого рода «тестирования» достаточно просто защититься и стоит это делать всегда. Примеры защиты я подробно описывал в своих статьях — защита от ddos, защита от dos атак. В общем случае достаточно будет стандартных возможностей nginx, iptables и fail2ban. Удивительно, но очень много кто этого не делает. Я ради любопытства иногда клал очень неожиданные сайты. Но только в академических целях и на очень короткий период времени. Помним о карме и не вредим другим людям! Используем инструменты только во благо.

При желании, вы можете установить Yandex. Tank из пакетов, либо запустить из исходников. Он написан на Python, так что к нему понадобится еще пачка модулей. Я же предпочитаю запускать его в Docker. Это в разы удобнее и быстрее.

Для начала установите себе докер, у меня есть статья по теме — установка docker на centos. После этого создаем директорию для данных танка и кладем туда конфиг нагрузочного теста для сайта.

# mkdir ~/yandex.tank && cd yandex.tank
# touch load.yaml

Создадим текстовый файл с токеном:

# touch token.txt

Не забудьте записать туда токен. Подготовку закончили, можно приступать к тестированию.

Яндекс. Танк – организуем эффективную систему нагрузочного тестирования

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

Читайте также:  Упростите свои задачи: лучшие приложения для системного администратора, которые стоит рассмотреть

Довольно часто, при развертывании или разработке ресурса или сервиса нам приходится решать такие вопросы как:

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

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

Зачастую эта проблема возникает из-за сочетания 2-3 ошибок на этапе разработке: один из разработчиков, к примеру, написал некорректный алгоритм, другой – использовал неоптимизированный код. Безусловно, современное железо достаточно мощное и спокойно закрывает неоптимизированные моменты в разработке, что в целом особо не сказывается на производительности. Однако, при большом наплыве посетителей или большом объеме данных все эти незначительные ошибки «выстреливают» и делают сервис недоступным для работы.

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

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

Чтобы исключить возникновение вот таких неприятных последствий жизненно необходимо проводить нагрузочное тестирование уже на этапе разработки.

Как же создать удобную систему сбора и хранения результатов нагрузочных тестов?

Яндекс. Танк — инструмент для проведения нагрузочного тестирования, разрабатываемый в компании Яндекс и распространяемый по лицензии LGPL. В основе инструмента лежит высокопроизводительный асинхронный генератор нагрузки phantom, при помощи которого можно генерировать десятки и сотни тысяч HTTP-запросов в секунду (http-requests per second, http-rps).

Яндекс. Танк — это обертка над несколькими утилитами нагрузочного тестирования и представляет собой унифицированный интерфейс для их конфигурации, запуска и построения отчетов вне зависимости от того, какая утилита используется «под капотом».


Yandex танк

Основные плагины Яндекс. Танка:

1. Monitoring Plugin — плагин слежения за основными метриками тестируемого приложения

2. Phantom- генератор нагрузки c акцентом на высокую производительность, малое потребление ресурсов и точность выходных данных. На рисунке ниже приведена схема работы Phantom.


Yandex танк

Основные параметры Phantom:

ammofile — путь к файлу патронов (файл патронов — это файл, содержащий запросы, которые должны быть отправлены на сервер. Может быть заархивирован).

load_profile — поведение профиля нагрузки.

rps_schedule — схема нагрузки. В ней можно указать одну из функций: const(load,dur), line(a,b,dur), step(a,b,step,dur), либо комбинации данных функций.

Например, комбинация:
rps_schedule=const(1,30s) line(1,1000,2m) const(1000,3h)
задаёт схему нагрузки при использовании которой нагрузка в 1 http-rps будет держаться в течении 30 секунд, затем нагрузка будет линейно возрастать с 1 до 1000 http-rps в течении 2 минут, после чего будет держаться на уровне 1000 http-rps в течение 3 часов.

Читайте также:  ApexMc Official Public Server - Apex Hosting

step(a,b,step,dur) — пошаговое увеличение нагрузки, где a и b начальное и конечное значения нагрузки в http-rps, step — шаг увеличения нагрузки, dur — время, через которое увеличивается нагрузка на указанный шаг.

line(a,b,dur) — линейная нагрузка, где a и b — начальная и конечная нагрузка, dur — время, в течение которого нагрузка линейно увеличивается от a до b.

const(load,dur) — постоянная нагрузка, где load — значение нагрузки, dur — время нагрузки.

instances — максимальное количество экземпляров (параллельных запросов).

loop — количество повторений запросов из файла с патронами в цикле.

3. ConsolePlugin — отображение в консоли в реальном времени основных статистических данных.

4. Autostop — плагин, реализующий возможность возможность остановить тестирование на основе разных критериев.

5. Aggregator plugin -отвечает за накопление данных, полученных от различных типов модулей, и дальнейшую передачу накопленных данных в другие модули.

Установка и настройка Яндекс. Танка

В качестве ОС для развертывания танка мы используем Ubuntu. Сам процесс установки достаточно несложен:

1. Добавляем репозиторий танка в файл /etc/apt/soures.list

deb http://ppa.launchpad.net/yandex-load/main/ubuntu trusty main
deb-src http://ppa.launchpad.net/yandex-load/main/ubuntu trusty main

2. Далее выполняем в консоли следующие команды:

sudo apt-get install python-software-properties
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:yandex-load/main

3. И устанавливаем сам Яндекс. Танк

sudo apt-get update
sudo apt-get install yandex-tank

4. Итак, танк установлен. Однако для работы нам еще нужен phantom

sudo add-apt-repository ppa:yandex-load/main && sudo apt-get update
sudo apt-get install phantom phantom-ssl

5. Итак, все установлено. Осталось создать профиль нагрузки и можно будет стрелять из танка. Создаем файл load.ini с текстом:

6. Формируем файл с патронами ammo.txt

Сам патрон состоит из:

пути для GET-запроса (uris).

Пример текста патронов приведен ниже:

Метрики и критерии сравнения

Перед началом работы для дальнейшего измерения необходимо определить следующие метрики каждого профиля нагрузки:

— http_rps_out — значение http-rps, отправляемое с Танка на веб-приложение,

— http_rps_in — значение http-rps, принимаемое на Танке со стороны веб-приложения,

— http_request_size — размер http-запроса в байтах,

— send_requests — количество отправленных HTTP-запросов,

— bs_out — bytes per seconds, байт в секунду — параметр определяет скорость отправки данных с Танка,

— bs_in — значение bs, отправляемое с веб-приложения в сторону Танка,

— test_time — время теста в секундах,

— response_time_med — среднее время, в которое укладывается 90% всех ответов.

Зная число HTTP-запросов и их размер, получаем, что bsи http-rpsсвязаны по формуле: bs = http_rps * http_request_size.

Запускаем тестирование

Ниже на рисунке приведен жизненный цикл нагрузочного тестирования.


Yandex танк

Итак, все установлено, конфигурационный файл создан, патроны заряжены, попробуем пострелять по тестовому серверу, на котором расположен тестовый сайт

yandex.tank -c load.ini

Стреляем по серверу. Тест №1.

rps_schedule=const(1,30s) line(1,1000,2m) const(10000,5m)

Ответ от Танка.


Yandex танк

График нагрузки на сервер


Yandex танк

Отклик сайта при нагрузке 10 000 rps составила 3258 ms, что для нормальной работы сайта категорически неприемлемо.

Однако «железо» сервера вполне себе справляется с нагрузкой. На картинке видны ровные графики.

Уменьшаем нагрузку. Тест №2.


Yandex танк

Yandex танк

Отклик сайта при нагрузке 5 000 rps составил 1251 ms, что показывает, что сайт достаточно хорошо справляется при такой нагрузке. Конечно цифры далеки от идеальных и все наш сайт необходимо подвергнуть анализу на предмет не оптимизированных участков кода.

Читайте также:  Хостинг - Презентация 62002

Тест №3. Стресс-тест для сервера или минутка разрушения.

Из предыдущих тестов было видно, что при нагрузке 10 000 rps сервер прекрасно себя чувствовал. Установим нагрузку в 500 000 rps и посмотрим, как отработает наше железо.


Yandex танк

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

Вывод

Используя Яндекс. Танк можно достаточно быстро и эффективно провести нагрузочное тестирование веб-приложений и получить большое количество статистических данных для дальнейшего анализа производительности.

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

Запуск нагрузки на сайта с помощью Yandex. Tank

# cd ~/yandex.tank
# docker run —rm -v ~/yandex.tank:/var/loadtest -it yandex/yandex-tank

Ждем окончания тестирования. Если укажите очень большую нагрузку, например в тысячи rps, можете повесить виртуалку или сайт (хе-хе). Вывод работы танка будет примерно такой.


Yandex танк

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


Yandex танк

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


Yandex танк

Например, на приведенном результате теста четко видно, как при приближении к 25-ти одновременным запросам начинает сильно расти время ответа сервера. На 20-ти запросах в 90-й перцентиль попадали все ответы менее 500 мс, а на 25-ти уже даже в 50-й перцентиль зашли ответы 750 мс.

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

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

Онлайн курс по Kubernetes

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Если вы ответите «да» хотя бы на один вопрос, то это ваш курс:

Сдавайте вступительный тест по ссылке и присоединяйтесь к новому набору!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Оцените статью
Хостинги