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. 新部署的性能验证

在 Manticore Search 上线之前,使用 Load Emulator 模拟您预期的工作负载。这确保您的基础设施在峰值性能时得到适当的扩展和配置。

2. 调试和故障排除

通过运行受控测试来识别瓶颈或性能下降。例如,分析特定查询模式或大型数据集如何影响查询延迟和吞吐量。

3. 现有设置的优化

微调配置,例如批量大小、线程数或查询缓存,以实现最佳性能。使用超参数测试功能来自动化比较。

4. 评估基础设施变更

计划升级您的硬件、调整数据库分片或迁移到不同的云提供商?Load Emulator 允许您基准测试并比较不同设置的性能。

5. 可扩展性的压力测试

模拟极端工作负载,以评估您的部署在高流量下的扩展能力。这对于准备产品发布或季节性高峰等事件尤其有用。

Key Features

以下是 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> 随机真或假
  • <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. 超参数测试

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

--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 万个整数:

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

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

example 2

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

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

example 3

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

example 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"

example 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"

example 5

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

难道不是很棒吗,您可以在短短几分钟内得出这样的结论?

结论

Manticore 负载模拟器不仅仅是一个基准测试工具——它是您确保搜索部署最佳性能的合作伙伴。无论您是在运行小型概念验证还是扩展以处理数百万个查询,该工具都提供了您需要的洞察,以便对基础设施和配置做出明智的决策。

请记住:最佳性能测试是迭代的。先从小开始,收集数据,进行调整,然后再测试。使用 Manticore 负载模拟器,您拥有构建和验证高性能搜索解决方案所需的所有工具。

安装Manticore Search

安装Manticore Search