关于内存的说明

技术文档里面有一段话怎么也不理解
RocksDB 简介 | PingCAP 文档中心

RocksDB 的内存占用

为了提高读取性能以及减少对磁盘的读取,RocksDB 将存储在磁盘上的文件都按照一定大小切分成 block(默认是 64KB),读取 block 时先去内存中的 BlockCache 中查看该块数据是否存在,存在的话则可以直接从内存中读取而不必访问磁盘。

BlockCache 按照 LRU 算法淘汰低频访问的数据,TiKV 默认将系统总内存大小的 45% 用于 BlockCache,用户也可以自行修改 storage.block-cache.capacity 配置设置为合适的值,但是不建议超过系统总内存的 60%。

写入 RocksDB 中的数据会写入 MemTable,当一个 MemTable 的大小超过 128MB 时,会切换到一个新的 MemTable 来提供写入。TiKV 中一共有 2 个 RocksDB 实例,合计 4 个 ColumnFamily,每个 ColumnFamily 的单个 MemTable 大小限制是 128MB,最多允许 5 个 MemTable 存在,否则会阻塞前台写入,因此这部分占用的内存最多为 4 x 5 x 128MB = 2.5GB。这部分占用内存较少,不建议用户自行更改。

===================================
1,一个tikv有两个rocksdb,一个是raftdb一个是kvdb。
2,kvdb有4个columnfamily。
3,memTable不应该是一个rocksdb实例就有2个么(一个是在用的,一个是用来flush到磁盘的)
所以单个kv的内存不应该是2*2*128m吗?跟columnfamily有什么关系呢?

ColumnFamily = MemTable + SST + 共享WAL

每个 ColumnFamily 的单个 MemTable 大小限制是 128MB,最多允许 5 个 MemTable 存在

就是最多有5个MemTable 用于数据读写

如果是你说的一个是在用的,一个是用来flush到磁盘的。那在用的写满了,而flush还没刷完就会造成等待,数据无法写入。

每个column family 一套: memtable
比如说max_write_bufer_number=5,一个tikv上就是 4(column_family) * 5(max_write_buffer_size)=20
memtable还有个参数,write_buffer_size=128MB,就是写够128MB,轮换一个,凑够5个,flush一次,写盘。

memtable跟我们平时写日志一样,轮转的,只有1个在写,写满换一个,写满换1个,写够5个刷盘。

这部分我建议别只看tidb文档,你找些rockesdb文档看看,比如这篇就写的不错了
深入RocksDB原理 - 知乎 (zhihu.com)

操作系统工程师看看呢

columnfamily是事务的中间过程

不太懂这个

这个靠谱

也可以看看源码

过来学习一下

没有什么关系