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数据库集群参数设置为1(已启用),并在该特定实例上创建查找缓存。然后,您可以使用 实例状态 API 确认缓存已启用。

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

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

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

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

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

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

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