内存和多线程对索引性能的影响
向 Meilisearch 索引添加新文档是一个多线程且内存密集型的操作。本文提供了关于索引性能的更多信息。
向索引添加新文档是一个多线程且内存密集型操作。Meilisearch 的索引是我们搜索引擎快速、相关且可靠的核心所在。本文解释了有关 RAM 消耗和多线程的一些细节。
内存
默认情况下,我们的索引器使用 Rust 库 sysinfo 来计算机器的总内存大小。然后 Meilisearch 会调整其行为,使索引操作最多使用可用资源的三分之二。或者,您可以使用 --max-indexing-memory 实例选项手动控制 Meilisearch 可以消耗的最大 RAM 量。
防止 Meilisearch 在索引期间使用所有可用内存非常重要。如果发生这种情况,会产生两个负面影响:
-
Meilisearch 可能会因过度消耗 RAM 而被操作系统终止
-
当索引器处理更新时,搜索性能可能会下降
在以下两种情况下仍可能发生内存过度消耗:
-
当让 Meilisearch 自动设置索引期间使用的最大内存量时,
sysinfo可能无法为某些操作系统计算可用 RAM 量。Meilisearch 仍会根据经验做出估计并调整其行为,但在这种情况下仍可能发生崩溃。点击此链接查看sysinfo支持的完整操作系统列表 -
低端机器在处理大型数据集时可能会遇到困难。在这种情况下,将数据负载拆分为较小的批次可能会有所帮助。更多信息,请参阅下文
多线程处理
在多核处理器机器上,索引器会避免使用超过一半的可用处理单元。例如,如果您的机器有十二个核心,索引器最多只会尝试使用其中的六个。这确保了 Meilisearch 在执行搜索时始终保持响应,即使在更新索引时也是如此。
您可以通过使用 --max-indexing-threads 实例选项来覆盖 Meilisearch 的默认线程限制。允许 Meilisearch 使用所有处理器核心进行索引可能会对用户的搜索体验产生负面影响。
遗憾的是,在只有一个处理器核心的机器上无法实现多线程处理。
内存崩溃问题
在某些情况下,操作系统会中断 Meilisearch 并停止其所有进程。大多数这类崩溃发生在索引过程中,是由于机器内存耗尽导致的。这意味着您的计算机没有足够的内存来处理数据集。
Meilisearch 已意识到这个问题并正在积极尝试解决。如果您遇到与内存相关的崩溃问题,可以考虑:
- 以更小的批次添加新文档
- 增加机器的内存容量
- 遵循索引最佳实践