【 TiDB 使用环境】测试
【 TiDB 版本】6.5.0
【复现路径】https://docs.pingcap.com/zh/tidb/stable/rocksdb-overview
【遇到的问题:问题现象及影响】
文档中显示:
为了提高读取性能以及减少对磁盘的读取,RocksDB 将存储在磁盘上的文件都按照一定大小切分成 block(默认是 64KB),读取 block 时先去内存中的 BlockCache 中查看该块数据是否存在,存在的话则可以直接从内存中读取而不必访问磁盘。
BlockCache 按照 LRU 算法淘汰低频访问的数据,TiKV 默认将系统总内存大小的 45% 用于 BlockCache
问题:
1)内存中的 BlockCache 可以理解为 MySQL 的 buffer pool 吗?
2)数据写入时不会更新 BlockCache,然后生成脏页吗?
【资源配置】
【附件:截图/日志/监控】
看这个图就很清晰了,类似mysql的buffer pool
海石花47
3
tidb 里有 membuffer 缓存池,可以把不经常更新的小表数据刷进去,然后查询就会走缓存啦
谢谢大佬,那么数据写入时也会更新 BlockCache,然后生成脏页吗?
写入走的路径是:
WAL 先落盘,然后写 memtable,就完事儿了。
后台有线程监视 memtable,当 memtable 大小超过阈值时,switchmemtable,切换成 immutable memtable
然后当 immutable memtable 超过数量后,flush,刷盘。
读走的流程:
找找memtable中是否存在,不存在的话,找找blockcache,如果还不存在,读磁盘,同时把数据更新到blockcache。
由此可见,写入不会冲掉blockcache, blockcache只有一个入口,就是读文件的时候找不到。
但是,写入会冲掉memtable,把之前写入的冲到磁盘上,所以,如果写入的数据立刻要读取,那能从memtable中拿到,如果时间久了,就刷盘了,需要再读一次刷入 blockcache 才行。
1 个赞
system
(system)
关闭
10
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。