Cassandra文档中声明所需的解释

Cassandra文档中声明所需的解释,cassandra,datastax-enterprise,Cassandra,Datastax Enterprise,我正在浏览DataStax文档,发现了一个有趣的声明 它声称,在内存受限之前,在Cassandra中,插入繁重的工作负载是CPU受限的 有人能解释一下这种说法是如何提出的吗?是什么导致了卡桑德拉的这种行为 谢谢。对于不同的工作负载,Cassandra集群可以是CPU、内存、I/O,偶尔也可以是网络绑定的。文档中的声明是,如果您启动了一个新集群并进行了大量插入,那么该集群最初会受到CPU的限制,但过了一段时间,它就会在内存上受到限制 为了处理插入,Cassandra需要对来自客户端的消息进行反序列

我正在浏览DataStax文档,发现了一个有趣的声明

它声称,在内存受限之前,在Cassandra中,插入繁重的工作负载是CPU受限的

有人能解释一下这种说法是如何提出的吗?是什么导致了卡桑德拉的这种行为


谢谢。

对于不同的工作负载,Cassandra集群可以是CPU、内存、I/O,偶尔也可以是网络绑定的。文档中的声明是,如果您启动了一个新集群并进行了大量插入,那么该集群最初会受到CPU的限制,但过了一段时间,它就会在内存上受到限制

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

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

在这个阶段,更多的内存会有所帮助,原因如下:

如果Cassandra堆空间不足,则当memtables较小时,它将刷新memtables。这会创建更小的SSTABLE,因此需要更多的工作来压缩它们。 如果工作负载涉及在不同时间覆盖或插入同一行,如果该行仍在当前memtable中,那么这样做的成本要低得多。否则,覆盖和新建列将存储在新的memtable中,然后在压缩过程中刷新和合并。同样,更少的内存意味着更多的压缩工作。 在压缩过程中,操作系统使用内存缓冲读写操作。如果操作系统做不到这一点,那么就会有额外的I/O,从而减缓内存表的刷新和压缩。 插入Cassandra会消耗大量Java对象,因此需要为垃圾收集器创建工作。如果堆太小,则在GC运行以生成一些空闲堆时,可能会暂停插入。另一方面,如果堆太大,则在停止world GC期间插入可能会暂停几秒钟。 因此,插入可能会受到内存限制,但也可能受到I/O限制。如果没有足够的I/O刷新memtables,那么一旦memtable刷新队列已满,插入将被阻止。所以我认为这个说法可能更准确一些:


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

对于不同的工作负载,Cassandra集群可以是CPU、内存、I/O或偶尔是网络绑定的。文档中的声明是,如果您启动了一个新集群并进行了大量插入,那么该集群最初会受到CPU的限制,但过了一段时间,它就会在内存上受到限制

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

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

在这个阶段,更多的内存会有所帮助,原因如下:

如果Cassandra堆空间不足,则当memtables较小时,它将刷新memtables。这会创建更小的SSTABLE,因此需要更多的工作来压缩它们。 如果工作负载涉及在不同时间覆盖或插入同一行,如果该行仍在当前memtable中,那么这样做的成本要低得多。否则,覆盖和新建列将存储在新的memtable中,然后在压缩过程中刷新和合并。同样,更少的内存意味着更多的压缩工作。 在压缩过程中,操作系统使用内存缓冲读写操作。如果操作系统做不到这一点,那么就会有额外的I/O,从而减缓内存表的刷新和压缩。 插入Cassandra会消耗大量Java对象,因此需要为垃圾收集器创建工作。如果堆太小,则在GC运行以生成一些空闲堆时,可能会暂停插入。另一方面,如果堆太大,则在停止world GC期间插入可能会暂停几秒钟。 因此,插入可能会受到内存限制,但也可能受到I/O限制。如果没有足够的I/O刷新memtables,那么一旦memtable刷新队列已满,插入将被阻止。所以我认为这个说法可能更准确一些:


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

感谢您的回复,但在我的场景中,我有一个6节点集群,每个集群都有一个四核3GHz处理器和8GB RAM。在插入繁重的工作负载期间,我看到一个CP
U利用率约为80%,其中约60%由卡桑德拉工艺连续使用。我无法完全理解为什么会有如此高的CPU利用率?列的反序列化、分区和排序是否会占用这么多CPU?对吞吐量有影响吗?如果对吞吐量有影响,您是否知道有任何优化技术可以改善这一点?每秒插入多少次?是的,这种CPU使用限制了您的吞吐量。如果你的工作量允许的话,你可以通过做更大的批次来改进它。谢谢,我会考虑批次突变选项,我能够达到大约50000个OPS/SEC,插入两个列的家庭,其中一个是宽表。总负载约为100字节。如果您当前一次插入一列,一个批次将产生显著的差异。特别是当你每行插入多个列时。目前,一行多个列可以进行批处理。这就是你的建议,还是我通过某种方式将多行和多列结合起来进行一次批量突变?谢谢你的回答,但在我的场景中,我有一个6节点集群,每个集群都有一个四核3GHz处理器和8GB RAM。在插入繁重的工作负载期间,我看到CPU利用率约为80%,而Cassandra进程持续使用约60%。我无法完全理解为什么会有如此高的CPU利用率?列的反序列化、分区和排序是否会占用这么多CPU?对吞吐量有影响吗?如果对吞吐量有影响,您是否知道有任何优化技术可以改善这一点?每秒插入多少次?是的,这种CPU使用限制了您的吞吐量。如果你的工作量允许的话,你可以通过做更大的批次来改进它。谢谢,我会考虑批次突变选项,我能够达到大约50000个OPS/SEC,插入两个列的家庭,其中一个是宽表。总负载约为100字节。如果您当前一次插入一列,一个批次将产生显著的差异。特别是当你每行插入多个列时。目前,一行多个列可以进行批处理。这就是你的建议,还是我通过某种方式将多行和多列组合在一起进行一次批量突变?