mmap 有是操作系统自带的页面置换,那还需要再实现一层 buffer pool 来控制页面的置换吗?
1
louettagfh 2020-12-14 23:44:21 +08:00
假如只考虑写 mmap 和 buffer pool 的作用是一样的,但数据库还有读.
数据库实现者认为数据库来控制内存比操作系统控制效率更好, 所以很少看到数据库实现是靠 mmap 来做. |
2
xiaoyaocmx 2020-12-15 00:00:43 +08:00
早期 mongodb 好像是 mmap 。。dbms 比 os 更懂需要 cache 什么,所以用自己的 buffer pool manager 更好一点
|
3
dndx 2020-12-15 00:05:16 +08:00
有这么做的,比如 LMDB 就是靠 mmap 和操作系统来管理 page buffer 的。
|
4
chihiro2014 2020-12-15 00:17:25 +08:00
mmap 不太行,因为 DBMS 自己最懂自己,所以都是自己实现 buffer pool
|
5
gzdaijie 2020-12-15 00:26:01 +08:00
bbolt 也是 mmap
|
6
allAboutDbmss 2020-12-15 01:20:02 +08:00
mmap 以后再 buffer manager 需要看如何实现 如果我们的实现支持页面到磁盘的读写,那实际上就是正常的 buffer manger, 但是 mmap 看起来帮助不大。
用 mmap 的主要目的就是放弃控制权(也放弃了高性能) 使用操作系统已经给我们的东西。 https://cakebytheoceanluo.github.io/2020/03/11/CMU-15445-Lec03/#Why-not-use-the-OS |
7
wellsc 2020-12-15 02:48:15 +08:00 via iPhone
Rocksdb/leveldb 也是 mmap,mmap 适合那种读少写多的场景
|
8
Goldilocks 2020-12-15 06:14:15 +08:00 via Android
MySQL 有两个主流引擎。MyISAM 和 InnoDB 。前者用 mmap 管理数据页,后者自己管理内存池。孰优孰劣,历史为鉴
|
9
zxCoder OP @louettagfh
@xiaoyaocmx @dndx @chihiro2014 @gzdaijie @allAboutDbmss @wellsc @Goldilocks 大家误会我的意思了,我知道数据库最好自己管理数据页而不是用 mmap(cmu 那个公开课老师说了),我是想问问,mmap 和我们自己实现的缓冲池这两者冲突吗?我咋感觉 mmap 本身也就是个 page 的缓冲池的样子 是不是说如果用 mmap,就不用 buffer pool 了? 因为我对这些结构还不是特别熟悉,想通过做一个小玩具数据库来加深印象 |
10
zxCoder OP @louettagfh 你好 不太能理解这句话 ,可以解释一下吗,读和写对 mmap 以及 buffer pool 的影响不一样吗
|
12
lambdafate 2020-12-15 08:42:25 +08:00
DBMS vs. OS
|
13
Goldilocks 2020-12-15 09:35:12 +08:00 1
1. 是不是说如果用 mmap,就不用 buffer pool 了?
是的。 2. mmap 和我们自己实现的缓冲池这两者冲突吗 是的。这个叫做双倍缓冲,浪费内存。如果数据库如果自己有缓冲池,那么操作文件的时候一般都使用 direct io,绕过系统的 cache 层。 |
14
zxCoder OP @Goldilocks 谢谢 我大概清楚了
|
15
louettagfh 2020-12-15 11:01:28 +08:00
@zxCoder 假如是考虑写, mmap 和 buffer pool 的作用一样,一个是系统级的 Page Cache, 一个是应用级的 Page Cache, 操作系统和 buffer pool 一样可以设置刷脏阈值, 本质上没有特别大的区别。
读场景例如 InnoDB 采用的不是朴素的 LRU,里面将 LRU 区分为 old + young 区域, 目的是为了不让一个随机读的 Page 打乱 LRU, 读这块数据库可以做的很多. 一般使用 Buffer Pool, 都是尽可能多的占用内存, 数据库可以自己考虑刷脏的时机等等.. |
16
zxCoder OP @louettagfh 懂了 感谢
|