# Manticore Load Emulator

Discover Manticore Load Emulator, an open-source tool for benchmarking and optimizing Manticore Search deployments. Simulate real-world workloads, analyze performance, and fine-tune your search configurations with advanced features and real-time monitoring.

## TL;DR
Manticore Load Emulator — это открытый инструмент для бенчмаркинга, который помогает проверять и оптимизировать развертывания Manticore Search. Независимо от того, планируете ли вы продакшн‑развёртывание, отлаживаете проблемы с производительностью или тонко настраиваете конфигурацию, этот инструмент предоставляет всесторонние возможности тестирования с мониторингом в реальном времени и детальной аналитикой. Созданный как для простоты, так и для мощности, он поддерживает всё — от базового тестирования запросов до сложного многопроцессного моделирования нагрузки.

## Introduction

Вот интересный факт: когда люди спрашивают, справится ли Manticore с их нагрузкой, мы воспринимаем это как вызов. И когда производительность так же важна для нас, как и для вас, нужно быть готовыми. Представляем Manticore Load Emulator — открытый инструмент, разработанный для того, чтобы испытать Manticore (и ваше оборудование) на пределе.

Независимо от того, интересуетесь ли вы, справится ли Manticore с вашей уникальной конфигурацией, или просто хотите выжать из него каждый процент производительности, этот инструмент покрывает все ваши потребности.

Вы можете получить его на [GitHub](https://github.com/manticoresoftware/manticore-load) или установить как пакет из нашего репозитория (версия Manticore > 6.3.8).

## Why We Built It

Нас часто спрашивают: «Сможет ли Manticore справиться с моей нагрузкой?» Краткий ответ обычно «Да». Но вместо того, чтобы просто принимать наши слова, мы создали инструмент, чтобы вы могли проверить это сами. Manticore Load Emulator — это о прозрачности и возможности управлять процессом, плюс это очень весело — доводить ваше оборудование до предела.

## Use Cases

### 1. Performance Validation for New Deployments
Перед запуском Manticore Search в продакшн используйте Load Emulator для симуляции ожидаемой нагрузки. Это гарантирует, что ваша инфраструктура правильно масштабирована и настроена для пиковой производительности.

### 2. Debugging and Troubleshooting
Определяйте узкие места или падение производительности, проводя контролируемые тесты. Например, анализируйте, как определённые шаблоны запросов или большие наборы данных влияют на задержку запросов и пропускную способность.

### 3. Optimization of Existing Setups
Точно настраивайте такие параметры, как размер пакетов, количество потоков или кэширование запросов, чтобы достичь оптимальной производительности. Используйте функцию тестирования гиперпараметров для автоматизации сравнений.

### 4. Evaluating Infrastructure Changes
Планируете обновить оборудование, изменить шардинг базы данных или перейти к другому облачному провайдеру? Load Emulator позволяет проводить бенчмарки и сравнивать производительность разных конфигураций.

### 5. Stress Testing for Scalability
Симулируйте экстремальные нагрузки, чтобы оценить, насколько хорошо ваше развертывание масштабируется при большом трафике. Это особенно полезно при подготовке к событиям, таким как запуск продукта или сезонные всплески.

## Key Features

Вот почему Manticore Load Emulator выделяется среди инструментов для бенчмаркинга и тестирования:

### 1. SQL-Powered Simplicity
Инструмент использует поддержку SQL в Manticore, что делает простым эмуляцию самых разных нагрузок. Создание сценариев нагрузки или запросов так же просто, как написание SQL‑команд.

### 2. High Concurrency Support
Симулируйте реальные, высоконагруженные сценарии, используя несколько потоков и процессов. Если ваш сервер способен справиться, этот инструмент доведёт его до предела.

### 3. Custom Query Generation
Генерируйте динамические запросы с гибкими шаблонами, от случайного текста до точных диапазонов целых, чисел с плавающей точкой или массивов:
- `value`                        Точное значение для использования
- `<increment>`                  Автоинкрементное значение, начиная с 1
- `<increment/1000>`             Автоинкрементное значение, начиная с 1000
- `<string/3/10>`                Случайная строка, длина от 3 до 10
- `<text/20/100>`                Случайный текст от 20 до 100 слов
- `<text/{/path/to/file}/10/100>` Случайный текст из слов файла, от 10 до 100 слов
- `<int/1/100>`                  Случайное целое от 1 до 100
- `<float/1/1000>`               Случайное число с плавающей точкой от 1 до 1000
- `<boolean>`                    Случайное true или false
- `<array/2/10/100/1000>`        Массив из 2‑10 элементов, значения от 100 до 1000
- `<array_float/256/512/0/1>`    Массив из 256‑512 случайных чисел с плавающей точкой, значения от 0 до 1

### 4. Batch Loading
Эффективно загружайте миллионы записей за один раз, задавая размер пакетов.

### 5. Real-Time Monitoring & Analytics
Отслеживайте производительность теста с помощью комплексных метрик, включая:
- Прогресс и пропускную способность (QPS)
- Детальные перцентили задержек
- Выявление узких мест производительности
- Обновления статуса в реальном времени

### 6. Flexible Configuration
Параметры командной строки позволяют настроить каждый аспект нагрузки. Нужно симулировать несколько типов запросов? Используйте опцию `--together`, чтобы запускать разные нагрузки параллельно.

### 7. Hyperparameter Testing
Сравнивайте количество потоков или размер пакетов в одном запуске, задавая значения через запятую. Например:

```bash
--threads=1,2,4,8 --batch-size=100,1000,10000
```

### 8. Quiet Mode for Analysis
В режиме `--quiet` инструмент выводит результаты, разделённые точкой с запятой, что упрощает их визуализацию при копировании напрямую в Google Sheets или Excel.

### 9. Multi-Process Support
Нужно протестировать шардинг или несколько нагрузок одновременно? Этот мощный флаг позволяет запускать несколько конфигураций тестов параллельно в рамках одной сессии. Вместо последовательного выполнения, которое может занять много времени, `--together` объединяет ваши тесты в единый, эффективный запуск.

Например, вы можете:
- Тестировать несколько шардов базы данных одновременно
- Запускать один и тот же набор тестов против разных версий базы
- Проверять приложение при разных настройках конфигурации
- Сравнивать метрики производительности между различными конфигурациями

Просто добавьте `--together` к команде теста и укажите несколько конфигураций. Инструмент выполнит параллельный запуск, сохранив результаты организованными и легко сравнимыми.

### 10. Корректное завершение
Если вам нужно остановить процесс посередине теста (или случайно нажать Ctrl+C), инструмент обеспечивает чистое завершение без оставления беспорядка.

### 11. Два режима отслеживания задержки
- **Histogram-Based**: Эффективное по памяти и приближённое для общих тенденций
- **Precise**: Для точных процентилей задержки, потому что иногда точность имеет решающее значение

## Начало работы

Вот быстрый пример, чтобы вы начали:

### Пример 1: Простая вставка

Вставьте 1 миллион целых чисел пакетами по 10 тысяч:

```bash
manticore-load \
  --drop \
  --init="create table t(a int)" \
  --load="insert into t values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --total=1000000
```

![example 1](./manticore-load/example-1.png)

### Пример 2: Симуляция конкурентности

Нагрузка CPU 7‑8 % и 160 тыс. документов в секунду кажется слишком низкой для вашей нагрузки? Давайте увеличим её, повысив количество потоков:

```bash
manticore-load \
  --drop \
  --init="create table t(a int)" \
  --load="insert into t values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --threads=16 \
  --total=10000000
```

![example 2](./manticore-load/example-2.png)

Хорошо, теперь мы получили 665 тыс. при 25 % нагрузки CPU. Похоже, мы можем выжать больше из инстанса, но это требует записи в несколько таблиц одновременно. Давайте сделаем это:

### Пример 3: Шардированная нагрузка

Протестируйте шардированную среду, загружая данные в несколько таблиц одновременно:

```bash
manticore-load --quiet \
  --drop \
  --init="create table t(a int)" \
  --load="insert into t values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --threads=8 \
  --total=5000000 \
  --together \
  --drop \
  --init="create table t2(a int)" \
  --load="insert into t2 values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --threads=8 \
  --total=5000000 \
  --together \
  --drop \
  --init="create table t3(a int)" \
  --load="insert into t3 values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --threads=8 \
  --total=5000000 \
  --together \
  --drop \
  --init="create table t4(a int)" \
  --load="insert into t4 values(0, <int/1/1000000>)" \
  --batch-size=10000 \
  --threads=8 \
  --total=5000000
```

![example 3](./manticore-load/example-3.png)

Слишком много данных и вам не нужен прогресс? Добавив флаг `--quiet`, инструмент будет выводить только окончательные результаты:

![example 3-2](./manticore-load/example-3-2.png)

### Пример 4: Комбинация записей и чтений

Предыдущие примеры были сосредоточены на загрузке данных. Что если вы хотите протестировать производительность записи/чтения? Давайте также используем более реалистичную нагрузку, а не только целые числа.

```bash
manticore-load \
  --total=1000000 \
  --batch-size=10000 \
  --drop \
  --init="create table products(name text, price float, stock int)" \
  --load="insert into products(name, price, stock) values('<text/3/10>', <float/1/100>, <int/1/100>)" \
  --together \
  --total=10000 \
  --load="select * from products where match('<text/2/5>') and price < 10"
```

![example 4](./manticore-load/example-4.png)

Мы можем увидеть, как производительность чтения ухудшается по мере загрузки большего объёма данных.

### Пример 5: Тестирование гиперпараметров

Давайте проверим, как различное количество потоков влияет на производительность:

```bash
manticore-load \
  --total=10000 \
  --quiet \
  --threads=1,4,8,16,32,64 \
  --load="select * from products where match('<text/2/5>') and price < 10"
```

![example 5](./manticore-load/example-5.png)

Мы видим, что с текущей схемой и 1 миллионом документов в таблице пропускная способность может достигать 9858 запросов в секунду при средней задержке 4,3 мс и p95 задержке 6,5 мс.

Разве не здорово, что такие выводы можно сделать всего за пару минут?

## Заключение
Manticore Load Emulator — это больше, чем просто инструмент для бенчмаркинга — это ваш партнёр в обеспечении оптимальной производительности ваших поисковых развертываний. Независимо от того, запускаете ли вы небольшой прототип или масштабируетесь для обработки миллионов запросов, этот инструмент предоставляет необходимые инсайты для принятия обоснованных решений о вашей инфраструктуре и конфигурации.

Помните: лучшее тестирование производительности — это итеративный процесс. Начинайте с малого, собирайте данные, вносите корректировки и тестируйте снова. С Manticore Load Emulator у вас есть все инструменты, необходимые для создания и валидации высокопроизводительного поискового решения.
