Способов проверить работу сайта под нагрузкой много от самых примитивных утилит до целых систем. Я покажу конкретный пример нагрузочного тестирования сайта с помощью Yandex.Tank. Это бесплатный инструмент с очень большим функционалом и простой в использовании.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Введение
Для начала приведу несколько полезных ссылок на тему Yandex.Tank. Они все почему-то разрозненные и не связаны логически друг с другом. Функционал этого инструмента обширный, я же рассмотрю достаточно простой пример, поэтому точно пригодится документация.
- Документация - https://yandextank.readthedocs.io/
- Исходники - https://github.com/yandex/yandex-tank
- Сервис визуализации - https://overload.yandex.net/
Первым делом сходите на overload.yandex.net, зарегистрируйтесь там и получите токен. Он нам нужен будет далее, чтобы в удобном виде просматривать визуализацию результатов. Это не обязательное условие для совершения тестов и можно обойтись без него. Будет простенький вывод в консоли, с помощью которого можно оценить результат нагрузочного тестирования. Но с помощью модуля overload гораздо удобнее и нагляднее интерпретировать полученные данные.
Установка Yandex.Tank
При желании, вы можете установить Yandex.Tank из пакетов, либо запустить из исходников. Он написан на Python, так что к нему понадобится еще пачка модулей. Я же предпочитаю запускать его в Docker. Это в разы удобнее и быстрее.
Для начала установите себе докер, у меня есть статья по теме - установка docker на centos. После этого создаем директорию для данных танка и кладем туда конфиг нагрузочного теста для сайта.
# mkdir ~/yandex.tank && cd yandex.tank # touch load.yaml
overload: enabled: true package: yandextank.plugins.DataUploader token_file: "token.txt" phantom: address: news.mail.ru:443 header_http: "1.1" headers: - "[Host: news.mail.ru]" - "[Connection: close]" uris: - / - /economics/ load_profile: load_type: rps schedule: line(5, 30, 1m) ssl: true autostop: autostop: - http(5xx,10%,5s) console: enabled: true telegraf: enabled: false
token.txt | Текстовый файл с токеном от overload.yandex.net. |
news.mail.ru:443 | Адрес сервера, который будем тестировать. Причем это не адрес сайта, так как это доменное имя просто резолвится в ip адрес. Можно задать сразу в виде ip. |
Host: news.mail.ru | Http заголовок, в котором мы передаем имя сайта, который будем нагружать. |
/, /economics/ | Урлы сайта, к которым по очереди будем обращаться. В данном случае это главная страница и страница /economics/. Этот список может быть указан через текстовый файл. Подробности смотрите в документации. |
line(5, 30, 1m) | Тип нагрузки. В данном случае это линейный рост запросов с 5 до 30 в течении одной минуты. |
http(5xx,10%,5s) | Условие автоматической остановки теста. В данном случае тест завершится сам, если в течении 5 секунд будет 10% пятисотых ошибок. |
Создадим текстовый файл с токеном:
# touch token.txt
Не забудьте записать туда токен. Подготовку закончили, можно приступать к тестированию.
Запуск нагрузки на сайта с помощью Yandex.Tank
Запускаем Yandex.Tank:
# cd ~/yandex.tank # docker run --rm -v ~/yandex.tank:/var/loadtest -it yandex/yandex-tank
Ждем окончания тестирования. Если укажите очень большую нагрузку, например в тысячи rps, можете повесить виртуалку или сайт (хе-хе). Вывод работы танка будет примерно такой.
В нагрузочном тестировании сайта нас в первую очередь интересует время отклика. Где его можно оценить, я выделил на скриншоте. После того, как завершится тест, в завершающем выводе работы контейнера будет ссылка на overload, где вы сможете посмотреть результат через браузер.
Пройдя по ней вы сможете более детально изучить поведение сайта под нагрузкой.
Например, на приведенном результате теста четко видно, как при приближении к 25-ти одновременным запросам начинает сильно расти время ответа сервера. На 20-ти запросах в 90-й перцентиль попадали все ответы менее 500 мс, а на 25-ти уже даже в 50-й перцентиль зашли ответы 750 мс.
Имеет смысл походить по вкладкам, там много другой полезной информации. С помощью данного тестирования вы сможете достаточно быстро определить предел производительности вашего железа.
Если хотите смоделировать более реальную нагрузку, а не синтетическую, то хорошенько поработайте над набором тестов и урлов. Можно очень гибко все это настроить. Например, добавить post запросы, где-то нарастающую нагрузку сделать, а где-то постоянную. Все это описано в документации. Там есть сильно навороченные примеры.
Заключение
С помощью Yandex.Tank вы без проблем можете положить неподготовленный сайт. Главное найти в нем самые медленные и нагруженные места (например поиск или большой каталог) А потом одновременно запустите тест из разных мест. А если еще и хорошенько автоматизируете это с помощью terraform и ansible, то совсем хорошо получится. Или плохо для владельца сайта. Правда это дороговато может стоить, есть способы подешевле. Но сейчас не будем об этом.
От такого рода "тестирования" достаточно просто защититься и стоит это делать всегда. Примеры защиты я подробно описывал в своих статьях - защита от ddos, защита от dos атак. В общем случае достаточно будет стандартных возможностей nginx, iptables и fail2ban. Удивительно, но очень много кто этого не делает. Я ради любопытства иногда клал очень неожиданные сайты. Но только в академических целях и на очень короткий период времени. Помним о карме и не вредим другим людям! Используем инструменты только во благо.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Не забудьте записать туда токен. - а где его взять?
После регистрации на overload.yandex.net дают.
Нашел в правом верхнем углу, спасибо.
Спасибо, раньше пользовался jmeter, но танчик порадовал)