cassandra会话如何分配

时间:2019-02-08 11:03:39

标签: cassandra jvm

我在我的linux实例上看到cassandra java进程,它使用约38gb的内存并在其下显示约700个线程。

  1. 何时通过python或java与数据库建立任何连接?它们是在主Java进程还是在单独的OS进程下成为线程?
  2. 当集群连接产生多个线程时,会发生什么情况,在主进程下它们也会成为线程吗?如果是这样,如何区分连接线程和连接产生线程?
  3. 为会话线程分配的内存,是否在非堆内存下分配了内存?

更新- @chris-这是tpstats的输出

Tax

1 个答案:

答案 0 :(得分:1)

即使您有10000个已连接的客户端,连接也会转到Netty服务,该服务的线程数应等于内核数。但是,Cassandra最初是采用阶段事件驱动的体系结构(SEDA)设计的,该体系结构介于异步模型和全线程模型之间。它创建线程池以处理不同类型的任务。这确实意味着,但是根据您Yaml中的配置,可能会有很多线程。例如,默认情况下,本机传输池最多有128个线程,32个并发读取器,32个并发写入器,32个计数器突变等,但是如果您的集群针对ssds进行了调整,则这些线程可能会更高。请记住,这些池中有许多使用与SEPExecutor(单个执行程序池)共享的池(显示为SharedWorkers)。因此,随着尖峰的产生,可能会创建许多线程,但是可能不会经常使用线程。

nodetool tpstats将为您提供有关不同池的详细信息以及有多少活动池可以帮助识别哪些线程以及是否正在使用线程。如果不存在,则还可以使用jstack(与cassandra进程使用相同的用户)来转储跟踪。如果无法浏览https://fastthread.io/之类的工具,可以使查看变得更加容易。

对于值得32GB的内存和700个线程的内存来说,这听起来并不是一个问题。