Memory cassandra连接中的大量内存使用

Memory cassandra连接中的大量内存使用,memory,cassandra,prepared-statement,Memory,Cassandra,Prepared Statement,我正在使用和单个集群和会话对象对cassandra进行许多异步插入。我还使用准备好的语句,并在所有操作中重用它们 最近我注意到,在运行几分钟后,应用程序变得非常慢,因为它开始在一台内存为32GB的机器上使用虚拟内存。 我跟踪了内存使用情况,发现cassandra连接正在使用这些内存 为了进行测试,我一直运行到内存为1GB,并注意到以下几点: 卡桑德拉943 MB。连接 卡桑德拉890 MB。操作状态 请求执行中802 MB RequestHandler中738 MB 我还注意到Concurren

我正在使用和单个集群和会话对象对cassandra进行许多异步插入。我还使用准备好的语句,并在所有操作中重用它们

最近我注意到,在运行几分钟后,应用程序变得非常慢,因为它开始在一台内存为32GB的机器上使用虚拟内存。 我跟踪了内存使用情况,发现cassandra连接正在使用这些内存

为了进行测试,我一直运行到内存为1GB,并注意到以下几点:

卡桑德拉943 MB。连接
卡桑德拉890 MB。操作状态
请求执行中802 MB
RequestHandler中738 MB

我还注意到ConcurrentQueue中有大约934MB的内存,它的根位于Cassandra.Connection.\u writeQueue

这是否意味着应用程序排队写入的速度快于节点可以处理的速度? 所有逻辑都是使用带有准备语句的异步等待执行的

我不知道我怎么能做不同的事情。这是卡桑德拉的基本用法


这是张贴在网站上的。然而,看来这可能是一个更好的位置。坦白地说,我不确定。

简短的回答是,是的,这听起来像是您在集群中抛出写操作的速度快于它能够确认它们,因此写队列正在备份。听起来您已经在遵循最佳实践,如使用单个会话对象、准备好的语句等。但是,您可以尝试一些事情,看看它是否有助于解决问题:

  • 创建
    会话
    对象时,请查看自定义
    池选项
    (即使用
    。WithPoolgOptions(您的自定义池选项)
    在群集生成器上。增加每个节点的连接数或最大正在进行的请求数可能会有所帮助。但请记住,对于异步请求必须进行的所有簿记(即任务等),您仍将使用更多内存。请阅读更多有关
  • 如果您可以控制源代码,请限制应用程序中的写入。例如,如果您正在从平面文件读取数据,然后将行写入Cassandra,请跟踪正在进行的写入数量,并且只有在低于某个阈值(该阈值使应用程序处于稳定状态)时才从文件中提取更多数据。这是一个真正的问题我看到的批量加载数据或将大批量数据加载到Cassandra中的常见模式
  • 也要检查Cassandra方面的情况。可能是因为那里发生了一些事情,减慢了写入速度,从而备份了您的客户端(停止世界垃圾收集、压缩等)。一个好的开始是日志中的警告/错误(例如
    system.log
    )。您还可以从(其中,
    tablestats
    tablehistograms
    命令可能有用)

  • 希望这能有所帮助。

    谢谢。如果一切都像你想象的那样神奇地工作,那当然很好,但这毕竟是真实的世界(