【问题标题】:Cassandra : setting row_cache_size_in_mb decrease performance by factor 4Cassandra:设置 row_cache_size_in_mb 将性能降低 4 倍
【发布时间】:2019-01-28 11:58:12
【问题描述】:

为了使用 Cassandra 获得更好的读取性能,我将行缓存设置从:

 row_cache_size_in_mb = 0

收件人:

 row_cache_size_in_mb = 2000

对于我的配置而言,行缓存的 2 GB 听起来很合理。于是,我重新启动了节点,我很惊讶这样的设置会降低我的整体性能 4 倍。例如,一个只需要 2 秒的查询,现在需要 8 多秒才能完成。

然后我启用了跟踪,我看到“行缓存命中”。我还看到行缓存命中率非常高。所以行缓存似乎可以与我的数据模型一起正常工作。但是,它显然会减慢我的查询速度...您知道为什么吗?

更新:

我做了一个新的测试。我保持行缓存:

 row_cache_size_in_mb = 2000 

我禁用了我拥有的最大列族(表)的行缓存:

 'rows_per_partition': 'NONE'

现在我的查询像以前一样工作了(大约需要 2 秒)。那么,行缓存是否只是为了加快小型列族的查询?

对于大型列族,是否可以将数据推送到缓存中?我对大型 CF 的期望是,如果用户执行查询,然后如果它立即再次执行相同的查询,那么非第一个查询可以立即返回,因为行已经在内存中。

【问题讨论】:

  • 你的堆有多大?你的 memtable 大小和 keycache 有多大?
  • 我的堆大约是 16GB。每个节点的总内存为 48GB。密钥缓存和内存表设置变为默认值。您能否解释一下堆和行缓存之间的关系,因为据我所知,行缓存默认是堆外的?谢谢
  • 您的 GC 日志是否报告了长时间的停顿? grep "stopped: [1-9]" *gc*.current | grep `date +%m-%d`T | sort -nk11。 RowCacheKey 将分区键复制到新的字节数组中,因此当使用很多时,如果您有更大或复合键,它会给 YGC 带来很大压力。不相关:可能想将 memtable_heap_space_in_mb 设置为 1000。默认为 4gb 或 1/4 堆,这会产生很多碎片(如果使用默认 CMS)并且会导致大量刷新 - 这不是您的问题,但通常在堆时设置上限是个好主意变大。

标签: cassandra cassandra-3.0


【解决方案1】:

我认为这很可能是因为您的 cassandra 节点花费了大量时间来清除行缓存并运行 Java GC 清理。隔离问题的最佳选择是使用工具(datadog、datastax ops center、Jconsole)来确定次要和主要 GC 的频率。

此外,如果您的查询耗时约 2 秒,我预计您可能正在进行大范围扫描。我过去曾尝试为此使用行缓存,但效果不佳。

您也可以尝试在运行行缓存的表上减少 rows_per_partition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2019-03-21
    • 2012-03-08
    • 2016-04-08
    • 2020-06-02
    • 2011-06-15
    相关资源
    最近更新 更多