首页 > 解决方案 > 通过 HTTP 进行 Gremlin 查询非常慢

问题描述

因此,我通过 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

这绝不是一个巨大的图表——第一个查询返回 750,第二个查询返回 9154。我的问题是,与控制台相比,通过 HTTP 运行的查询之间存在巨大的性能差异。对于第一个查询,控制台和 HTTP 请求都会立即返回并查看 gremlin 服务器日志,我很高兴看到在这两种情况下查询只需要 1-2 毫秒。一切都很好。

现在对于第二个查询,情况发生了变化。虽然控制台继续立即提供答案,但现在 HTTP 请求需要 4 到 5 秒 (!!) 才能返回答案!服务器日志报告的第二个查询的两次执行的执行时间大致相同(大约 50-60 毫秒),那么发生了什么?我只是在做一个 count(),所以缓慢的 HTTP 响应不可能是序列化问题——它只需要返回一个数字,就像在第一个查询中一样。

有没有人有什么好主意?

更新:

运行profile()给出了一些有趣的结果(下面附上屏幕截图)。当通过 HTTP 调用时,看起来一切都运行得更慢,这对我来说毫无意义......

从控制台:

通过 HTTP 请求:

标签: janusgraphgremlin-server

解决方案


在@stephen mallette 的帮助下,我设法找到了这个问题的答案。事实证明,在会话中运行的控制台会缓存查询的答案,因此当我多次查询相同的 id 时,控制台只是从缓存中检索答案,实际上根本没有查询 Dynamo。另一方面,HTTP 运行无会话,因此通过 HTTP 的每个查询都命中 Dynamo。不用说 - 从缓存中检索结果比查询 Dynamo 快得多。

为了强制查询在控制台中命中 Dynamo,我g.tx().rollback()在每次查询执行后添加了一个,无论我使用控制台还是通过 HTTP 查询,查询现在都在相当的时间内运行。不幸的是,在我看来它相当慢,但这可能是另一个问题的主题:)

更新:Dynamo 响应时间慢的原因是为了降低 Dynamo 的成本而添加了读/写速率限制。当显着增加速率限制时,查询运行得更快。不幸的是,这对我来说太贵了,所以我现在改用 Cassandra 作为后端运行,这也让我得到了很好的响应时间:)


推荐阅读