我正在使用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可能是一个更好的位置。坦率地说,我不确定。
答案 0 :(得分:3)
简短的回答是,是的,听起来你在集群上的写入速度比它能够确认它们更快,因此写入队列正在备份。听起来你已经遵循了使用单个会话对象,准备好的语句等最佳实践,但有一些事情可以尝试,看看它是否有助于解决问题:
Session
对象时,请查看自定义PoolingOptions
(即在群集构建器上使用.WithPoolingOptions(yourCustomPoolingOptions)
。可能会增加每个节点的连接数或最大飞行请求数可能会有所帮助。但请记住,您仍然会为异步请求所需的所有簿记(即任务等)使用更多内存。详细了解connection pooling in the driver。system.log
)。您还可以从nodetool
获取大量指标(tablestats
和tablehistograms
命令可能有用)。希望有所帮助。