blog-post

Manticore Load Emulator

TL;DR

Manticore Load Emulator 是一款开源基准测试工具,帮助您验证和优化您的 Manticore Search 部署。无论您是计划生产部署、调试性能问题,还是细化配置,这个工具都提供了全面的测试能力,结合实时监控和详细分析。它兼顾简单性和强大功能,支持从基本查询测试到复杂的多进程工作负载模拟。

Introduction

这里有一个有趣的事实:当人们问 Manticore 是否能够处理他们的工作负载时,我们把它当作一个挑战。当性能对我们来说如此重要时,您需要做好准备。引入 Manticore Load Emulator——一款旨在让 Manticore(和您的硬件)经受考验的开源工具。

无论您是在想 Manticore 是否能处理您的独特设置,还是只是想从中榨取每一滴性能,这个工具都能满足您的需求。

您可以在 GitHub 上获取它,或者通过我们仓库安装为一个软件包(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

该工具利用 Manticore 的 SQL 支持,使得模拟各种工作负载变得简单。编写您的负载或查询场景就像编写 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> 随机真或假
  • <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

通过用逗号分隔的值在一次运行中比较线程数量或批量大小。例如:

--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. 两种延迟跟踪模式

  • 基于直方图:节省内存,适用于大趋势的近似值
  • 精确:用于确切的延迟百分位数,因为有时候精度是关键

开始使用

以下是一个快速示例,让您开始:

示例 1:简单插入

以 10K 的批量插入 100 万个整数:

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

示例 1

示例 2:模拟并发

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

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

示例 2

好的,现在我们得到了 665K 的 CPU 负载为 25%。看起来我们可以从实例中挤出更多,但是这需要同时写入多个表。让我们来做:

示例 3:分片工作负载

通过同时加载数据到多个表来测试分片环境:

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

示例 3

数据太多,您不需要进度?通过添加 --quiet 标志,该工具只会输出最终结果:

示例 3-2

示例 4:结合写入和读取

之前的示例聚焦于加载数据。如果您想测试写/读性能怎么办?我们还可以使用比整数更为现实的工作负载。

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"

示例 4

我们可以看到随着数据的加载,读取性能如何下降。

示例 5:超参数测试

让我们测试不同线程数对性能的影响:

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

示例 5

我们可以看到,在当前架构和表中 100 万条文档的情况下,吞吐量可达到每秒 9858 次选择,平均延迟为 4.3ms,p95 延迟为 6.5ms。

要知道,您可以在短短几分钟内得出这样的结论,真是太好了!

结论

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

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

安装Manticore Search

安装Manticore Search