- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我以前问过这个问题。但是再问一个具体的例子。
因此,我在我的 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 次这样的遍历),随着线程数量的增加,整体响应时间变得次优。
请注意,上述响应时间也适用于简单的图形查询。因此,随着线程的增加,即使是简单的读取也会变慢。 (当然,当线程数量较少时非常好)。
最佳答案
不确定是否应该将其作为“答案”发布,但这样的格式比在评论中更容易。感谢提供完整的测试类,对调试和实验很有帮助。
一直在查看您的测试实现,实际上我注意到吞吐量随着并发级别的增加而下降。
我相信您所看到的是您的本地服务器节点最初未被使用以及服务器缓存很冷且不够活跃的副作用。您需要更大的预热阶段让您的本地节点能够足够快地开始响应,并了解在更高的并发性下单个请求时间如何不增加。
我运行了您的测试(只是单 session 测试),当我的系统使用率较低时,当我开始您的测试时,结果看起来与您的完全相似。
但是,如果在 执行具有 10 - 20 - 50 个请求的测试之前放置一些额外的测试,如下所示:
dseVertexQueryPerformance.testSingleSession(3000);
dseVertexQueryPerformance.testSingleSession(6000);
dseVertexQueryPerformance.testSingleSession(6000);
dseVertexQueryPerformance.testSingleSession(6000);
dseVertexQueryPerformance.testSingleSession(6000);
dseVertexQueryPerformance.testSingleSession(9000);
dseVertexQueryPerformance.testSingleSession(9000);
dseVertexQueryPerformance.testSingleSession(9000);
dseVertexQueryPerformance.testSingleSession(10);
dseVertexQueryPerformance.testSingleSession(20);
dseVertexQueryPerformance.testSingleSession(50);
dseVertexQueryPerformance.testSingleSession(100);
dseVertexQueryPerformance.testSingleSession(200);
我最终得到的结果如下:
End Test ::SingleSession, Average Time: 2.6, Total execution time: 5.891593 ms
For 10 threads, ::SingleSession took 2.6
End Test ::SingleSession, Average Time: 4.4, Total execution time: 7.830533 ms
For 20 threads, ::SingleSession took 4.4
End Test ::SingleSession, Average Time: 1.86, Total execution time: 20.378055 ms
For 50 threads, ::SingleSession took 1.86
End Test ::SingleSession, Average Time: 1.98, Total execution time: 47.487505 ms
For 100 threads, ::SingleSession took 1.98
End Test ::SingleSession, Average Time: 2.295, Total execution time: 92.793991 ms
For 200 threads, ::SingleSession took 2.295
我们可以有效地看出争用是由于 DSE Graph 或整个系统不够暖。
现在,回顾我上面提到的那些较长的运行,我观察到在使用连接的遍历源时发生了更多的争用或更多的工作。
我建议不要直接迭代遍历源,而是从遍历中创建一个 GraphStatement
,如下所述:https://docs.datastax.com/en/developer/java-driver-dse/1.5/manual/tinkerpop/#data-stax-drivers-execution-compatibility
因此在您的测试中,我已将 getAVertex(GraphTraversalSource g)
更改为:
public class DSEVertexQueryPerformance {
...
private GraphTraversalSource traversalSource = DseGraph.traversal();
....
public long getAVertex(DseSession dseSession) {
Instant begin = Instant.now();
dseSession.executeGraph(DseGraph.statementFromTraversal(
traversalSource.V(vertexId))
);
return Duration.between(begin, Instant.now()).toMillis();
}
通过更改此方法,我能够使用当前的 g.V( ).next()
版本,使用 statementFromTraversal()
方法总执行时间约为 1400 毫秒。
最后,我还建议使用异步查询执行方法 (DseSession.executeGraphAsync()
),因为它允许您并行处理所有请求,而无需在客户端使用线程池,最终减轻客户端应用程序的压力。
关于java - DSE 图更多线程导致响应时间变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49233229/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!