Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带DataStax Java驱动程序的单多线程Java客户端,用于Apache Cassandra,不使用系统资源_Cassandra_Cassandra 2.0_Datastax_Datastax Enterprise_Datastax Java Driver - Fatal编程技术网

带DataStax Java驱动程序的单多线程Java客户端,用于Apache Cassandra,不使用系统资源

带DataStax Java驱动程序的单多线程Java客户端,用于Apache Cassandra,不使用系统资源,cassandra,cassandra-2.0,datastax,datastax-enterprise,datastax-java-driver,Cassandra,Cassandra 2.0,Datastax,Datastax Enterprise,Datastax Java Driver,如果您能为使用DataStax Java Driver for Apache Cassandra的多线程、高吞吐量、低延迟Java客户端的优化设置提供指导,我将不胜感激。我很感激不建议使用“自己滚动”基准点,但此任务还旨在为实现高TPS的实际应用程序提供概念验证 设置: 客户端:Java 8客户端,可配置的多线程执行器线程数(由lmax disruptor提供),cassandra-driver-core-3.0.0.jar,运行在Redhat 6.3、24核机器、dl360s上 服务器端:3节

如果您能为使用DataStax Java Driver for Apache Cassandra的多线程、高吞吐量、低延迟Java客户端的优化设置提供指导,我将不胜感激。我很感激不建议使用“自己滚动”基准点,但此任务还旨在为实现高TPS的实际应用程序提供概念验证

设置: 客户端:Java 8客户端,可配置的多线程执行器线程数(由lmax disruptor提供),cassandra-driver-core-3.0.0.jar,运行在Redhat 6.3、24核机器、dl360s上 服务器端:3节点Cassandra群集(apache-Cassandra-2.2.4,在使用Java 8的Redhat 6上),复制因子=3,运行在Redhat 6.3、24核机器dl360s上

测试 在cl=LOCAL_的情况下,仲裁测试从一个相对简单的模式中每秒插入3.5K次,读取6.5K次,延迟分别约为6毫秒和2毫秒,整个机箱的CPU使用率约为20%

问题 然而,我无法解决的问题是-当我为我的负载客户机应用程序创建多个单独的实例时,我可以在多个实例中实现显著更高的TPS和CPU使用率,这是我在单个JVM中无法实现的。这表明我的Java客户机应用程序既不受IO或CPU的限制,服务器端Cassandra集群也不是瓶颈。同样,当我去掉Cassandra调用时,我获得了更高的TPS,从而使我相信应用程序不会受到任何争用

所以我的问题是:这是一个常见的问题吗?一个使用DataStax Java驱动程序的Apache Cassandra的Java客户端在吞吐量上受到了限制?假设没有人能给我指出正确的调查方向

我测试了多个序列(读和写),也测试了execute和executeAsync,并发线程的数量可变。正如你所料,我在executeAsync中看到了更多的数字,但在我的应用程序中仍然存在相同的限制

我已经使用多个连接池设置进行了测试,并尝试为每个客户端应用程序创建/构建1个群集实例,为每个应用程序创建多个群集实例,并更改了CoreConnections、maxRequestsPerConnection和newConnectionThreshold值,但迄今为止没有成功

我目前最好的结果是50个执行线程,5个实例;MaxRequestsPerConnection(L)=1024;新连接保留(L)=800;CoreConnectionsPerHost(L)=20

这产生了约4K TPS,但只使用了18%的CPU,当我启动一个单独的应用程序实例时,我使用30%的CPU在两个应用程序实例中都实现了7.5K TPS,但我无法在save JVM中实现这7.5K

代码:创建集群

代码:编制报表(一次)

代码:执行


你能分享你的代码或提供一个例子吗?例如,使用java驱动程序的C*Pressure可以实现超过20万个请求/secThanks@Andy-I will addHi,@Aidan,您对这种行为有何解释,或者有何改进?谢谢你的提问!你能分享你的代码或提供一个例子吗?例如,使用java驱动程序的C*Pressure可以实现超过20万个请求/secThanks@Andy-I will addHi,@Aidan,您对这种行为有何解释,或者有何改进?谢谢你的提问!
    LoadBalancingPolicy tokenAwarePolicy =
            new TokenAwarePolicy(new RoundRobinPolicy());
    Cluster cluster = Cluster.builder()
            .addContactPoints(node)
            .withLoadBalancingPolicy(tokenAwarePolicy)
            .withPoolingOptions(new PoolingOptions()) // Have tried various options here
            .build();
        String insertSqlString =  "INSERT INTO " + keySpaceName + ".test_three ("
                + "user_id, field_a, field_b, field_c, field_d) values "
                + "( ?, ?, ?, ?);";
        statementInsertDataTablePS = session.prepare(insertSqlString);
        statementInsertDataTablePS.setConsistencyLevel(configuredConsistencyLevel); //2
    BoundStatement boundStatement = new BoundStatement(statementInsertDataTablePS);

  session.executeAsync(boundStatement.bind(
            sequence,  // userID
            sequence + "value_for_field_a", 
            sequence + "value_for_field_b", 
            sequence + "value_for_field_c", 
            sequence + "value_for_field_d") );