java - Cassandra 跟踪和客户端延迟之间的差异

标签 java cassandra driver cql cqlsh

我们在 Cassandra 2.0.15 上,看到所有应用程序主机定期(大约每 3 分钟)出现巨大的读取延迟(>60 秒)。我们测量调用 session.execute(stmt) 时的延迟。同时,Cassandra 跟踪报告持续时间 <1s。我们还在这些峰值延迟时间循环运行来自同一主机的 cqlsh 查询,并且 cqlsh 总是在 1 秒内返回。什么可以解释 Java 驱动程序级别的这种差异?

-- 编辑:回复评论--

Cassandra 服务器 JVM 设置:-XX:+CMSClassUnloadingEnabled -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -XX:+HeapDumpOnOutOfMemoryError -Xss256k -XX:StringTableSize=1000003 -Xms32G -Xmx32G -XX:+UseG1GC - Djava.net.preferIPv4Stack=true -Dcassandra.jmx.local.port=7199 -XX:+DisableExplicitGC

客户端 GC 可以忽略不计(如下)。客户端设置:-Xss256k -Xms4G -Xmx4G,Cassandra驱动版本为2.1.7.1

Client side GC is negligible

客户端测量代码:

val selectServiceNames = session.prepare(QueryBuilder.select("service_name").from("service_names"))

override def run(): Unit = {
  val start = System.currentTimeMillis()
  try {
    val resultSet = session.execute(selectServiceNames.bind())
    val serviceNames = resultSet.all()
    val elapsed = System.currentTimeMillis() - start
    latency.add(elapsed) // emits metric to statsd
    if (elapsed > 10000) {
      log.info("Canary2 sensed high Cassandra latency: " + elapsed + "ms")
    }
  } catch {
    case e: Throwable =>
      log.error(e, "Canary2 select failed")
  } finally {
    Thread.sleep(100)
    schedule()
  }
}

集群构建代码:

def createClusterBuilder(): Cluster.Builder = {
  val builder = Cluster.builder()
  val contactPoints = parseContactPoints()
  val defaultPort = findConnectPort(contactPoints)
  builder.addContactPointsWithPorts(contactPoints)
  builder.withPort(defaultPort) // This ends up config.protocolOptions.port
  if (cassandraUsername.isDefined && cassandraPassword.isDefined)
    builder.withCredentials(cassandraUsername(), cassandraPassword())
  builder.withRetryPolicy(ZipkinRetryPolicy.INSTANCE)
  builder.withLoadBalancingPolicy(new TokenAwarePolicy(new LatencyAwarePolicy.Builder(new RoundRobinPolicy()).build()))
}

还有一个我无法解释的观察结果。我在一个循环中运行了两个以相同方式(如上所述)执行相同查询的线程,唯一的区别是黄色线程在查询之间 hibernate 100 毫秒,而绿色线程在查询之间 hibernate 60 秒。绿色线程比黄色线程更频繁地达到低延迟(低于 1 秒)。

enter image description here

最佳答案

当您让组件进行 self 测试时,这是一个常见问题。

  • 您可能会遇到相关工具看不到的延迟。
  • 您的组件不知道请求应该何时开始。
  • 当 JVM 停止时,这可以防止您看到您尝试测量的延迟。

最有可能的解释是第二种。假设您有一个包含 100 个任务的队列,但由于系统运行缓慢,每个任务需要 1 秒。您在内部为每个任务计时,它看到它花了 1 秒,但是将 100 个任务添加到队列中,第一个任务在 0 秒后开始,但最后一个在 99 秒后开始,然后报告它花了 1 秒,但从您的角度来看完成需要 100 秒,其中 99 秒等待开始。

结果到达您时也可能会有延迟,但这种可能性较小,除非您在处理结果时执行的操作多于数据库所需的操作。也就是说,您可能会认为瓶颈在服务器上。

关于java - Cassandra 跟踪和客户端延迟之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656757/

相关文章:

java - 删除列表中的重复项

c# - Windows 后台打印驱动程序 - 状态请求发送不正确

java - 社交媒体应用程序的最佳架构

erlang - 是否有用于Erlang的稳定的Cassandra库?

php - 从 PHP 连接到 cassandra

c++ - 学习编写低级驱动程序 (Linux)。

windows - 以编程方式安装 NDIS 筛选器驱动程序

java - 如何查看网页是手机浏览器还是PC浏览器访问的?

java - Spring根应用上下文和servlet上下文混淆

java - POI 中的标题创建的 PowerPoint 幻灯片在复制时不保留格式