数据库如果使用了 mmap,是否还需要页面的 buffer pool 呢

2020-12-14 22:32:47 +08:00
 zxCoder

mmap 有是操作系统自带的页面置换,那还需要再实现一层 buffer pool 来控制页面的置换吗?

2053 次点击
所在节点    数据库
16 条回复
louettagfh
2020-12-14 23:44:21 +08:00
假如只考虑写 mmap 和 buffer pool 的作用是一样的,但数据库还有读.

数据库实现者认为数据库来控制内存比操作系统控制效率更好, 所以很少看到数据库实现是靠 mmap 来做.
xiaoyaocmx
2020-12-15 00:00:43 +08:00
早期 mongodb 好像是 mmap 。。dbms 比 os 更懂需要 cache 什么,所以用自己的 buffer pool manager 更好一点
dndx
2020-12-15 00:05:16 +08:00
有这么做的,比如 LMDB 就是靠 mmap 和操作系统来管理 page buffer 的。
chihiro2014
2020-12-15 00:17:25 +08:00
mmap 不太行,因为 DBMS 自己最懂自己,所以都是自己实现 buffer pool
gzdaijie
2020-12-15 00:26:01 +08:00
bbolt 也是 mmap
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
wellsc
2020-12-15 02:48:15 +08:00
Rocksdb/leveldb 也是 mmap,mmap 适合那种读少写多的场景
Goldilocks
2020-12-15 06:14:15 +08:00
MySQL 有两个主流引擎。MyISAM 和 InnoDB 。前者用 mmap 管理数据页,后者自己管理内存池。孰优孰劣,历史为鉴
zxCoder
2020-12-15 08:38:50 +08:00
@louettagfh
@xiaoyaocmx
@dndx
@chihiro2014
@gzdaijie
@allAboutDbmss
@wellsc
@Goldilocks

大家误会我的意思了,我知道数据库最好自己管理数据页而不是用 mmap(cmu 那个公开课老师说了),我是想问问,mmap 和我们自己实现的缓冲池这两者冲突吗?我咋感觉 mmap 本身也就是个 page 的缓冲池的样子

是不是说如果用 mmap,就不用 buffer pool 了?

因为我对这些结构还不是特别熟悉,想通过做一个小玩具数据库来加深印象
zxCoder
2020-12-15 08:39:48 +08:00
@louettagfh 你好 不太能理解这句话 ,可以解释一下吗,读和写对 mmap 以及 buffer pool 的影响不一样吗
zxCoder
2020-12-15 08:40:59 +08:00
@wellsc 你好 mmap 适合读少写多的场景 可以解释一下吗
lambdafate
2020-12-15 08:42:25 +08:00
DBMS vs. OS
Goldilocks
2020-12-15 09:35:12 +08:00
1. 是不是说如果用 mmap,就不用 buffer pool 了?

是的。

2. mmap 和我们自己实现的缓冲池这两者冲突吗

是的。这个叫做双倍缓冲,浪费内存。如果数据库如果自己有缓冲池,那么操作文件的时候一般都使用 direct io,绕过系统的 cache 层。
zxCoder
2020-12-15 09:49:19 +08:00
@Goldilocks 谢谢 我大概清楚了
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, 都是尽可能多的占用内存, 数据库可以自己考虑刷脏的时机等等..
zxCoder
2020-12-15 14:16:00 +08:00
@louettagfh 懂了 感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX