LeveledCompactionStrategy :调整 sstable_size_in_mb 的影响是什么?

LeveledCompactionStrategy : what is the impact of tuning the sstable_size_in_mb?

为了提高读取性能,我尝试使用 LCS 减少底层 SSTable,所以我设置 sstable_size_in_mb1280MB 正如一些文章所建议的那样,指出 160MB 默认值是 Cassandra 核心团队很长时间以来挑选出来的以前,在一台只有 2GB RAM 的相当旧的服务器上。但是,我担心的是sstable_size_in_mb.

的更高值的含义

我的理解是LCS定期将L0中的所有SSTable和L1中的所有SSTable压缩在一起,然后替换L1的全部内容。所以每次更换L1,硬件要求CPU/RAM和写入放大可能会更高sstable_size_in_mb。的确,如果sstable_size_in_mb = 1280MB,那么L1中的10个1280MB的表每次都要和L0的所有表合并。也许还有更高层次的影响,即使要替换的 SSTables 看起来更低(一个 L1 SSTables 与 10 个 L2 SSTables 合并,然后那些10 L2 SSTable 被替换)。

问题:

  1. 具有较高的 sstable_size_in_mb 值可以通过减少 CQL 中涉及的 SSTable 的数量来提高读取性能Table。但是,sstable_size_in_mb 具有如此高的值(如 1280MB)还有哪些其他含义?

  2. 如果值更高,是否有任何相应的配置可以调整(垃圾收集器、块缓存、...)以允许更好的压缩那些较​​大的 SSTables 的性能,以及GC 更少 activity?

  3. 比较主观的问题,你在部署中使用的sstable_size_in_mb的典型值是多少?

为了回答您的第一个问题,我想引用 Jonathan Ellis 在 CASSANDRA-5727 中的一些原文,当时社区最初调查 sstable_size_in_mb(并随后决定使用 160 号码)。

"更大的文件意味着每个级别包含更多数据,因此读取会 必须接触 less sstables,但我们也在压缩 less 不变 当我们向前合并时的数据。”(注意:我怀疑有一个错字,他的意思是“当我们向前合并时,我们也在压缩更多不变的数据”,这与你所说的一致在你的第二段中,他所说的较大文件影响“压缩效率”是什么意思。)

至于任何其他含义:它可能会突破 LCS 节点密度上限,因为对于每个节点相同数量的 SSTable,它会允许更高的密度。

要回答您的第二个问题,压缩确实会在堆中产生大量搅动,因为它会从 SSTables 中创建许多短暂的对象。当您使用 1280MB 大小时,考虑到更大的 SSTables 参与压缩,您应该注意您的 gc.log 并注意“Humongous Allocation”消息(如果您使用 G1GC)。如果它们经常发生,您可以使用 -XX:G1HeapRegionSize 选项增加区域大小以避免昂贵的庞大对象集合。

关于您的第三个问题,据我所知,许多人已经使用 160MB 默认值很长时间了,因为我们没有对更大的 SSTable 大小进行基准测试对 impact/benefit 发表全面的分析还没有使用现代硬件(我尝试 运行 一些快速测试,但忙于其他事情而没有完成这项工作,抱歉)。但是,我确实认为,如果人们有兴趣通过 LCS 实现更高的节点密度,这个 SSTable 大小是一个值得探索的参数。