compaction 的几个问题

请教几个关于compaction的问题
1、 下面的帖子中提到 定期进行compaction 10分钟一次。这个定期是如何触发的?有没有相关参数配置?

2、 region-compact-check-interval 参数说的‘检查是否需要人工触发rocksdb compaction’ 是什么意思?
image

3、下面的帖子提到 ‘业务存在大量读取,但只有小量写操作,不足以触发 compaction’ ,这里的触发compaction应该是指达到rocksdb 每层的trigger值吧?虽然每次update量很少但是累积起来为什么也没有触发compaction? 按照第1个问题的帖子描述 10分钟一次定期compaction,这里应该能再开启gc in compaction filter的情况下进行GC啊。

1 个赞
  1. 抱歉,第一个问题,我修改了下,之前我写的不对,表达的不清楚。:joy:
  2. 我理解关闭掉手工 compact ,https://github.com/tikv/tikv/pull/1491 是为了避免频繁的手工 compact ,反而影响正常的业务。


我理解的compaction 是这里

2 个赞

图中这每一层进行compaction的阈值有对应配置项吗,或者有没有对应的文档说明

有几个疑问也借这个机会问下,谢谢

  1. 手动 compact 和自动 compact 优先级是怎样的?如果手动 compact 优先级更高,执行时间长的话会不会影响到集群的写入,因为手动 compact 可能会影响系统正常的自动 compact
  2. tikv中没有看到配置参数 max_background_compactions (没有对外暴露这个参数),而是使用 max_background_jobs 来代替,那么是不是这样的:
    max_background_jobs = max_background_flushes + max_background_compactions
  3. compact 进度如何查看,比如 tikv 实例占用磁盘1.5T,那么手动compact期间如何查看进度?

目前没有看到相关参数可以调整level n 的大小, 可以看下 https://docs.pingcap.com/zh/tidb/dev/rocksdb-overview#rocksdb-的空间占用

问题2:

rocksdb.max-background-jobsrocksdb.max-sub-compactions

RocksDB 线程池是进行 Compact 和 Flush 任务的线程池,默认大小为 8。这明显超出了实际可以使用的资源,需要限制。 rocksdb.max-sub-compactions 是单个 compaction 任务的子任务并发数,默认值为 3 ,在写入流量不大的情况下可以进行限制。

Level 1那个256MB是怎么推算出来的呢

在官方文档中没有找打level1 大小来源 这个可以单独开个问题

根据上图 level 1的大小 是 一个memtable 压缩后的大小*4所得 ,
纠正一点: 这里 256MB是level 1层级的所有大小非单个sst

1 个赞

此图中的每个leve n 后的每个值是指 整个level 层级的大小, 非单个sst文件

感谢答疑

图一:


图2:image

如上2张图 level 1 的默认值 如图一 ,三个参数对应的三个默认值,参数事例如图2

rocksdb.defaultcf.max-bytes-for-level-base
rocksdb.writetcf.max-bytes-for-level-base
rocksdb.lockcf.max-bytes-for-level-base

官方文档 :https://docs.pingcap.com/zh/tidb/dev/tune-tikv-memory-performance#参数说明