通过 HTTP 的 Gremlin 查询非常慢
Gremlin query via HTTP is extremely slow
因此,我 运行 通过 Gremlin 控制台和 HTTP 请求(从与 Gremlin 服务器所在的同一台机器发出)进行两个非常简单的 gremlin 查询。查询如下所示:
第一次查询:
console: g.V(127104, 1069144, 590016, 200864).out().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().count()}' http://localhost:8182
第二次查询:
console: g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()}' http://localhost:8182
这绝不是一个巨大的图 - 第一个查询 returns 750,第二个查询 returns 9154。我的问题是我发现查询之间存在巨大的性能差异 运行 通过 HTTP 与控制台相比。对于控制台和 HTTP 请求 returns 的第一个查询,并查看 gremlin 服务器日志,我很高兴地看到在这两种情况下查询只需要 1-2 毫秒。一切都很好。
现在进行第二个查询,情况发生了变化。虽然控制台继续立即提供答案,但现在 HTTP 请求 return 需要 4 到 5 秒 (!!) 的答案!服务器日志报告第二次查询的两次执行时间大致相同(大约 50-60 毫秒),那么这是怎么回事呢?我只是在做一个计数(),所以缓慢的 HTTP 响应不可能是序列化问题 - 它只需要 return 一个数字,就像在第一个查询中一样。
大家有什么好的想法吗?
更新:
运行 profile()
给出了一些有趣的结果(下面附有屏幕截图)。当通过 HTTP 调用时,看起来一切 运行 都变慢了,这对我来说毫无意义......
来自控制台:
通过 HTTP 请求:
在@stephen mallette 的帮助下,我设法找到了这个问题的答案。事实证明,在会话中运行的控制台缓存了查询的答案,因此当我多次查询相同的 ID 时,控制台只是从缓存中检索答案,实际上根本没有查询 Dynamo。另一方面,HTTP 运行无会话,因此每个通过 HTTP 的查询都会触发 Dynamo。不用说 - 从缓存中检索结果比查询 Dynamo 快得多。
为了强制查询在控制台中命中 Dynamo,我在每次查询执行后添加了一个 g.tx().rollback()
,现在无论我使用控制台还是通过 HTTP 查询,查询都在可比较的时间内运行。不幸的是,我认为它相当慢,但这可能是另一个问题的主题:)
更新:Dynamo 响应时间慢的原因是 read/write 速率限制已被添加以降低 Dynamo 的成本。当显着增加速率限制时,查询 运行 会快得多。不幸的是,这对我来说太昂贵了,所以我现在改用 运行 Cassandra 作为后端,这也让我获得了出色的响应时间:)
因此,我 运行 通过 Gremlin 控制台和 HTTP 请求(从与 Gremlin 服务器所在的同一台机器发出)进行两个非常简单的 gremlin 查询。查询如下所示:
第一次查询:
console: g.V(127104, 1069144, 590016, 200864).out().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().count()}' http://localhost:8182
第二次查询:
console: g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()}' http://localhost:8182
这绝不是一个巨大的图 - 第一个查询 returns 750,第二个查询 returns 9154。我的问题是我发现查询之间存在巨大的性能差异 运行 通过 HTTP 与控制台相比。对于控制台和 HTTP 请求 returns 的第一个查询,并查看 gremlin 服务器日志,我很高兴地看到在这两种情况下查询只需要 1-2 毫秒。一切都很好。
现在进行第二个查询,情况发生了变化。虽然控制台继续立即提供答案,但现在 HTTP 请求 return 需要 4 到 5 秒 (!!) 的答案!服务器日志报告第二次查询的两次执行时间大致相同(大约 50-60 毫秒),那么这是怎么回事呢?我只是在做一个计数(),所以缓慢的 HTTP 响应不可能是序列化问题 - 它只需要 return 一个数字,就像在第一个查询中一样。
大家有什么好的想法吗?
更新:
运行 profile()
给出了一些有趣的结果(下面附有屏幕截图)。当通过 HTTP 调用时,看起来一切 运行 都变慢了,这对我来说毫无意义......
来自控制台:
通过 HTTP 请求:
在@stephen mallette 的帮助下,我设法找到了这个问题的答案。事实证明,在会话中运行的控制台缓存了查询的答案,因此当我多次查询相同的 ID 时,控制台只是从缓存中检索答案,实际上根本没有查询 Dynamo。另一方面,HTTP 运行无会话,因此每个通过 HTTP 的查询都会触发 Dynamo。不用说 - 从缓存中检索结果比查询 Dynamo 快得多。
为了强制查询在控制台中命中 Dynamo,我在每次查询执行后添加了一个 g.tx().rollback()
,现在无论我使用控制台还是通过 HTTP 查询,查询都在可比较的时间内运行。不幸的是,我认为它相当慢,但这可能是另一个问题的主题:)
更新:Dynamo 响应时间慢的原因是 read/write 速率限制已被添加以降低 Dynamo 的成本。当显着增加速率限制时,查询 运行 会快得多。不幸的是,这对我来说太昂贵了,所以我现在改用 运行 Cassandra 作为后端,这也让我获得了出色的响应时间:)