janusgraph - 通过 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 调用时,看起来一切都运行得更慢,这对我来说毫无意义......
解决方案
在@stephen mallette 的帮助下,我设法找到了这个问题的答案。事实证明,在会话中运行的控制台会缓存查询的答案,因此当我多次查询相同的 id 时,控制台只是从缓存中检索答案,实际上根本没有查询 Dynamo。另一方面,HTTP 运行无会话,因此通过 HTTP 的每个查询都命中 Dynamo。不用说 - 从缓存中检索结果比查询 Dynamo 快得多。
为了强制查询在控制台中命中 Dynamo,我g.tx().rollback()
在每次查询执行后添加了一个,无论我使用控制台还是通过 HTTP 查询,查询现在都在相当的时间内运行。不幸的是,在我看来它相当慢,但这可能是另一个问题的主题:)
更新:Dynamo 响应时间慢的原因是为了降低 Dynamo 的成本而添加了读/写速率限制。当显着增加速率限制时,查询运行得更快。不幸的是,这对我来说太贵了,所以我现在改用 Cassandra 作为后端运行,这也让我得到了很好的响应时间:)
推荐阅读
- java - java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
- powershell - 将脚本结果导出为 CSV
- jquery - 如何检测触摸或点击?
- vba - 使用 VBA 在 Powerpoint 数组中加载数据
- sql - 使用登录添加复制日志读取器代理时出错
- model - 从 RethinkDB 获取数据
- python - pyodbc executemany 没有批量插入 - SQL 服务器插入非常慢
- python - 如何使用循环创建多个 DataFrame 子集
- r - 在闪亮的应用程序中设置持久数据存储时出错 - R
- python - 空白黑屏视觉工作室