cassandra连接中的大量内存使用

时间:2017-01-23 23:36:06

标签: memory cassandra prepared-statement

我正在使用C# Datastax connector以及单个集群和会话对象对cassandra执行许多异步插入。我也在使用预准备语句并将其重用于所有操作。

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

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

943 MB Cassandra.Connection
890 MB in Cassandra.OperationState
RequestExecution中的802 MB RequestHandler中的738 MB

我还注意到ConcurrentQueue中有大约934 MB,它根植于Cassandra.Connection._writeQueue。

这是否意味着应用程序排队写入的速度比节点可以处理的速度快? 使用async await和预准备语句执行所有逻辑。

不确定我怎么能以不同的方式做事。这是相当基本的cassandra用法。

这张贴于official google group。然而,似乎SO可能是一个更好的位置。坦率地说,我不确定。

1 个答案:

答案 0 :(得分:3)

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

  1. 当您创建Session对象时,请查看自定义PoolingOptions(即在群集构建器上使用.WithPoolingOptions(yourCustomPoolingOptions)。可能会增加每个节点的连接数或最大飞行请求数可能会有所帮助。但请记住,您仍然会为异步请求所需的所有簿记(即任务等)使用更多内存。详细了解connection pooling in the driver
  2. 如果您控制了源,则会限制应用程序中的写入。例如,如果您正在从平面文件中读取然后向Cassandra写入行,请跟踪您在飞行中的写入次数,并且只有当您低于某个阈值时才会从文件中提取更多数据你在应用程序中处于稳定状态。这是我在批量加载数据或将大批量数据加载到Cassandra时看到的一种非常常见的模式。
  3. 检查Cassandra方面的情况。可能是你在那里发生了一些事情,这会减慢写入速度,从而备份你的客户端(停止世界垃圾收集,压缩等)。一个好的起点是日志中的警告/错误(例如system.log)。您还可以从nodetool获取大量指标(tablestatstablehistograms命令可能有用)。
  4. 希望有所帮助。