Neptune 查找缓存可以加快读取查询的速度 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Neptune 查找缓存可以加快读取查询的速度

Amazon Neptune 实现了查找缓存,该缓存使用 R5d 实例的基于 NVMe 的 SSD 来提高频繁、重复查找属性值或 RDF 文本的查询的读取性能。查找缓存会临时将这些值存储在 NVMe SSD 卷中,在那里可以快速访问它们。

Amazon Neptune 引擎版本 1.0.4.2.R2(2021 年 6 月 1 日) 开始,此特征可用。

如果需要从集群存储卷而不是内存中检索属性值或文本,则返回大量顶点和边缘或许多 RDF 三元组的属性的读取查询可能会有很高的延迟。示例包括长时间运行的读取查询,这些查询会从身份图形中返回大量全名,或者从欺诈检测图形中返回大量的 IP 地址。随着查询返回的属性值或 RDF 文本数量增加,可用内存会减少,查询执行可能会显著降级。

Neptune 查找缓存的用例

只有当读取查询返回非常大量的顶点和边缘或 RDF 三元组的属性时,查找缓存才会有所帮助。

为了优化查询性能,Amazon Neptune 使用 R5d 实例类型为此类属性值或文本创建大型缓存。这样,从缓存中检索它们要比从集群存储卷中检索它们快得多。

根据经验,只有满足以下所有三个条件时,才值得启用查找缓存:

  • 您会一直在观察到读取查询的延迟时间增加。

  • 在运行读取查询时,您还会发现BufferCacheHitRatioCloudWatch 指标有所下降(请参阅使用亚马逊监控 Neptune CloudWatch)。

  • 在呈现结果之前,读取查询会花费大量时间来实体化返回值(有关确定要为查询实体化多少个属性值的方法,请参阅下面的 Gremlin-Profile 示例)。

注意

此特征在上述特定情况下有用。例如,查找缓存根本无助于聚合查询。除非您运行的查询会受益于查找缓存,否则没有理由使用 R5d 实例类型来代替等效且成本更低的 R5 实例类型。

如果您使用的是 Gremlin,则可以使用 Gremlin profile API 来评测查询的实体化成本。在“索引操作”下,它显示了在执行过程中实体化的项数量:

Index Operations Query execution: # of statement index ops: 3 # of unique statement index ops: 3 Duplication ratio: 1.0 # of terms materialized: 5273 Serialization: # of statement index ops: 200 # of unique statement index ops: 140 Duplication ratio: 1.43 # of terms materialized: 32693

实体化的非数字项的数量与 Neptune 必须执行的项查找数量成正比。

使用查找缓存

查找缓存仅在 R5d 实例类型上可用,默认情况下会自动启用。Neptune R5d 实例具有与 R5 实例相同的规格,外加高达 1.8TB 的基于 NVMe 的本地 SSD 存储。查找缓存特定于实例,受益的工作负载可以专门定向到 Neptune 集群中的 R5d 实例,而其它工作负载可以定向到 R5 或其它实例类型。

要在 Neptune 实例上使用查找缓存,只需将该实例升级为 R5d 实例类型即可。当您这样做时,Neptune 会自动将 neptune_lookup_cache 数据库集群参数设置为 'enabled',并在该特定实例上创建查找缓存。然后,您可以使用 实例状态 API 确认缓存已启用。

同样,要在给定实例上禁用查找缓存,请将该实例从 R5d 实例类型缩减到等效的 R5 实例类型。

启动 R5d 实例时,查找缓存处于启用状态并处于冷启动模式,这意味着它是空的。Neptune 在处理查询时首先在查找缓存中检查属性值或 RDF 文本,如果它们尚不存在,则添加它们。这会逐渐预热缓存。

当您将需要属性值或 RDF 文本查找的读取查询定向到 R5d 读取器实例时,在缓存预热时读取性能会略有下降。但是,当缓存预热后,读取性能会显著提高,并且您还可能会看到与查找命中缓存而非集群存储相关的 I/O 成本下降。内存利用率也有所提高。

如果您的写入器实例是 R5d,则它会在每次写入操作时自动预热其查找缓存。这种方法确实会稍微增加写入查询的延迟,但可以更高效地预热查找缓存。然后,如果您将需要属性值或 RDF 文本查找的读取查询定向到写入器实例,则可以立即开始获得改进的读取性能,因为已在此处缓存了这些值。

此外,如果您在 R5d 写入器实例上运行批量加载程序,则可能会注意到由于缓存的原因,其性能略有下降。

由于查找缓存特定于每个节点,因此主机替换会将缓存重置为冷启动。

通过将 neptune_lookup_cache 数据库集群参数设置为 'disabled',您可以暂时禁用数据库集群中所有实例上的查找缓存。但是,一般而言,通过将特定实例从 R5d 缩减到 R5 实例类型来禁用这些实例上的缓存更有意义。