为每个表或列系列创建一个内存表。一个表可以有多个模因表,但只有一个模因表处于活动状态。其余的将等待冲洗。有一些属性会影响内存表大小和刷新频率。其中包括:
memtable _ flush _ writers–这是分配用于将mem table刷新到磁盘的线程数。这默认为两个。
memtable_heap_space_in_mb–这是Apache Cassandra节点上所有memtable的总分配空间。默认情况下,这是堆大小的四分之一。指定此属性会导致以MB为单位的绝对堆大小,而不是JVM堆总数的百分比。
memtable_cleanup_threshold-将触发memtable清理的可用memtable空间总数的百分比。memtable_cleanup_threshold默认为1/(memtable_flush_writers1)。默认情况下,这基本上是memtable_heap_space_in_mb的33%。
计划的清理会导致刷新占用最大部分内存空间的表/列系列。这种情况会一直发生,直到可用的内存降至清理阈值以下。
假设我们有一个分配了4G空间的Apache Cassandra实例。其中只有3,925.5MB可供Java运行时使用。这背后的原因请看下面的StackOverflow问题(为什么-Xmx和Runtime.maxMemory不一致)。默认情况下,其中有981 MB分配给memtable,即3,925.5的1/4。我们的memtable_cleanup_threshold是默认值,即总memtable堆和堆外内存的33%。在我们的示例中,这相当于327 MB。因此,当分配给所有memtable的总空间大于327 MB时,就会触发mem table清除。清理过程会查找最大的memtable,并将其刷新到磁盘。
如果我为 mem 表分配 981MB 并且 cassandra 在 327 MB 之后启动刷新,这意味着在任何时间点 cassandra 最多将有 327 MB 的活动内存表......那么(981-327)MB = 654MB 内存空间呢?它的用途是什么。我可以感觉到排队等待刷新的内存表占据了这 654mb 的一部分,但是其余的空间呢,它不是被浪费了??
< code > memtable _ heap _ space _ in _ MB 决定有多少堆可用于mem table。不一定要把它们都分配给memtable。如果有327 mb用于memtable,其他内存(总堆)可以用于查询或修复操作。