在 Cassandra 中增加 row_cache_size_in_mb 有什么副作用吗?

Is there any side effect of increasing row_cache_size_in_mb in Cassandra?

在此配置中: 64 Gb,16 核,Linux 美分OS,Cassandra 3.1

row_cache_size_in_mb 现在设置为零 (cassandra.yaml) 它似乎运行良好,因为 OS 页面缓存用于缓存读取。

所以,有没有benefits/risks(JVM堆)来增加这个数字 与使用 Linux 页面缓存相比?

行缓存仅用于显式启用行数据缓存的表,默认情况下不使用。行缓存通常仅用于大多数不经常更改的读取数据,否则,数据更改将导致缓存数据无效和磁盘缓存条目 re-populating 导致额外的性能开销。您可以在 DataStax 发布的“最佳实践”系列 following document 中阅读更多内容。

关于行缓存和 Linux 的缓冲区缓存之间的关系 - 主要区别在于行缓存保留可能从多个 SSTables 组装的完整行,而缓冲区缓存保留 SSTables 的块,它们经常被压缩,而 Cassandra 将需要一次又一次地解压缩它们。此外,如果分区分散在多个 SSTables 上,那么 Cassandra 将需要在读取行时检查它们。

一切都与工作负载和应用程序查询模式有关。

如果您的应用程序经常读取行的一小部分(热)和每行的全部内容,启用此功能可以避免磁盘读取,从而带来显着的性能优势。有一些可用的行缓存命中率 JMX 指标可以告知应用程序负载的行和键缓存大小之间的任何性能变化。

如果您没有手动配置行缓存,table 描述应如下所示。

Default: { 'keys': 'ALL', 'rows_per_partition': 'NONE' }.

如果启用,该大小应与热子集上行数据及其列值的内存大小成正比。对于粗略估计,请使用 nodetool cfstats,将行缓存大小(缓存中的行数)乘以压缩行平均大小并将它们相加。

与任何内存分配一样,它对垃圾收集有影响,尽管有一些部分或完整的堆外实现 类 可用。来自 Datastax 文档:

row_cache_class_name
Default: disabled. note The classname of the row cache provider to use. Valid values: OHCProvider (fully off-heap) or SerializingCacheProvider (partially off-heap).

由于整行都被缓存,因此成本可能很高。需要注意的一件事是,如果行经常从行缓存中逐出(大小设置太低或行数据频繁更改),垃圾收集器肯定会有更多工作要做。

底线:对于理想的行缓存使用,一小组行必须是热行。当一次访问整行时,行缓存提供了好处。如果使用 off-heap 实现,它对堆的风险很小。最后进行一些负载测试并捕获一些延迟指标,以确定最适合您的需要且足够的缓存大小。