【问题标题】:Why is Gremlin Server / JanusGraph ignoring some of my requests?为什么 Gremlin Server / JanusGraph 会忽略我的一些请求?
【发布时间】:2021-04-07 14:01:19
【问题描述】:

我正在使用 Gremlin Python 库对 Gremlin 服务器的 JanusGraph 部署执行遍历(仅使用 Tinkergraph 也会发生同样的情况)。一些长遍历(包含数千条指令)在服务器或客户端上没有得到响应、没有错误、没有超时、没有日志条目或错误。什么都没有。

这种沉默处理的条件尚不清楚。所描述的行为并不线性依赖于字节或指令数。例如,这段代码对我来说将永远挂起:

g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin', 't'))
g = g.inject("")
for i in range(0, 8000):
    g = g.constant("test")
print(f"submitting traversal with length={len(g.bytecode.step_instructions)}")
result = g.next()
print(f"done, got: {result}") # this is never reached

它不仅仅取决于请求消息中的字节数,因为即使使用非常大的常量值代替“测试”,我没有得到响应的指令数也不会改变。例如,使用 Lorem Ipsum 的许多段落注入 7000 个值按预期工作,并在几毫秒内返回。

虽然这无关紧要(因为我应该得到一个适当的错误而不是什么都没有),但我已经将服务器端的 maxHeaderSizemaxChunkSizemaxContentLength 等增加到了可笑的高数字。更改序列化格式(例如,从 GraphSONMessageSerializerV3d0GraphBinaryMessageSerializerV1)也无济于事。

注意:我知道很长的遍历是 an anti-pattern in Gremlin,但有时不可能或非常低效地构造遍历以便它们可以使用注入的值。

【问题讨论】:

    标签: gremlin janusgraph tinkerpop3 gremlin-server gremlinpython


    【解决方案1】:

    我已经在gremlin-users 上回答了这个问题,但没有意识到 StackOverflow 上也有人问过这个问题。为了完整起见,我将在此处复制我的回复。

    这个问题与字节和字符串长度的关系不大,而与遍历链的长度(即遍历中的步数)有关。您最终会达到服务器上堆栈大小的 JVM 限制。您可以通过更改 -Xss 值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置,例如 -Xmx 以及可能的垃圾收集选项。

    我确实觉得有趣的是,您没有收到任何错误消息 - 您应该在某处看到 stackoverflow,除非服务器完全被您的请求所困。我会考虑向它扔更多-Xmx,看看你是否能让它至少响应错误,或者密切关注服务器日志以至少看到它在那里出现。

    【讨论】:

    • 感谢您的建议!我已经检查了堆大小和使用情况,但忘记在我的帖子中提及它。我在 32GB 的 Kubernetes 节点上以 16GB 的堆运行它,并具有足够的处理能力。我根本没有看到任何使用高峰,有很多备用的东西。我会尝试增加堆栈大小。
    • 增加堆栈大小有帮助 - 很棒。我暂时将其标记为答案,因为虽然它解决了问题(谢谢!)我们还没有弄清楚如何在生产中检测到这个问题。如果服务器没有响应,我怎么知道这是一个堆栈问题,而不仅仅是超时?如何通过长遍历保持较低的堆栈压力?查看源代码,似乎在 sideEffect 中批处理部分遍历可能会有所帮助,但我对 Janus/Gremlin 服务器的内部工作原理知之甚少。或者也许是堆在堆栈上的请求解析..
    • 我还没有尝试过 sideEffect() 步骤以了解这是否有帮助,但实际上听起来可能。如果您的用例允许这样做,那么也许这是一条可以遵循的道路。就个人而言,我更愿意进行重组以避免长时间遍历,甚至可能会降低一些性能以避免过于接近堆栈限制。
    • 如果你必须有一个长期运行的单一事务,它涉及很多事情,那么我想我会考虑使用一个会话并在其上提交多个请求。 session+transactions 在 3.5.0 中得到更好的支持,所以我想我会在 3.4.x 中为这个特定用例使用脚本,直到 3.5.x 行得到广泛支持 - issues.apache.org/jira/browse/TINKERPOP-2537
    • 如果一切按计划进行,大约需要 2 周。如果你想跟上发布讨论,你需要关注开发邮件列表:lists.apache.org/list.html?dev@tinkerpop.apache.org
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 2017-06-25
    • 2015-06-29
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多