количественная характеристика скорости выполнения операций
количество операций
в единицу времени
Выдержит ли система планируемую нагрузку?
Есть ли узкие места?
Нагрузочное тестирование (load testing) выполнение программы с повышением нагрузки от среднего профиля до максимального и выше
Нагрузка подаётся ступенями
растёт количество операций в единицу времени
Или нагрузка растёт плавно
выше максимума, чтобы знать есть ли запас
Анализ длительности обработки запросов
ищём точку деградации и недоступности (timeout, 504, …)
Сохраняем интенсивность (deg, off)
сравниваем с профилем нагрузки (min, med, max)
Анализ утилизации ресурсов: cpu, memory, …
ищём узкое место, лимиты, в т.ч. конфигурационные
Детальный анализ утилизации ресурсов
необходимо понимание работы системы: %usr, %sys, …
Анализ логов, ошибок, кодов ответов
ищем точку появления ошибок под нагрузкой
Сохраняем интенсивность (error)
стараемся избавиться от ошибок и предупреждений
Отчёт: точка деградации, ошибок, отказа, …
и их отношение к профилю нагрузки: med, max
Выбирем профиль для теста стабильности
обычно, 80% от точки деградации/появления ошибок
Нагрузочное тестирование (Load testing)
☑ Выдержит ли система планируемую нагрузку?
☑ Есть ли узкие места?
Нашли точку деградации, ошибок, отказа
выбрали максимальную рабочую нагрузку - work
выявили узкие места и ошибки, устранили их
Что будет при эксплуатации 24x7?
Стабильна ли система под нагрузкой?
Как быстро растёт размер базы данных и логов?
Есть ли утечка соединений, памяти?
Нет ли потерь данных?
Тестирование стабильности (stability testing)
длительное тестирование со средней нагрузкой,
поиском отклонений и проверками корректности работы
Выбирается рабочая нагрузка
не выше предельной, чтобы не было ошибок
Тестирование проводится длительное время
всю ночь или все выходные
Количественные и функциональные проверки
выполняются во время или между итерациями
Утечки ресурсов и ошибки
попадут в отчёт по тестированию стабильности
☑ Что будет при эксплуатации 24x7?
☑ Стабильна ли система под нагрузкой?
☑ Как быстро растёт размер базы данных?
☑ Есть ли утечка соединений, памяти?
☑ Нет ли потерь данных?
Если нагрузка ненадолго превысит максимум?
Освобождаются ли неиспользуемые ресурсы?
Восстановится ли система после ошибок?
Какие ошибки проявляются под нагрузкой?
Жил да был один сервер,
было у него три друга-сервера,
и однажды он решил перезагрузиться.
Сначала всё было хорошо
нагрузка на каждый сервер была средней
Один ушел на перезагрузку
нагрузка подросла
Второй не выдержал
нагрузка ещё подросла
Третий не выдержал
и снова нагрузка подросла, пользователи заметили
Система начала восстанавливаться
а нагрузка выравниваться
Система почти восстановилась
нагрузка распределилась
Система справилась
нагрузка снова минимальная
Стрессовое тестирование (stress testing)
тестирование за пределами рабочих нагрузок,
в ограниченных ресурсах
Быстро и ненадолго повысим нагрузку
и повторим такой процесс несколько раз
Выявим утечку ресурсов
проверим корректность обработки исключений
Выявим утечку ресурсов
возможно, что ресурсы не освобождаются полностью
Выявим утечку ресурсов
возможно, что ресурсы не освобождаются частично
Проверим реакцию на временное зависание
быстро ли разбираются внутренние очереди системы
☑ Если нагрузка ненадолго превысит максимум?
☑ Освобождаются ли неиспользуемые ресурсы?
☑ Восстановится ли система после ошибок?
☑ Какие ошибки проявляются под нагрузкой?
А что будет через 5 лет работы?
Или через 10 лет работы при том же профиле?
Или если размер документов увеличить?
Нужно объёмное тестирование
Объемное тестирование (volume testing)
тестирование при увеличении объемов данных
Наполняем базу, запускаем нагрузку
сценарий — через 1 год работы
Наполняем базу, запускаем нагрузку
сценарий — через 5 лет работы
Наполняем базу, запускаем нагрузку
сценарий — через 10 лет работы
Увеличивается объём БД, а не интенсивность.
Нужно иметь и генератор нагрузки и данных.
Быстрые генераторы БД пишутся на SQL.
А готовят запросы на python, bash, java, …
Обработка пакета запросов
профиль нагрузки — размер пакета данных
☑ А что будет через 5 лет работы?
☑ Или через 10 лет работы при том же профиле?
☑ Или если размер документов увеличить?
☑ Объёмное тестирование проведено.
Поможет ли увеличение памяти в 2 раза?
Какой предел на другом железе?
Какая производительность при двух серверах?
Масштабируемости (scalability testing)
серия нагрузочных тестов
для разных профилей оборудования,
количества серверов или узлов системы,
настроек — размеров очередей, лимитов, …
Наращивание мощности оборудования
вертикальное масштабирование
Тестирование на разных конфигурациях
для прогноза затрат
Наращивание мощности оборудования
имеет технический предел
Наращивание количества узлов
горизонтальное масштабирование
Наращивание количества узлов
закладывается в архитектуру
Наращивание количества узлов
даёт гибкость
☑ Поможет ли увеличение памяти в 2 раза?
☑ Какой предел на другом железе?
☑ Какая производительность при двух серверах?
Пять видов тестирования производительности
Основа генератора пишется на SQL
А Java/Scala/Python/Lua/Go/... лишь помогают
SQL для генерации данных
Почему SQL, а не API: Java/Scala/Python/C#/...
SQL — скорость
можно сгенерировать 100 Гбайт
не нужны интеграции
SQL может многое
API — гибкость и надёжность
генерация на активной системе
быстрый отклик по корректности
Java/Scala/Python/С#/... могут всё
Опыт использования SQL-генераторов
Планирование данных
Продумать шаблоны и количество
Сценарий
Шаблоны
Количество
Login_logout
loadUser{N}@ok.org
Users – 100к, History – x3
Try_fail_pass
incorrect{N}pass@bad.org
Users – 50к, History – x1
Reset_password
user{N}Reset@password.com
Users – 10к, History – x5
Шаблоны
Параметризация
load_fill_database_{scenario}
load_fill_database
load_get_name, ...
Шаблоны
Параметризация
load_fill_database_{scenario}
load_fill_database
load_get_name, ...
Шаблоны
Параметризация
load_fill_database_{scenario}
load_fill_database
load_get_name, ...
Подходы для генерации значений
Объект – функция от параметров и номера
FOR index IN "indexStart".."indexEnd" LOOP value = function(index, params) Использование value для вставки в таблицы
Основа генератора пишется на SQL
А Java/Scala/Python/Lua/Go/... лишь помогают
Для спец. форматов используются библиотеки
Для простоты используем сериализацию
Затраты на генерацию окупаются стабильностью