# 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 部署。无论您是在规划生产部署、调试性能问题，还是微调配置，此工具都提供全面的测试功能，包括实时监控和详细分析。它既注重简单性又具备强大功能，支持从基本查询测试到复杂多进程工作负载模拟的一切需求。

## 引言

这里有一个有趣的事实：当人们问 Manticore 是否能处理他们的工作负载时，我们将其视为一种挑战。而当性能对我们来说至关重要时，您需要做好准备。这就是 Manticore Load Emulator —— 一个开源工具，旨在对 Manticore（以及您的硬件）进行全面测试。

无论您是想知道 Manticore 是否能处理您的独特设置，还是只是想榨干它的每一分性能，这个工具都能为您提供帮助。

您可以在 [GitHub](https://github.com/manticoresoftware/manticore-load) 上获取它，或者从我们的仓库安装为软件包（Manticore 版本 > 6.3.8）。

## 为什么我们要开发它

我们经常被问到：“Manticore 能处理我的工作负载吗？”简短的回答通常是“可以”。但与其让我们来信服您，我们开发了这个工具，让您自己进行测试。Manticore Load Emulator 关注透明度和赋权，而且将您的硬件推向极限的过程非常有趣。

## 使用场景

### 1. 新部署的性能验证
在使用 Manticore Search 上线之前，使用 Load Emulator 模拟预期的工作负载。这确保您的基础设施已正确扩展并配置为实现最佳性能。

### 2. 调试和故障排除
通过运行受控测试来识别瓶颈或性能下降。例如，分析特定查询模式或大数据集如何影响查询延迟和吞吐量。

### 3. 现有设置的优化
微调配置，如批量大小、线程数或查询缓存，以实现最佳性能。使用超参数测试功能来自动化比较。

### 4. 评估基础设施变更
计划升级硬件、调整数据库分片或迁移到不同的云提供商？Load Emulator 允许您在不同设置之间进行基准测试和性能比较。

### 5. 可扩展性压力测试
模拟极端工作负载以评估部署在高流量下的扩展能力。这对于准备产品发布或季节性高峰尤其有用。

## 核心功能

这就是为什么 Manticore Load Emulator 是基准测试和测试的出色工具：

### 1. SQL 驱动的简洁性
该工具利用 Manticore 的 SQL 支持，使其易于模拟各种工作负载。编写负载或查询场景就像编写 SQL 命令一样简单。

### 2. 高并发支持
使用多个线程和进程模拟真实世界的高负载场景。如果您的服务器能处理，这个工具会将其推向极限。

### 3. 自定义查询生成
生成动态查询，支持灵活的模式，从随机文本到精确的整数、浮点数或数组范围：
- `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. 批量加载
通过可配置的批量大小一次性高效加载数百万条记录。

### 5. 实时监控与分析
通过全面的指标跟踪测试性能，包括：
- 进度和吞吐量（QPS）
- 详细的延迟百分位数
- 识别性能瓶颈
- 实时状态更新

### 6. 灵活的配置
命令行参数允许您调整工作负载的每个方面。需要模拟多种类型的查询？使用 `--together` 选项并行运行不同的工作负载。

### 7. 超参数测试
在单次运行中通过逗号分隔的值比较线程数或批量大小。例如：

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

### 8. 静默模式用于分析
在 `--quiet` 模式下，工具输出以分号分隔的结果，便于直接复制到 Google Sheets 或 Excel 中进行可视化。

### 9. 多进程支持
需要测试分片设置或同时运行多个工作负载？这个强大的标志允许您在同一个测试会话中并行运行多个测试配置。与按顺序运行测试（可能耗时）相比，`--together` 将您的测试运行合并为一次高效执行。

例如，您可以：
- 同时测试数据库的多个分片
- 对不同数据库版本运行相同的测试套件
- 在各种配置设置下验证您的应用程序
- 比较不同设置之间的性能指标

只需在测试命令后附加 `--together`，并指定多个测试配置。工具将处理并行执行，同时保持结果的组织性和易于比较性。

### 10. 优雅关闭
如果需要在测试中途停止（或意外按下 Ctrl+C），该工具可确保干净的终止，而不会留下混乱。

### 11. 两种延迟跟踪模式
- **基于直方图**：内存效率高，适合观察整体趋势
- **精确模式**：用于精确的延迟百分位数，因为有时精度是关键

## 入门指南

以下是一个快速示例，帮助您入门：

### 示例 1：简单插入

以每批10K的批次插入100万整数：

```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：模拟并发

7-8% 的 CPU 负载和每秒160K文档似乎对您的工作负载来说太低？通过增加线程数来提高负载：

```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)

好的，现在我们在25% CPU负载下达到了665K。看起来我们还能从实例中榨取更多性能，但这需要同时写入多个表。让我们这样做：

### 示例 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)

我们可以看到，使用当前模式和表中100万文档，吞吐量可达到每秒9858次选择，平均延迟4.3ms，p95延迟6.5ms。

难道不是在几分钟内就能得出这样的结论吗？

## 结论
Manticore Load Emulator 不仅仅是一个基准测试工具——它是确保您的搜索部署达到最佳性能的合作伙伴。无论您是在运行小型概念验证还是扩展以处理数百万个查询，此工具都能为您提供所需的见解，以做出有关基础设施和配置的明智决策。

记住：最佳性能测试是迭代的。从小规模开始，收集数据，进行调整，然后再次测试。使用 Manticore Load Emulator，您拥有构建和验证高性能搜索解决方案所需的所有工具。
