⚠️ 此页面为自动翻译,翻译可能不完美。

New options for loading indexes

在本文中,我们将讨论在3.0.2版本中引入的加载数据的新选项

一个包含数据的索引由多个组件组成,如字典、文档和命中列表、属性。整个索引不会完全加载到RAM中,因为它可能无法容纳,而是其组件以不同的方式读取和加载。

属性

属性默认加载到RAM中,但可以随时选择加载所有属性、仅加载标量类型(整数或浮点数)或保留在磁盘上。

属性作为内存映射文件加载。使用mmap()加载属性的优势是比使用pread()的经典seek&read方法性能更好。它还允许使用少量RAM处理大文件。

在2.x版本中,属性加载通过ondisk_attrs处理。即使我们选择将属性加载到RAM中,使用mmap()读取整个文件并不能保证文件的页面会保留在RAM中,因为操作系统内核可以释放它们(这对应用程序来说不是问题,因为内存映射文件本身由磁盘上的文件支持)。为了确保属性保留在RAM中且操作系统不会将其交换到磁盘,需要使用mlock

在3.0.2版本中,我们决定进行更改,不再使用一个设置来指定加载哪些属性类型,另一个设置用于mlocking,而是使用两个设置,每个设置针对属性类型,决定它们如何加载以及是否应锁定。

新设置是 access_blob_attrs - 管理可变长度属性(字符串、JSON、MVA) - 和 access_plain_attrs - 管理固定长度属性(uint、bigint、float、timestamp、bool)。可能的值为mmapmmap_prereadmlock

从旧指令切换到新指令非常简单:

  • ondisk_attrs = 0 表示没有属性保留在磁盘上,它们在RAM中预读。这是默认值,同时mlock=0。现在等同于access_blob_attrs = mmap_prereadaccess_plain_attrs= mmap_preread。当所有属性都能适应RAM时应使用此模式。为了确保它们不会被交换到磁盘,可以改用access_blog_attrs = mlockaccess_plain_attrs = mlock,等同于ondisk_attrs=0mlock=1
  • ondisk_attrs=1 表示所有属性都保留在磁盘上。使用新选项时,必须指定access_blob_attrs=mmapaccess_plain_attrs=mmap
  • ondisk_attrs=pool 表示将字符串、JSON和MVA属性保留在磁盘上。现在要达到相同效果,需要执行access_blob_attrs=mmapaccess_plain_attrs=mmap_preread

但现在也可以将数值属性保留在磁盘上,而加载可变长度属性(通过执行access_blob_attrs=mmap_preread/access_plain_attrs=mmap),例如当RAM不足以容纳所有属性且查询在可变长度属性上执行更多操作(过滤、分组、排序)时。

也可以仅对某些属性进行mlocking。例如,我们希望数值属性保留在RAM中,但其他属性可以预读到RAM中,但我们接受不锁定它们以释放一些内存空间。

全文索引

索引的全文部分本身包含多个组件。字典组件(.spi)始终加载到RAM中,因为它对全文搜索性能至关重要,且大小不大。文档列表(.spd)保存了索引词到文档和字段的引用。此组件通常较大,以前使用**pread()**访问。

全文索引的另一个组件是命中列表(.spp),其中包含字段中词的位置。命中列表也可以很大(但不如文档列表大),并且以前以与文档列表相同的方式访问。从3.0.2版本开始,这两个组件都可以使用mmap()而不是pread()加载,通过 access_doclistsaccess_hitlists。该设置接受两个值:file(使用pread(),这是默认值)和mmap

如何设置内存指令?

默认情况下,全文索引组件使用file,所有属性使用mmap_preread,这是内存使用和搜索性能之间最平衡的配置文件。

为了确保加载到内存中的属性数据不会被操作系统丢弃,可以使用mlock。锁定应在内存充足以容纳属性但同时为文档/命中列表保留足够内存的系统上使用。当索引可以完全加载/缓存到RAM中时,性能最佳。使用file方法的文档/命中列表可以通过将它们的文件发送到/dev/null进行预热。

对于需要从第一个查询就获得最佳性能的情况,可以使用searchd--force-preread选项。此选项应谨慎使用,因为守护进程在启动完成之前不会响应传入的查询。对于单机设置,这意味着在启动完成之前无法进行搜索查询,这可能根据启动所需时间与在此期间响应查询所需时间的权衡而不可接受。

如果索引大于可用内存或可以接受更长的预热时间,应使用简单的file/mmap。如果索引无法很好地适应RAM,性能将受到存储性能的影响。在更多内存和更快存储之间进行选择取决于每种资源的成本。更快的存储(如NVMe)将减少内存不足的缺点。有足够的内存但存储较慢意味着启动或索引重新加载会更慢,性能在索引加载到内存之前会受到影响。

安装Manticore Search

安装Manticore Search