为什么Gremlin Server/JanusGraph会忽略我的一些请求?

为什么Gremlin Server/JanusGraph会忽略我的一些请求?,gremlin,janusgraph,tinkerpop3,gremlin-server,gremlinpython,Gremlin,Janusgraph,Tinkerpop3,Gremlin Server,Gremlinpython,我正在使用Gremlin Python库在Gremlin服务器的JanusGraph部署上执行遍历(使用Tinkergraph也会发生同样的情况)。有些长遍历(包含数千条指令)在服务器或客户端上没有响应、没有错误、没有超时、没有日志条目或错误。没什么 这种沉默治疗的条件尚不清楚。所描述的行为并不线性地依赖于字节或指令数。例如,此代码将永久挂起: g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/greml

我正在使用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
它不仅仅取决于请求消息中的字节数,因为即使使用非常大的常量值代替“test”,超出的指令数(我得不到响应)也不会改变。例如,在Lorem Ipsum的许多段落中注入7000个值,效果与预期一样,并在几毫秒内返回

虽然这不重要(因为我应该得到一个正确的错误,而不是什么都没有),但我已经将服务器端的
maxHeaderSize
maxChunkSize
maxContentLength
等增加到了荒谬的高数字。更改序列化格式(例如从
GraphSONMessageSerializerV3d0
更改为
GraphBinaryMessageSerializerV1
)也无济于事


注意:我知道很长的遍历是不可能的,但有时构造遍历以使它们可以使用注入值来代替是不可能的或效率很低的。

我回答了这个问题,没有意识到在StackOverflow上也有人问过这个问题。为了完整起见,我将在这里重复我的回答

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


我确实觉得有趣的是,您没有收到任何错误消息——您应该在某个地方看到stackoverflow,除非服务器完全被您的请求困住了。我会考虑在它上面扔更多的代码> Xmx < /Cord>,看看你是否能至少用一个错误来响应它,或者关注服务器日志至少看到它的表面。< / P>谢谢你的建议!我已经检查了堆的大小和使用情况,但忘了在我的帖子中提到它。我在32GB的Kubernetes节点上用16GB的堆运行这个程序,该节点具有足够的处理能力。我没有看到任何使用高峰,有很多备用的东西。我将尝试增加堆栈大小。增加堆栈大小有帮助-很好。我暂时将此标记为答案,因为虽然它解决了问题(谢谢!),但我们还没有找到在生产中如何检测此问题的方法。如果服务器没有响应,我如何知道这是堆栈问题,而不仅仅是超时?如何通过长时间的遍历保持堆栈压力低?从源代码来看,在sideEffect中批处理部分遍历可能会有所帮助,但我对Janus/Gremlin服务器的内部工作机制了解不够。或者可能是请求解析堆积在堆栈上..我没有尝试过
sideEffect()
步骤来知道这是否有帮助,但听起来确实有帮助。如果您的用例允许这样做,那么这可能是一条可以遵循的路径。就个人而言,我更喜欢进行重组以避免长时间遍历,甚至可能需要一些性能点击,以避免爬行太接近堆栈限制。如果您必须有一个长时间运行的单个事务来处理很多事情,那么我想我会考虑使用一个会话并提交多个请求。会话+事务在3.5.0中得到了更好的支持,所以我想我会使用3.4.x中的脚本来处理这个特定的用例,直到3.5.x行得到广泛的支持——如果一切顺利的话,大约两周后。如果您想跟上发布讨论的进度,需要遵循开发人员邮件列表: