Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Три этапа поиска максимальной производительности

polarnik
December 02, 2020

Три этапа поиска максимальной производительности

Частая задача в тестировании производительности - поиск максимальной производительности при заданном профиле нагрузки или нагрузочное тестирование или Load Testing.
Для распределенных систем удобно разделить процесс на три этапа:
- прогрев;
- поиск максимальной производительности;
- подтверждение тестом стабильности.
Все просто, но есть нюансы. Доклад обзорный, с примерами реализации в Apache.JMeter и Gatling

polarnik

December 02, 2020
Tweet

More Decks by polarnik

Other Decks in Programming

Transcript

  1. Задача: провести тестирование производительности А что это? А какая цель

    тестирования? А какие инструменты использовать?
  2. Задача по умолчанию: поиск максимальной производительности Сформировать требования по 1.

    Доле ошибок (0%, нет резкого роста % ошибок) 2. Времени отклика (95%% длительности не превышает 60 сек) 3. Утилизации ресурсов (100 ядер CPU, 100 Мбит/с на сетевой канал) Смоделировать нагрузку 1. Прогревающую 2. Возрастающую 3. Стабильную Найти интенсивность, при которой система 1. Перестает удовлетворять требованиям производительности 2. Удовлетворяет требованиям производительности
  3. Методика и Профиль нагрузки 7 Методика Профиль нагрузки, требования Подготовка

    данных и стенда Изучение работы с системой Разработка тестов и заглушек Запуск тестов Анализ метрик и логов Отчёт и инструкции Профиль нагрузки, требования
  4. Разработка и запуск тестов 8 Методика Профиль нагрузки, требования Подготовка

    данных и стенда Изучение работы с системой Разработка тестов и заглушек Запуск тестов Анализ метрик и логов Отчёт и инструкции Профиль нагрузки, требования
  5. Сформировать требования 1. По доле ошибок • 0% ошибок •

    нет резкого роста % ошибок 2. По времени отклика • длительность у 95% сценариев в течение минуты не превышает 60 сек • длительность каждого сценария не превышает 90 сек 3. По утилизации ресурсов • 100 ядер CPU • 100 Мбит/с на сетевой канал • Длина очереди не более 1000 элементов
  6. Смоделировать нагрузку 1. Прогревающую (первый шаг) • Реализовать просто •

    Не нужны таймеры 2. Возрастающую • Реализовать сложно • Нужны таймеры, ступени, потоки 3. Стабильную • Реализовать нужно • Реализовать несложно Изображение Jonas Jovaisis с сайта Pixabay
  7. Смоделировать нагрузку 1. Прогревающую • Реализовать просто • Не нужны

    таймеры 2. Возрастающую (процесс) • Реализовать сложно • Нужны таймеры, ступени, потоки 3. Стабильную • Реализовать нужно • Реализовать несложно
  8. Смоделировать нагрузку 1. Прогревающую • Реализовать просто • Не нужны

    таймеры 2. Возрастающую • Реализовать сложно • Нужны таймеры, ступени, потоки 3. Стабильную (цель) • Реализовать нужно • Реализовать несложно
  9. Три этапа поиска максимальной производительности (интенсивности) 1. Прогреть систему •

    Прогревающей нагрузкой • Предварительный тест 2. Найти максимальную производительность • При возрастающей интенсивности • Контролируя ошибки 3. Подтвердить найденный максимум тестом стабильности • Стабильная нагрузка на 80% от максимума • Долгая, при которой не будет ошибок
  10. Рекомендуемые инструменты Apache.JMeter и Gatling: 1. Большое количество протоколов и

    плагинов. 2. Гибкая настройка профиля нагрузки. 3. Высокая производительность. 4. Хорошие отчеты. 5. Open Source.
  11. 1. Прогревающая нагрузка А какая цель прогрева? А как это

    реализовать в Apache.JMeter и Gatling? Как анализировать результаты прогревающего теста?
  12. Прогревающая нагрузка 1. Прогреть систему малой нагрузкой • избавить последующий

    тест от зависания 2. Выполнить за 15 минут • прогрев не должен быть долгим 3. Выполнить 5 успешных сценариев • сценарий должен падать при нарушении SLA Самый простой тест в 1-2 потока без пауз
  13. 2. Возрастающая нагрузка (есть разные реализации) Реализация без пауз и

    таймеров, только увеличение количества потоков Реализация контролем интенсивности (TPS или RPS) Реализация с контролем интенсивности и ступенчатым увеличением нагрузки
  14. 2.1. Возрастающая нагрузка (без пауз и таймеров) Какие плюсы и

    минусы такой реализации нагрузки? А как это реализовать в Apache.JMeter и Gatling? Как анализировать результаты возрастающей нагрузки?
  15. Возрастающая нагрузка без пауз и таймеров 1. Оценить длительность выполнения

    сценария (t мсек) • запустив предварительный тест, например, тест прогрева 2. Рассчитать интенсивность работы одного потока (X = 1000/t) • значение обратное длительности 3. Рассчитать интенсивность теста при N потоках (TPS = X•N) • сценарий должен падать при нарушении SLA Сценарии выполняются без пауз. Подходит для высокой нагрузки (100+ TPS) и простых сценариев: 1-10 несвязанных запросов. При сложных долгих сценариях способ становится неточным.
  16. 2.2. Возрастающая нагрузка (с таймерами и контролем интенсивности) Каковы плюсы

    и варианты реализации контроля интенсивности? А как это реализовать в Apache.JMeter и Gatling? Как анализировать результаты и выбрать максимальную интенсивность?
  17. Возрастающая линейно нагрузка Работа с потоками: • Thread Group Таймер

    для контроля интенсивности: • Constant Throughput Timer (внутри Flow Control Action)
  18. 2.3. Возрастающая нагрузка (с таймерами и ступенями) Какие плюсы и

    варианты реализации возрастающей ступенями нагрузки? Как анализировать результаты и выбрать максимальную ступень? А как это реализовать в Apache.JMeter и Gatling?
  19. Возрастающая нагрузка (ступенями) с контролем TPS 1. Подать контролируемую нагрузку

    • и найти интенсивность при которой система удовлетворяет SLA 2. Длительность ступени постоянная – 15 минут • ступеней в тесте 5-10 штук, начиная со средней нагрузки 3. Нагрузка подается выше ожидаемого максимума • сценарий должен падать при нарушении SLA Ступень – малый тест стабильности, удобный в анализе
  20. Возрастающая ступенями нагрузка Работа с потоками: • Ultimate Thread Group

    • Concurrency Thread Group Таймер для контроля интенсивности: • Constant Throughput Timer • внутри Flow Control Action • this thread only • Интенсивность для одного потока
  21. Возрастающая ступенями нагрузка pase + incrementConcurrentUsers val userOpenMainPage : ScenarioBuilder

    = scenario(cfg.title()) .forever( pace(pase_ms millisecond) .exec( SimpleScenario.simpleScenario() ) ) setUp( userOpenMainPage .inject( incrementConcurrentUsers(virtual_users_count) .times(numberOfSteps) .eachLevelLasting(levelDuration) .separatedByRampsLasting(rampDuration) .startingFrom(initialConcurrentUsers) ) .protocols(Protocol.httpConf) )
  22. 3. Стабильная нагрузка (с разгоном) Какие плюсы и варианты реализации

    возрастающей ступенями нагрузки? А как это реализовать в Apache.JMeter и Gatling? Как анализировать результаты и выбрать максимальную ступень?
  23. Стабильная нагрузка в TPS с разгоном в Apache.JMeter Работа с

    потоками: • Thread Group, Ultimate Thread Group • Concurrency Thread Group Таймер для контроля интенсивности: • Constant Throughput Timer • внутри Flow Control Action • all active threads in current thread group (shared) • интенсивность для всех потоков внутри катушки
  24. Стабильная нагрузка в RPS с разгоном в Apache.JMeter Работа с

    потоками: • Thread Group, Ultimate Thread Group • Concurrency Thread Group Таймер для контроля интенсивности: • Constant Throughput Timer • all active threads in current thread group (shared) • интенсивность для всех потоков внутри катушки
  25. Стабильная нагрузка в TPS: pase + constantConcurrentUsers val userOpenMainPage :

    ScenarioBuilder = scenario(Protocol.cfg.title()) .forever( pace(pase_ms millisecond) .exec( SimpleScenario.simpleScenario() ) ) setUp( userOpenMainPage .inject( constantConcurrentUsers(virtual_users_count) during (duration_sec seconds) ) .protocols(Protocol.httpConf) )
  26. Выводы JMeter и Gatling удобны Ошибки – основная метрика в

    нагрузке Прогрев защищает от ошибок Контроль TPS/RPS для сложных тестов Анализ ступеней очень прост Тест стабильности гарантирует точность
  27. Возрастающая нагрузка без пауз и таймеров в JMeter Подробно описана

    в статье «Управление мощностями: в поисках идеального баланса» Давыдов Иван @AntreTick, ЮMoney (Яндекс.Деньги) habr.com, 25 января 2019 https://habr.com/ru/company/yoomoney/blog/437416/
  28. Сборник статей по JMeter в виде книги «Master JMeter from

    Load Testing to DevOps» https://www.ubik-ingenierie.com/blog/book- master-jmeter-from-load-testing-to-devops/ https://www.packtpub.com/product/master- apache-jmeter-from-load-testing-to- devops/9781839217647