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

    Это — подборка утилит, составленная на основе рекомендаций резидентов Hacker News и GitHub. В список вошли: Locust, Vegeta, Slow_cooker, k6 и Siege. Ими пользуются инженеры из DICE, EA и Buoyant, а также разработчики Kubernetes и Load Impact. Расскажем об этих инструментах.


    Фото — Victor Freitas — Unsplash

    Locust.io


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

    В основу инструмента заложена интересная концепция: Locust («саранча») эмулирует поведение целого роя насекомых (виртуальных пользователей), «атакующих» сайт во время теста. Запросы формируют с помощью сетевой библиотеки для организации параллельных вычислений — gevent. Вот пример простого теста, который приведен на официальном сайте проекта:

    from locust import HttpLocust, TaskSet, task
    
    class WebsiteTasks(TaskSet):
        def on_start(self):
            self.client.post("/login", {
                "username": "test_user",
                "password": ""
            })
    
        @task
        def index(self):
            self.client.get("/")
    
        @task
        def about(self):
            self.client.get("/about/")
    
    class WebsiteUser(HttpLocust):
        task_set = WebsiteTasks
        min_wait = 5000
        max_wait = 15000

    Locust задействует библиотеку requests. Эта надстройка над стандартными средствами Python упрощает работу с HTTP и SSL и делает код более наглядным. К слову, документацию requests можно использовать в качестве шпаргалки для отладки тестов на Locust.

    Этот инструмент для нагрузочного тестирования существует уже более семи лет. За это время вокруг него сформировалось обширное комьюнити — на GitHub более 10 тыс. звезд. Locust использовали при оценке работоспособности сети Battlelog для серии игр Battlefield. Об инструменте положительно отозвался Армин Ронахер (Armin Ronacher), автор фреймворка Flask.

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

    Если вы хотите поближе познакомиться с Locust, то стоит обратить внимание на документацию инструмента. Также можно рекомендовать выступление Алексея Романова из Wargaming на Python Meetup. Он рассказывает, как писать сценарии, эмулирующие поведение пользователей.

    Vegeta


    Утилита командной строки для тестирования HTTP-сервисов, написанная на Go. Её можно подключить как библиотеку для создания своих инструментов нагрузочного тестирования. Разработчиком Vegeta выступил один из авторов отрытой платформы Sourcegraph — это движок для рецензирования и навигации по исходному коду, который используют в Lyft, Uber и Yelp.

    Vegeta оценивает возможности сетевых ресурсов, «бомбардируя» их запросами с установленной частотой. Например, для проверки localhost достаточно прописать следующую команду:

    echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report

    По умолчанию Vegeta работает со стандартным потоком чтения команд (stdin), поэтому ресурс для тестирования передается через echo. Параметр duration указывает продолжительность теста. Репорт будет сгенерирован в файл results.bin. Отчеты Vegeta генерирует в текстовом формате, но при этом умеет рисовать графики. Сгенерировать их можно следующей командой:

    vegeta plot -title=Results results.bin > results-plot.html

    Вокруг Vegeta сформировалось крупное сообщество — 12 тыс. звезд на GitHub. Инструмент даже использовали разработчики Kubernetes для оценки производительности своей платформы — тогда Vegeta генерировала около 10 млн запросов в секунду к кластеру из тысячи узлов.

    Документация с описанием всех функций и флагов для тестов Vegeta есть в репозитории на GitHub. Там же можно найти предварительно скомпилированные исполняемые файлы.

    Slow_cooker


    Это — инструмент для нагрузочного тестирования серверов, написанный на Go. Его разработали инженеры из компании Buoyant, которая создает сервисную сеть для Kubernetes — Linkerd. Она является частью Cloud Native Computing Foundation и считается конкурентом Google Istio.


    Фото — Joshua Aragon — Unsplash

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

    Специалисты из Buoyant используют свою разработку для тестирования Linkerd и других сервисов, например nginx. Инструмент довольно молодой — ему около трех — поэтому пока он не обзавелся большим комьюнити. Но в будущем ситуация может измениться, например, его репозиторий уже форкнули в Skysсanner, международном сервисе для поиска авиабилетов.

    Исходный код вы можете найти на GitHub.

    k6


    Инструмент для нагрузочного и регрессионного тестирования микросервисов, контейнеров и сайтов, размещенных в облаке. Он написан на Go и JavaScript разработчиками из Load Impact — это приложение для тестирования «стойкости» сайтов.

    Работа с k6 строится по модели everything as code, когда логика тестов и все настройки пишутся на JavaScript. В скриптах отдельные шаги можно объединять в группы (group), что может быть удобно для тех, кто привык следовать принципам BDD. Вот пример такой группы:

    import { group } from "k6";
    
    export default function() {
      group("user flow: returning user", function() {
        group("visit homepage", function() {
          // load homepage resources
        });
        group("login", function() {
          // perform login
        });
      });
    };

    Также инструмент дает возможность записывать скрипты и строить графики — последняя функция реализована на InfluxDB и Grafana. И у него есть интеграции с CI-системами вроде Jenkins, Circle CI, Team City и GitLab.

    Пользователи говорят, что k6 не требователен к ресурсам, и у него удобный API. Но есть и несколько недостатков, в частности, k6 не поддерживает websocket и не умеет проводить тесты на распределенных системах. Хотя разработчики k6 в тематическом треде на Hacker News рассказали, что эти функции появятся в будущем.

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

    Siege


    Siege позволяет провести нагрузочное тестирование веб-серверов. Утилиту создал инженер Джефф Фалмер (Jeff Fulmer), чтобы разработчики могли проверить ресурсоемкость своего кода в условиях, приближенных к боевым. Siege эмулирует непрерывный поток обращений к сайту от множества пользователей, как бы удерживая сервер «под осадой» — отсюда и название инструмента.

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

    Siege получил довольно широкое распространение в ИТ-сообществе. Например, нагрузочному тестированию с его помощью посвящен целый раздел в книге «NGINX High Performance». Также его используют некоторые облачные провайдеры.

    Из недостатков Siege можно выделить нестандартный синтаксис и неочевидные методы подсчета параметров тестирования — например, редиректы считаются успешными транзакциями, поэтому их количество может превышать общее число запросов. Если вы хотите опробовать Siege на практике, изучите онлайн-руководство — там разобраны некоторые «странности» системы.

    Дополнительное чтение в блоге 1cloud.ru:

    Что нового в Linux kernel 5.3 — графические драйверы, виртуализация и другие обновления
    Почему разработчики мейнстрим-браузера снова отказались от отображения поддомена
    Почему Apple изменила требования к разработчикам приложений
    • +12
    • 6,1k
    • 7
    1cloud.ru
    311,02
    IaaS, VPS, VDS, Частное и публичное облако, SSL
    Поделиться публикацией

    Комментарии 7

      +1
      Я использую JMeter и очень доволен.
        0
        Меня не устраивают внешние системы, поэтому использую самописный (как верно подмечено в статье) рой.
        Диспетчер получает на вход пачку access.log файлов проекта из прода и исходя из настроек, формирует «ульи» (пакеты) пчел, в каждом из которых свои настройки: задержка между реквестами, равномерность задержки (случайное число в диапазоне или константа), а также такие фишки как поддержка сессии, фильтрация урлов из пакета заданий, получение и парсинг полученного хтмл или игнорирование тела ответа. «Пчелы» же пишутся под конкретные нужды, хотя после пары десятков испытаний, уже есть набор, который покрывает основные нужды. И все сделано практически на голой Java 1.7.
        Главный минус моего решения — это кол-во VPS, которые используются для стресс теста. 2..3 — мало для 100% имитации полноценной нагрузки. В этом плане, описанные в статье системы конечно имеют фору.
        PS: Зато они не могут нагрузить тестовый стенд онлайн траффиком с прода через зеркалирование в nginx :)
          +1

          Не хватает Яндекс.Танка, мне кажется

            0
            Когда нужно нагрузить REST API, нет проблем с выбором инструментов. Вот когда появляется что-то менее тривиальное (GRPC, собственный протокол над websocket, etc), приходится искать плагины или писать свои расширения к существующим инструментам, если они это поддерживают. Доводилось попробовать:
            — Gatling. Хороший инструмент, но для его расширения нужно знать Scala и разобраться в плохо задокументированных исходниках.
            — Locust. Расширять удобно (python), но как нагрузочный инструмент слаб — не удавалось по-настоящему нагрузить, выше 1к ops не поднимались.
            — Яндекс.Танк + Pandora. Остановились на этой связке — относительно простой и легко расширяемый инструмент (плагин на Go), который с одной стороны дает предсказуемую нагрузку, а сдругой стороны умеет агрегировать и строить хорошие отчеты, плюс возможность выгрузки в Influx с последующей визуализацией.
              0
              artillery.io тоже можно посмотреть
                0
                Использовал K6 для проверки сервисов под нагрузкой от нескольких одновременных клиентов, очень удобно. Но огорчило отсутствие нормальной возможности запуска сразу нескольких генераторов нагрузки (ну там раскидать нагрузку по воркерам, синхронизировать пулы данных и тд), правда там есть удаленное API, так что просто инициализировал воркеры в приостановленном режиме и запускать (условно)одновременно с отдельной машины по API.

                Зато написанные скрипты с проверками можно в дальнейшем для автотестов API использовать.
                  0

                  Напишите статью про вчерашний казус, кто пострадал, причины, следствия и кто виноват)

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

                  Самое читаемое