我目前正在运行一些查询,在第一个调用(最多2分钟)到接下来的一个(大约5秒)之间,性能差距很大。
这种持续时间差异可以通过gremlin在执行模式和配置文件模式中看到。
由于查询正在加载大量数据,我预计问题来自Neptune在其默认配置中的缓存功能。我无法通过配置找到任何改进这种行为的方法,我很乐意有一些建议,以减少第一次调用的长度。
上下文:
Neptune数据库运行在db.r5.8x大型实例上,在执行过程中CPU始终保持在20%以下。在测试过程中,我也是这个实例的唯一用户。
由于我们没有差异输入,所以每周重新创建数据库,并在加载器加载完所有内容后切换到生产。这样,我们的数据库就有了很短的生存期。
该数据库包含略高于1.000.000.000个节点和更多边缘的节点。(可能约为10.000.000.000)这些边缘被分割成10种类型的标签,其中大多数不在当前查询中使用。
查询:
// recordIds is a table of 50 ids.
g.V(recordIds).HasLabel("record")
// Convert local id to neptune id.
.out('local_id')
// Go to tree parent link. (either myself if edge come back, or real parent)
.bothE('tree_top_parent').inV()
// Clean duplicates.
.dedup()
// Follow the tree parent link backward to get all children, this step load a big amount of nodes members of the same tree.
.in('tree_top_parent')
.not(values('some flag').Is('Q'))
// Limitation not reached, result is between 80k and 100K nodes.
.limit(200000)
// Convert back to local id for the 80k to 100k selected nodes.
.in('local_id')
.id()发布于 2022-06-07 13:21:55
海王星的体系结构由一个共享集群“卷”(所有数据被持久化,该数据在3个可用性区域中被复制6次)和一系列解耦的计算实例(一个写入器和单个集群中最多15个读取副本)组成。但是,实例上没有数据持久化,实例上大约65%的内存容量保留给缓冲池缓存。当数据从基础群集卷中读取时,数据将存储在缓冲池缓存中,直到缓存填充为止。一旦缓存被填充,最近使用最少的(LRU)驱逐策略将为任何更新的读取清除缓冲池缓存空间。
由于需要从底层存储中获取对象,通常会看到第一次读取速度较慢。我们可以通过编写和发出“预取”查询来改进这一点,这些查询可以将他们认为在不久的将来可能需要的对象拉进来。
如果您有一个填充缓冲池缓存并不断查看缓冲池缓存错误的用例(可以在海王星的CloudWatch度量中看到一个度量),那么您可能还需要考虑使用"d“实例类型之一(例如: r5d.8xlarge),并启用查找缓存功能1。该功能特别关注于通过将属性值/文本保留在实例上的直接连接的NVMe存储中,在查询时改进对属性值/文本的访问。
https://stackoverflow.com/questions/72530603
复制相似问题