# Мысли по нагрузочному тестированию Karbor
## Цель нагрузочного тестирования
- Проверить что средний абстрактный профиль нагрузки не уронит нам инфраструктуру
- Установление пределов в которых карбор будет работать без падений
- Получение профиля нагрузки, которую карбор дает на инфраструктуру
## Определяемся со степенями свободы
Изначально планировалось изменять следующие параметры:
| Параметр | Значения |
| ------------------------------ | ---------------------- |
| Количество планов на проект | 20, 40, 60, 80, 100 |
| Количество дисков в одном плане | 20, 40, 60, 80, 100 |
| Размер дисков | 10, 35, 60, 1000, 4000 |
| Наполненность диска | 0, 20, 40, 60, 80 |
| Количество операций на триггер | 2, 4, 6, 8, 10 |
| Количество триггеров на проект | 4, 16, 24, 32, 40 |
| Количество проектов | 1, 5, 10 |
С такими значениями параметров получается слишком много кейсов.
Оптимизация по параметрам:
* Количество планов на проект
Здесь проверяется способность карбора обрабатывать много дисков.
Тут можно исходить из данных о количестве дисков на проект.
В ru-3 3 диска на проект это 63 перцентиль, 20 дисков на проект это 95 перцентиль и 100 дисков на проект это 99 перцентиль.
Можно оставить 3 этих значения.
Решение: оставляем значения 3, 20, 100
* Количество дисков в одном плане
Планировалось проверить как будет производиться создание бэкапов с несколькими дисками.
Если подумать, то ничего нового по профилю нагрузки это не даст по сравнению с количеством планов на проект.
Поэтому этот параметр убираем из тестирования вообще.
* Размер дисков
От этого параметра зависит длительность создания бэкапа и восстановления из него.
Размер дисков напрямую нагружает ceph. Еще нужно учитывать, что на waxwing не бесконечное место, поэтому нужно будет убрать случаи когда
мы не помещаемся в ceph по размеру.
Размеры дисков выбраны исходя из данных по ru-3.
25% - 10 Гб
73% - 35 Гб
83% - 60 Гб
99.63% - 1000 Гб
Решение: оставляем значения 10, 35, 60, 1000
* Наполненность диска
Эта характеристика будет влиять на длительность создания бэкапов.
Дополнительно, чем больше заполненность тем больше будет гоняться по сети в rbd.
Достаточно оставить среднее и максимальное значение. Например, 20 и 60.
Вообще можно зафиксировать на 60, так как 20 скорее всего ничего в плане нагрузки не даст.
С другой стороны хотелось бы посмотреть разницу между долгим созданием нескольких бэкапов и быстрым созданием большого количества мелких.
Подобную проверку можно сделать зафиксировав наполненость диска на 60 и меняя только размер диска.
Решение: фиксируем на 60.
* Количество операций на триггер
Этим параметром хотелось проверить как каждый отдельный operationengine будет справляться с триггером, у которого несколько операций.
Сейчас параметр max_concurrent_operations у нас равен 0, это значит, что нет ограничения на количество создаваемых гринлетов.
В проде у нас может быть ситуация, когда у триггера будет много запланированных операций, поэтому этот параметр выбрасывать бы не хотелось.
Так как есть взаимосвязь между количеством планов, триггерами на проект и операциями на триггер, то можно этот параметр убрать.
Перебором количества планов и количества триггеров мы получим разное количество операций на триггер.
Решение: исключаем из тестов
* Количество триггеров на проект
Тут мы проверяем механизм обработки триггеров несколькими operationengine.
На данный момент развернуто 4 ноды operationengine, поэтому было бы удобно если количество триггеров делилось на 4.
Так мы сможем посмотреть нормально ли балансируется нагрузка между operationengine.
Решение: оставляем значения 4, 16, 24, 32, 40
* Количество проектов
Этот параметр нужен для проверки корректности работы карбора с трастами.
Зафиксируем количество проектов равным 3 на протяжении всего тестирования.
Решение: фиксируем на 3.
Итого:
| Параметр | Значения |
| ------------------------------ | ---------------------- |
| Количество планов на проект | 3, 20, 100 |
| Количество дисков в одном плане | Выбрасываем |
| Размер дисков | 10, 35, 60, 1000 |
| Наполненность диска | 60 |
| Количество операций на триггер | Выбрасываем |
| Количество триггеров на проект | 4, 16, 24, 32, 40 |
| Количество проектов | 3 |
> NOTE: Есть взаимосвязь между количеством планов на проект, триггерами на проект и операциями на триггер.
## Общие моменты
- Длительность одного сценария составит 4 часа.
- В один из сценариев дополнительно введем тесты на восстановление дисков из бэкапов.
- Если во время одного из сценариев карбор перестанет работать, то нужно будет собрать как можно больше информации о том почему так произошло.
- Во время тестов будем считать 1 план = 1 диск
- У запланированных операций фиксируем max_backups = 1
- Так как нам важно получать пиковые нагрузки, то во всех тестах триггеры будут срабатывать в одно и то же время.
## Подходы к проведению тестирования
> В результатах не убраны неподходящие кейсы!
### Использование pairwise с отбрасыванием неподходящих случаев
Входные параметры:
```
plan_per_project: 3, 20, 100
disk_size: 10, 35, 60, 1000
disk_fill_percent: 60
trigger_per_project: 4, 16, 24, 32, 40
projects: 3
```
Результат:
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects |
|------------------|-----------|-------------------|---------------------|----------|
| 3 | 60 | 60 | 16 | 3 |
| 100 | 35 | 60 | 24 | 3 |
| 20 | 35 | 60 | 40 | 3 |
| 100 | 10 | 60 | 40 | 3 |
| 100 | 1000 | 60 | 4 | 3 |
| 20 | 60 | 60 | 24 | 3 |
| 20 | 1000 | 60 | 16 | 3 |
| 3 | 60 | 60 | 4 | 3 |
| 20 | 10 | 60 | 32 | 3 |
| 3 | 60 | 60 | 40 | 3 |
| 3 | 1000 | 60 | 40 | 3 |
| 3 | 1000 | 60 | 24 | 3 |
| 100 | 35 | 60 | 16 | 3 |
| 20 | 35 | 60 | 4 | 3 |
| 100 | 60 | 60 | 32 | 3 |
| 3 | 1000 | 60 | 32 | 3 |
| 3 | 10 | 60 | 24 | 3 |
| 100 | 10 | 60 | 4 | 3 |
| 100 | 10 | 60 | 16 | 3 |
| 3 | 35 | 60 | 32 | 3 |
Получается слишком много тест кейсов.
Если убрать промежуточные значения то получится чуть меньше.
Входные параметры:
```
plan_per_project: 3, 20, 100
disk_size: 35, 1000
disk_fill_percent: 60
trigger_per_project: 4, 24, 40
projects: 3
```
Результат:
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects |
|------------------|-----------|-------------------|---------------------|----------|
| 3 | 35 | 60 | 4 | 3 |
| 3 | 1000 | 60 | 24 | 3 |
| 20 | 35 | 60 | 24 | 3 |
| 100 | 35 | 60 | 24 | 3 |
| 100 | 1000 | 60 | 40 | 3 |
| 20 | 1000 | 60 | 4 | 3 |
| 100 | 1000 | 60 | 4 | 3 |
| 20 | 35 | 60 | 40 | 3 |
| 3 | 35 | 60 | 40 | 3 |
#### Плюсы
- Так получится снять наиболее полные профили по нагрузке
#### Минусы
- Могут возникнуть проблемы с интерпретацией результатов
### Плавный проход по параметрам
Тут идея в том, чтобы начать со среднего случая. Продолжить кейсами с увеличением каждого из параметров. И закончить на максимумах.
Предлагаются следующие тест кейсы:
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects | description |
|------------------|-----------|-------------------|---------------------|----------|-------------------------|
| 20 | 35 | 60 | 24 | 3 | средний случай |
| 100 | 35 | 60 | 4 | 3 | max plan_per_project |
| 3 | 1000 | 60 | 4 | 3 | max disk_size |
| 3 | 35 | 60 | 40 | 3 | max trigger_per_project |
| 100 | 1000 | 60 | 40 | 3 | all max |
#### Плюсы
- Мало тест кейсов
- Понятнее что происходит в каждом кейсе => меньше проблем с интерпретацией
#### Минусы
- Кроме первого и последнего теста не отражает реальный профиль нагрузки. Остальные тесты дают профиль нагрузки по конкретному параметру.
- Непонятно как увеличивается нагрузка в зависимости от увеличения параметра (два мало).
### Увеличение всех параметров на каждой итерации
Тут основная идея найти параметры при которых все свалится.
Предлагается два варианта сценариев.
#### Вариант 1
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects | op_per_trigger | total_disk_size |
|------------------|-----------|-------------------|---------------------|----------|----------------|-----------------|
| 12 | 100 | 60 | 12 | 3 | 1 | 1200 Gb |
| 20 | 140 | 60 | 20 | 3 | 1 | 2800 Gb |
| 60 | 70 | 60 | 30 | 3 | 2 | 4200 Gb |
| 80 | 70 | 60 | 40 | 3 | 2 | 5600 Gb |
| 150 | 45 | 60 | 50 | 3 | 3 | 6750 Gb |
Немного подкорректировал первый вариант, чтобы росло количество запланированных операций на триггер.
И изменил размеры дисков чтобы нагрузка также возрастала от сценария к сценарию.
#### Вариант 2
Здесь размер диска изменяется от большего к меньшему. При таком подходе тест кейсы влезут в ceph.
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects |
|------------------|-----------|-------------------|---------------------|----------|
| 3 | 100 | 60 | 1 | 3 |
| 20 | 70 | 60 | 4 | 3 |
| 40 | 50 | 60 | 24 | 3 |
| 60 | 35 | 60 | 40 | 3 |
| 100 | 10 | 60 | 100 | 3 |
#### Плюсы
- Такой подход позволит быстро определить пределы возможностей нашей инфраструктуры
#### Минусы
- Есть ощущение, что профили нагрузки будет сложно анализировать
### Решение
После обсуждения стратегии тестирования договорились тестировать по следующему сценарию:
| plan_per_project | disk_size | disk_fill_percent | trigger_per_project | projects | op_per_trigger | total_disk_size |
|------------------|-----------|-------------------|---------------------|----------|----------------|-----------------|
| 12 | 100 | 60 | 12 | 3 | 1 | 1200 Gb |
| 20 | 140 | 60 | 20 | 3 | 1 | 2800 Gb |
| 60 | 70 | 60 | 30 | 3 | 2 | 4200 Gb |
| 80 | 70 | 60 | 40 | 3 | 2 | 5600 Gb |
| 150 | 45 | 60 | 50 | 3 | 3 | 6750 Gb |
Подход заключается в увеличении всех параметров на каждой итерации. После каждого сценария необходимо будет проинтерпретировать результаты и, возможно, скорректировать последующие тест кейсы.