ServerAdmin.ru
26.7K subscribers
204 photos
24 videos
8 files
2.49K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru
Download Telegram
Для нагрузочного тестирования сайта я обычно использую yandex.tank. Это эффективный, функциональный, но при этом простой в использовании и бесплатный инструмент. Хотел сначала про него заметку написать, но, как это часто бывает, получилась статья.

В статье даны не только рекомендации по использованию танка в нагрузочных тестированиях, но и даны советы, как от него защищаться. По сути он представляет из себя отличный инструмент для dos атак. Неподготовленные веб сервера и сайты он кладет на раз. Так что будьте внимательны с ним и не шалите ☝️

https://serveradmin.ru/primer-nagruzochnogo-testirovaniya-sajta-s-yandex-tank/

#нагрузочное_тестирование
​​Попробовал интересный сервис для тестирования нагрузки на сайт - https://artillery.io. У него есть бесплатная self-hosted версия, которую я развернул у себя. В нюансы saas и его подписок не вникал.

Что понравилось в этом сервисе нагрузочного тестирования:
1️⃣ Простая и быстрая установка, легко разобраться и начать пользоваться.
2️⃣ Хорошая документация.
3️⃣ Наглядные и простые html отчёты.
4️⃣ Yaml конфиги. В данном случае это удобно, когда выполняются последовательно разные шаги.
5️⃣ Хорошая документация с примерами.

Ставится через nodejs. В Centos 8 поставил так:

dnf module enable nodejs:12
dnf install nodejs
npm install -g artillery@latest

Теперь рисуем простейший конфиг script.yaml

config:
 target: https://ya.ru
 phases:
  - duration: 60
    arrivalRate: 10
scenarios:
 - flow:
   - get:
      url: "/"

Запускаем тест и сохраняем отчет в json файл.
artillery run script.yaml --output report.json

Отчёт можно загнать в html:
artillery report --output report.html report.json

Сервис ориентирован на современную разработку и использование в CI/CD. В конфиге поддерживаются разные окружения, значения можно переопределять через консольные команды. На всё есть примеры в документации - https://artillery.io/docs/guides/overview/welcome.html

Я быстро разобрался и протестировал основные возможности. Сам в основном Yandex.Tank использую, но Artillery понравился больше более простыми конфигами и отчетами.

#нагрузочное_тестирование
​​Достаточно известная и функциональная программа для нагрузочного тестирования - k6. Проект open source, можно установить у себя. Если есть желание, покупается по схеме saas в облаке. K6 недавно вошёл в состав Grafana Labs. Так что теперь этот продукт станет суперсовременным и молодёжным. Есть интеграция с InfluxDB и Grafana.

https://k6.io
https://github.com/grafana/k6

Если только подыскиваете себе подобный инструмент, то стоит начать с k6. Ранее я уже описывал тулзы подобного рода: yandex.tank и artillery.io. Аrtillery тоже молодёжный - yaml конфиги, автоматизация и javascript в бэкенде. А у k6 - go, что выглядит привлекательнее, так как быстрее. Сами же тесты на javascript пишутся.

Поставить k6 проще простого. Для rpm и deb based дистрибутивов есть репозитории. А запустить можно и в docker. Готовим docker-compose.yaml:

version: '3.4'
services:
 k6:
  image: loadimpact/k6:latest
  command: run /test.js
  volumes:
   - ./test.js:/test.js

Пишем простой скрипт для теста. В течении 30 секунд в 10 потоков бомбим https://test.k6.io (не роняйте сайт своей школы или управы района)

import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
 vus: 10,
 duration: '30s',
};
export default function () {
 http.get('https://test.k6.io');
 sleep(1);
}

Запускаем тест:

docker-compose up

Результат увидите тут же в консоли. Все остальные подробности в документации. Она там очень качественная, как и для всех продуктов Grafana Labs.

#нагрузочное_тестирование
​​Taurus - интерактивный бесплатный фреймворк для нагрузочного тестирования. Название образовано от слов Test Automation Running Smoothly. На русский можно перевести, как "автоматизация тестирования пройдёт чики-пуки".

Основные особенности и отличия от других подобных программ, коих существует много:
Простая установка и запуск тестов.
Тесты можно писать как на json, так и yaml (почесал бороду).
Можно использовать скрипты от известных JMeter и Selenium.
Отображение результатов в режиме реального времени в консоли.
Интеграция с панелью BlazeMeter, популярной Continuous Testing Platform.

Установить Taurus проще всего через pip. Обязательно понадобится пакет python-devel. В Rocky Linux устанавливаем примерно так:
# dnf install python36 python36-devel gcc
# pip3 install bzt

Делаем простейший конфиг quick_test.yml
execution:
- concurrency: 100
 ramp-up: 1m
 hold-for: 5m
 scenario: quick-test

scenarios:
 quick-test:
  requests:
  - http://shkola1101.ru

Запускаем тест и роняем сайт школы:
# bzt quick_test.yml

Шутка, сайт ронять не надо. После запуска Taurus скачает исходники JMeter и запустит его. Ему для работы нужна Java 😱 Ставим:
# dnf install java-11-openjdk

Результат работы будете видеть тут же, в консоли. Интересны в первую очередь будут данные Average Time: elapsed, connect, latency. После окончания теста результаты останутся в отдельной директории с датой теста в имени. Там будет очень много различной информации. Основные итоги в файле bzt.log.

Если добавите к команде ключ -report, то на выходе получите наглядную картинку с результатами тестирования и ссылку, где её можно будет посмотреть. В целом, работа с Taurus похожа на Яндекс.Танк. Очень функциональная штука.

Сайт - https://gettaurus.org/
Исходники - https://github.com/Blazemeter/taurus
Документация - https://gettaurus.org/docs/Index/

#нагрузочное_тестирование
​​Для нагрузочного тестирования сайтов существует много готовых инструментов. Но когда речь заходит о чём-то более сложном, чем простые get запросы к каким-то урлам, ситуация резко меняется. Первым делом на ум приходит популярный JMeter, но взять и сразу написать для него сценарий доступно не только лишь всем.

Компромиссом в этом вопросе может выступать Locust. Это известная утилита для нагрузочного тестирования, написанная на Python. Тесты для неё тоже пишутся на этом же языке, то есть вы ничем не ограничены в своих фантазиях на тему сценариев. А так как пайтон прост как для восприятия, так и написания кода, использовать её не сложно. Я быстро по документации разобрался, как это сделать.

Locust ставится из pip и имеет встроенный веб сервер для запуска тестов и просмотра результатов, поэтому никакой особой настройки не требует. Устанавливаем:
# apt install python3-pip
# pip3 install locust

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

from locust import HttpUser, task

class TestUser(HttpUser):
  @task
  def test01(self):
    self.client.get("/")
    self.client.get("/forum")
self.client.get("/about")

Здесь мы просто шлём запросы на три урла: /, /forum, /about. Запускаем locust:
# locust -f locustfile.py
И отправляемся в браузер для запуска теста с указанными параметрами и просмотра статистики - http://0.0.0.0:8089.

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

Locust в первую очередь хорош для автоматизации тестирования, во-вторую, для мониторинга. Для него есть готовый exporter для Prometheus. Вы можете регулярно запускать тесты и мониторить результаты. Вот хороший пример по этой теме (тесты api и отправка результатов в prometheus).

Аналоги Locust:
artillery.io
k6
yandex.tank
Taurus

Сайт / Исходники

#нагрузочное_тестирование
​​Хочу напомнить про одну из популярных и удобных систем для нагрузочных тестирований для сайтов — Yandex.Tank. Она написана лет 10 назад и с тех пор особо не менялась, хотя в репозитории видна активность. За проектом присматривают и поддерживают в актуальном состоянии.

Она удобна в первую очередь тем, что есть интеграция с бесплатным сервисом overload.yandex.net, куда Yandex.Tank автоматически загружает результаты. Для этого нужно там зарегистрироваться и получить токен. А дальше нарисовать небольшой конфиг для тестирования:

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, 10, 1m)
 ssl: true
autostop:
 autostop:
  - http(5xx,10%,5s)
console:
 enabled: true
telegraf:
 enabled: false

И запустить тест:
# docker run --rm -v ~/yandex.tank:/var/loadtest \
-it yandex/yandex-tank

В процессе тестирования получите ссылку вида https://overload.yandex.net/589382, по которой можно наблюдать ход тестирования в режиме реального времени, либо изучать его результаты потом. Простую статистику можно наблюдать в консоли по ходу теста.

Yandex Tank продвинутый инструмент, которые поддерживает разнообразные схемы запросов, различные настройки нагрузки и т.д. В качестве генераторов нагрузки может использовать Phantom, Pandora, BFG (написаны самим Яндексом для него), либо известный Jmeter. В качестве внешних сервисов для загрузки артефактов, помимо Yandex.Overload можно использовать InfluxDB.

Все модули, настройки, возможности и примеры использования описаны в документации. Я когда-то давно писал статью с примером запуска Yandex.Tank. Она полностью актуальна, можно пользоваться.

Аналоги Yandex.Tank:
◽️ artillery.io
◽️ k6
◽️ Locust
◽️ Taurus

Исходники / Документация / Визуализация

#нагрузочное_тестирование
​​У меня была серия публикаций про инструменты нагрузочного тестирования сайтов. Наиболее известные продукты из этой области я уже публиковал:

◽️Yandex.Tank
◽️ artillery.io
◽️ k6
◽️ Locust
◽️ Taurus

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

Он представляет из себя одиночный бинарник на Go, который достаточно скачать и запустить. При этом есть и пакеты, и docker контейнер. За ходом нагрузки можно следить как в консоли, так и на веб странице, которую он запускает через свой встроенный веб сервер.

У Plow не так много параметров. Основные это длительность теста (-d) или количество запросов (-n), интенсивность запросов или rps (--rate) и количество открытых соединений (-c). Тест будет выглядеть примерно вот так:

# plow https://github.com -n 50 -c 2 --rate 10

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

Plow умеет выводить результаты в виде json файла, так что его можно использовать для мониторинга отклика какого-то ресурса:

# plow https://github.com -n 50 -c 2 --rate 10 --json --summary

Такой вывод, отправив в Zabbix, можно очень просто через jsonpath распарсить и забрать, к примеру, 95-й персентиль для мониторинга и наблюдать за ним. Это будет более информативная метрика, нежели стандартные веб проверки. В них нельзя задать интенсивность запросов. А проверки одиночным запросом зачастую неинформативны, так как проседать отклик чаще всего начинает под нагрузкой.

Исходники

#нагрузочное_тестирование
​​Для нагрузочного тестирования сайтов существует популярное и удобное решение от Grafana - k6. Я уже когда-то давно рассказывал про него, но тогда не сделал акцент на том, что он удобен в том числе благодаря интеграции с Grafana через хранение метрик в Influxdb. Покажу, как это выглядит на практике.

K6 много чего умеет. Он вообще очень развитый и продвинутый инструмент, где тесты можно писать в том числе на JavaScript. Продукт позиционирует себя как Tests as code. Его легко поднять и начать тестирование, используя готовые примеры. Показываю на практике.

Поднимаем связку Grafana + Influxdb:

# git clone https://github.com/grafana/k6 && cd k6

Там готовый docker-compose.yml. В принципе, можно ничего не менять, конфиг простой, без необходимости указания переменных. Запускаем связку:

# docker compose up -d influxdb grafana

Можно сходить, проверить графану по стандартному урлу и порту: http://server-ip:3000/login. Учётка стандартная - admin / admin. В графане уже должен быть настроен в Data sources myinfluxdb с урлом из соседнего контейнера.

Теперь нужно выбрать Dashboard. Их очень много разных для k6, выбирайте любой. Наиболее функциональный и удобный вот этот, за счёт того, что там есть группировка по тэгам, группам, урлам. Идём в Dashboards ⇨  Import ⇨  ID 13719.

Всё готово для запуска тестов. В репозитории, в директории examples очень много примеров. Эта директория мапится в контейнер с k6 в docker-compose. Тест можно запустить вот так:

# docker compose run k6 run /scripts/stages.js

Данные сразу потекут в Influxdb, так что их сразу можно наблюдать в Grafana. Тест не обязательно запускать на этой же машине. Можно из любого другого места, а передать данные через отдельный параметр. Примерно так:

# k6 run --out influxdb=http://1.2.3.4:8086 stages.js

Вот пример простого конфига для теста в 10 потоков в течении 30 секунд:

import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
 vus: 10,
 duration: '30s',
};
export default function () {
 http.get('https://test.k6.io');
 sleep(1);
}

Соответственно, конфиг легко расширяется дополнительными урлами, тестами, выполняемыми действиями. У продукта хорошая документация и много готовых примеров. Знать JavaScript не обязательно.

⇨  Сайт / Исходники

#нагрузочное_тестирование