janusgraph - Gremlin 通过 HTTP 查询非常慢

标签 janusgraph gremlin-server

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

最佳答案

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

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

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

关于janusgraph - Gremlin 通过 HTTP 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184195/

相关文章:

elasticsearch - 如何使用Docker为Cassandra和Elasticsearch设置JanusGraph?

amazon-dynamodb - Gremlin-Server 添加具有多个属性的顶点 (Titan 1.0.0)

apache-spark - 无法在远程模式下将 SparkGraphComputer 与 Tinkerpop 3.2.3 和 Janusgraph 0.1.1 一起使用

cassandra - 将 janusgraph 从 0.2.2 升级到 0.5.2

Gremlin 将属性转换为日期并计算天数差异

docker - 尝试在JanusGraph-Docker中创建图形时连接被拒绝

java - JanusGraph 中的遍历序列化错误

java - 如何在java中编写gremlin jannusgraph谓词lt、lte、gte等?

java - 使用 TITAN DB 手动安装 gremlin 服务器

java - 如何在单次遍历中从一个顶点创建多条边