【发布时间】:2018-03-12 10:43:05
【问题描述】:
我以前问过这个问题。但是再用一个具体的例子来问。
所以我在我的 Mac 上本地运行了 DSE 图。我有一个最简单的顶点创建,下面是遍历。
g.addV("company").property("id", companyId)
.property("name", "company_" + companyId)
.property(VertexProperty.Cardinality.list, "domainurls", "test.com", "anothertest.com")
.next();
现在我正在使用 Java TinkerPop3 API 进行调用。而且我有一个 DseSession 得到了这种方式。
dseCluster = DseCluster.builder()
.addContactPoints(contactPoints)
.withGraphOptions(new GraphOptions().setGraphName("profilex_dev"))
.build();
dseSession = dseCluster.connect();
DseGraph.traversal(dseSession)
我在多线程应用程序中重复使用 GraphTraversalSource 的这一实例。我的观察,线程数越多,响应时间越慢。
我使用 Java Microbenchmarking Harness 进行了测量,以下大致是我发现的
- 10 线程 - 6 毫秒
- 50 线程 - 34 毫秒
- 200 个线程 - 146 毫秒。
所以我的问题是 - 有没有办法优化它以更快地运行 - 需要设置的任何池选项等。在我的例子中,不仅仅是一个公司的创建和更多的图形突变/查询(大约 10 次这样的遍历),随着线程数量的增加,整体响应时间变得次优。
请注意,上述响应时间也适用于简单的图形查询。因此,随着线程的增加,即使是简单的读取也会变慢。 (当然,当线程数较少时非常好)。
【问题讨论】:
-
可以添加突变/查询的代码吗?有时性能问题可以在那里解决......
-
另一个问题 - 你使用的是什么版本的驱动程序?
-
可能这种方式使用遍历源会让事情变慢,你可以尝试切换到GraphStatements并使用
DseGraph.statementFromTraversal()方法,而不是直接迭代遍历,并通过会话执行语句。 -
如果这没有改变,那么您需要检查来自驱动程序的 inFlight 请求 (docs.datastax.com/en/developer/java-driver-dse/1.5/manual/…)。如果在增加线程数时 inFlight 上升,这意味着最终它是驱动程序无法真正解决的 DseGraph 服务器端性能问题。一种解决方案是在同一遍历中批量插入,例如
g.addV().property().addV().property()..... -
@newkek :抱歉耽搁了,监控飞行中的请求没有帮助。飞行中的请求总是不超过 200 个线程(200 是我正在运行的)并且最大负载 = 1024。请注意,即使我只得到一个顶点
g.V(vertexId),情况也是如此。所以我猜这很可能是客户端配置问题
标签: java tinkerpop3 datastax-enterprise-graph