为什么 Gremlin Server / JanusGraph 会忽略我的一些请求?
Why is Gremlin Server / JanusGraph ignoring some of my requests?
我正在使用 Gremlin Python 库对 Gremlin Server 的 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 个值按预期工作并且 returns 在几毫秒内。
虽然这无关紧要(因为我应该得到一个正确的错误而不是什么都没有),但我已经增加了服务器端 maxHeaderSize
、maxChunkSize
、maxContentLength
等等高得离谱。更改序列化格式(例如,从 GraphSONMessageSerializerV3d0
到 GraphBinaryMessageSerializerV1
)也无济于事。
注意:我知道很长的遍历是 an anti-pattern in Gremlin,但有时不可能或非常低效地构造遍历,以便它们可以使用注入值代替。
我已经在 gremlin-users 上回答了这个问题,但没有意识到 Whosebug 上也有人问过这个问题。为了完整起见,我将在此处复制我的回复。
这个问题与字节和字符串的长度关系不大,而与遍历链的长度(即遍历的步数)关系更大。您最终会达到服务器上堆栈大小的 JVM 限制。您可以通过更改 -Xss
值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置,例如 -Xmx
和垃圾收集选项。
我确实发现有趣的是您没有收到任何错误消息 - 您应该会在某处看到 Whosebug,除非服务器完全因您的请求而陷入困境。我会考虑向它投入更多 -Xmx
以查看您是否可以让它至少响应错误或密切关注服务器日志以至少看到它出现在那里。
我正在使用 Gremlin Python 库对 Gremlin Server 的 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 个值按预期工作并且 returns 在几毫秒内。
虽然这无关紧要(因为我应该得到一个正确的错误而不是什么都没有),但我已经增加了服务器端 maxHeaderSize
、maxChunkSize
、maxContentLength
等等高得离谱。更改序列化格式(例如,从 GraphSONMessageSerializerV3d0
到 GraphBinaryMessageSerializerV1
)也无济于事。
注意:我知道很长的遍历是 an anti-pattern in Gremlin,但有时不可能或非常低效地构造遍历,以便它们可以使用注入值代替。
我已经在 gremlin-users 上回答了这个问题,但没有意识到 Whosebug 上也有人问过这个问题。为了完整起见,我将在此处复制我的回复。
这个问题与字节和字符串的长度关系不大,而与遍历链的长度(即遍历的步数)关系更大。您最终会达到服务器上堆栈大小的 JVM 限制。您可以通过更改 -Xss
值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置,例如 -Xmx
和垃圾收集选项。
我确实发现有趣的是您没有收到任何错误消息 - 您应该会在某处看到 Whosebug,除非服务器完全因您的请求而陷入困境。我会考虑向它投入更多 -Xmx
以查看您是否可以让它至少响应错误或密切关注服务器日志以至少看到它出现在那里。