V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  数据库

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

  •  
  •   zxCoder · 2020-12-14 22:32:47 +08:00 · 2047 次点击
    这是一个创建于 1440 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    数据库实现者认为数据库来控制内存比操作系统控制效率更好, 所以很少看到数据库实现是靠 mmap 来做.
    xiaoyaocmx
        2
    xiaoyaocmx  
       2020-12-15 00:00:43 +08:00
    早期 mongodb 好像是 mmap 。。dbms 比 os 更懂需要 cache 什么,所以用自己的 buffer pool manager 更好一点
    dndx
        3
    dndx  
       2020-12-15 00:05:16 +08:00
    有这么做的,比如 LMDB 就是靠 mmap 和操作系统来管理 page buffer 的。
    chihiro2014
        4
    chihiro2014  
       2020-12-15 00:17:25 +08:00
    mmap 不太行,因为 DBMS 自己最懂自己,所以都是自己实现 buffer pool
    gzdaijie
        5
    gzdaijie  
       2020-12-15 00:26:01 +08:00
    bbolt 也是 mmap
    allAboutDbmss
        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
    wellsc
        7
    wellsc  
       2020-12-15 02:48:15 +08:00 via iPhone
    Rocksdb/leveldb 也是 mmap,mmap 适合那种读少写多的场景
    Goldilocks
        8
    Goldilocks  
       2020-12-15 06:14:15 +08:00 via Android
    MySQL 有两个主流引擎。MyISAM 和 InnoDB 。前者用 mmap 管理数据页,后者自己管理内存池。孰优孰劣,历史为鉴
    zxCoder
        9
    zxCoder  
    OP
       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
        10
    zxCoder  
    OP
       2020-12-15 08:39:48 +08:00
    @louettagfh 你好 不太能理解这句话 ,可以解释一下吗,读和写对 mmap 以及 buffer pool 的影响不一样吗
    zxCoder
        11
    zxCoder  
    OP
       2020-12-15 08:40:59 +08:00
    @wellsc 你好 mmap 适合读少写多的场景 可以解释一下吗
    lambdafate
        12
    lambdafate  
       2020-12-15 08:42:25 +08:00
    DBMS vs. OS
    Goldilocks
        13
    Goldilocks  
       2020-12-15 09:35:12 +08:00   ❤️ 1
    1. 是不是说如果用 mmap,就不用 buffer pool 了?

    是的。

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

    是的。这个叫做双倍缓冲,浪费内存。如果数据库如果自己有缓冲池,那么操作文件的时候一般都使用 direct io,绕过系统的 cache 层。
    zxCoder
        14
    zxCoder  
    OP
       2020-12-15 09:49:19 +08:00
    @Goldilocks 谢谢 我大概清楚了
    louettagfh
        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, 都是尽可能多的占用内存, 数据库可以自己考虑刷脏的时机等等..
    zxCoder
        16
    zxCoder  
    OP
       2020-12-15 14:16:00 +08:00
    @louettagfh 懂了 感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1582 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:05 · PVG 01:05 · LAX 09:05 · JFK 12:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.