Cassandra文档中声明所需的说明

时间:2013-06-07 12:16:43

标签: cassandra datastax-enterprise

我正在阅读DataStax文档,并发现了一个有趣的声明。

它声称“在成为内存限制之前,插入繁重的工作负载在Cassandra中受CPU限制”。

有人可以解释这个说法是如何做出的吗?什么可能导致Cassandra的这种行为?

感谢。

1 个答案:

答案 0 :(得分:5)

对于不同的工作负载,Cassandra集群可以是CPU,内存,I / O或(偶尔)网络绑定。文档中的声明是,如果你启动一个新集群并进行大量插入,集群最初将受CPU限制,但过了一段时间它就会成为内存瓶颈。

要处理插入,Cassandra需要对来自客户端的消息进行反序列化,找到哪些节点应该存储数据并向这些节点发送消息。然后,这些节点将数据存储在称为Memtable的内存数据结构中。

这最初几乎总是受CPU限制。但是,随着插入的数据越来越多,memtables会变大并刷新到磁盘并创建新的(空)memtables。刷新的memtables存储在称为SSTables的文件中。有一个称为压缩的持续后台进程将SSTables合并为逐渐变大和变大的文件。

在这个阶段,为什么更多的记忆会有所帮助,有几个原因:

  • 如果Cassandra的堆空间很小,它会在较小的时候刷新memtables。这会创建更小的SSTable,因此需要更多的工作来压缩它们。
  • 如果工作负载涉及在不同时间覆盖或插入同一行,则如果行仍在当前memtable中,则执行此操作要便宜得多。如果不是,则覆盖和新列存储在新的memtable中,然后在压缩期间刷新并合并。因此,更少的内存意味着更多的压缩工作。
  • 您的操作系统在压缩过程中使用内存来缓冲读写操作。如果操作系统不能,则会有额外的I / O,从而减慢可记忆的刷新和压缩。
  • 插入Cassandra会占用大量Java对象,因此可以为垃圾收集器创建工作。如果堆太小,则在GC运行时可以暂停插入以产生一些空闲堆。 (另一方面,如果堆太大,在停止世界GC期间插入可能会暂停几秒钟。)

因此插入可能会成为内存绑定,但它们也可能成为I / O绑定。如果没有足够的I / O来刷新memtables,那么一旦memtable flush queue满了就会阻塞插入。所以我认为声明可能更准确一些:

在成为内存或I / O绑定之前,插入繁重的工作负载在Cassandra中受CPU限制。