在这个配置中: 64 Gb,16核,Linux CentOS与Cassandra3.1
row_cache_size_in_mb现在设置为零(cassandra.yaml),因为OS缓存用于缓存读取,因此工作正常。
那么,与使用Linux页面缓存相比,增加这个数量是否有任何好处/风险(JVM堆)?
发布于 2020-09-27 17:09:01
行缓存仅用于显式启用行数据缓存的表,默认情况下不使用。行缓存通常只用于大多数不经常更改的读取数据,否则,数据的更改将导致由于使缓存数据无效而导致额外的性能开销&从磁盘重新填充缓存条目。您可以从下列文件发布的“最佳实践”系列中更多地阅读DataStax。
关于行缓存和Linux缓冲区缓存之间的关系--主要区别是行缓存保留了可能从多个SSTables组装的完整行,而缓冲区缓存保存了经常被压缩的SSTables块,而Cassandra将需要一次又一次地解压它们。另外,如果分区分散在多个SSTables上,那么Cassandra在读取行时需要检查它们。
发布于 2020-09-27 18:29:14
这一切都与工作负载和应用程序查询模式有关。
如果应用程序经常读取一小部分行(hot)和整行,启用该功能可以避免磁盘读取,从而带来显著的性能好处。有一些行缓存命中率JMX指标可用于通知应用程序加载时行和键缓存大小之间的任何性能变化。
如果没有手动配置行缓存,表说明应该如下所示。
Default: { 'keys': 'ALL', 'rows_per_partition': 'NONE' }.如果启用,则该大小应与行数据及其列值在热子集上的内存大小成正比。对于粗略的估计,使用nodetool,将行缓存大小乘以行缓存中的行数,乘以压缩行的平均大小并与它们相加。
与任何内存分配一样,它对垃圾收集也有影响,不过也有一些部分或完整的堆外实现类可用。来自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).由于整个行都是缓存的,所以代价可能很高。需要注意的一点是,如果行经常从行缓存中被逐出(大小设置过低或行数据经常更改),垃圾收集器肯定会有更多工作要做。
Bottomline:为了使用理想的行缓存,一小部分行必须是热的。当同时访问整个行时,行缓存提供了好处。如果使用离堆实现,则对堆的风险很小。最后,进行一些负载测试,并捕获一些延迟度量,以确定缓存的大小,这些大小最适合您的需要,并且是足够的。
https://stackoverflow.com/questions/64089098
复制相似问题