我有Cassandra集群,有3个节点,4个客户端向集群发送请求。请求以异步方式发送。这是负责发送请求的代码片段
import com.datastax.driver.core._
import com.datastax.driver.core.policies.{DCAwareRoundRobinPolicy, TokenAwarePolicy}
import com.datastax.driver.core.querybuilder.Select.Where
import com.datastax.driver.core.querybuilder.{Batch, QueryBuilder}
val query =
QueryBuilder.
insertInto(keyspace, tableName).
values(columnNames, columnValues)
session.executeAsync(query)
def setupSession(config: Config): Session = {
val port: Int = config.getInt(CassandraKeyValueStorage.PortKey)
val addresses: Array[String] = config.getString(CassandraKeyValueStorage.HostsKey).split(",")
addresses.
foldLeft(Cluster.builder)(_ addContactPoints _).
withPort(port).
withPoolingOptions(
new PoolingOptions().
setMaxConnectionsPerHost(HostDistance.REMOTE, 1280).
setMaxRequestsPerConnection(HostDistance.REMOTE, 32000).
setMaxConnectionsPerHost(HostDistance.LOCAL, 1280).
setMaxRequestsPerConnection(HostDistance.LOCAL, 32000)).
withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy())).
build.
connect
}
如上所示,我已将限制更改为更高的数字,所以我希望它们不会减慢客户的速度。
然而,我观察到奇怪的行为。以下是客户(time speed1 speed2 speed3 speed4 total_speed
)发送的请求的统计信息:
09:30 0.774 0.25 0.456 0.774 2.254
10:00 1.082 0.354 0.302 0.744 2.482
10:30 1.04 0.548 0.774 0.266 2.628
11:00 0.962 0.7 0.234 0.558 2.454
11:30 0.69 0.622 0.44 0.806 2.558
12:00 0.34 0.432 0.416 1.056 2.244
12:30 0.346 0.414 0.872 0.768 2.4
13:00 0.458 0.428 0.73 0.98 2.596
13:30 0.222 0.47 0.798 0.652 2.142
14:00 0.59 1.084 0.748 0.172 2.594
14:30 0.328 0.806 1.018 0.458 2.61
15:00 0.436 0.5 1.134 0.722 2.792
15:30 0.52 0.258 0.676 0.928 2.382
16:00 0.406 0.202 0.508 0.798 1.914
从中可以看出,总速度受限于一些价值,而客户端则能够发送更多数据。同时,cassandra盒子的CPU空闲率约为20%,所以它不是那么难加载。我无法理解阻止客户端发送更多数据的原因。我认为网络带宽不是因为一切都发生在谷歌云引擎的一个区域内,当前负载大约是30 Mb / s(界限为1 Gb / s)。
答案 0 :(得分:0)
我建议的最简单的方法是尝试在同一个盒子上运行2个客户端实例。如果它增加了来自该框的总流量大约两倍,那么尝试调整连接线程设置。我想它可能在Pooling选项中。 BTW有什么默认值?
它可能还取决于Cassandra方面的线程设置,但我不确定是你的情况。
此外,还需要检查从客户端到服务器的ping时间。
答案 1 :(得分:0)
对于给定的一组硬件,网络条件和使用的架构,任何群集都将具有最大吞吐量。
为了找到最大吞吐量,我通常使用将使用可配置大小的线程池发出命令的客户端。这允许您在任何给定时间控制飞行中的最大操作数,然后您可以调整线程池的大小,直到获得最大吞吐量。当您增加线程数导致吞吐量没有增加时,您就会知道您已达到它,但确实导致每个事务的延迟增加。
您不想使用只尝试发出尽可能多的请求的客户端,因为那时您可能会有各种队列填满或溢出,请求启动超时等等,这将是混乱你想要衡量的是什么。