【问题标题】:Why InnoDB does use buffer pool, not mmap entire file?为什么 InnoDB 确实使用缓冲池,而不是 mmap 整个文件?
【发布时间】:2020-10-17 16:10:20
【问题描述】:

InnoDB 使用可配置大小的缓冲区布尔值来存储最近使用的页面(b+树块)。

为什么不用 mmap 整个文件呢?是的,这不适用于更改的页面,因为您希望在写回目标位置之前将它们存储在双写缓冲区中。但是 mmap 让内核管理页面的 LRU 并避免用户空间复制。此外,inkernel-copy 代码不使用向量指令(以避免将它们的寄存器存储在进程上下文中)。

但是当页面没有改变时,为什么不使用 mmap 来读取页面并让内核管理在文件系统内存缓存中缓存它们呢?因此,您只需要更改页面的“自定义”用户空间缓存。

LMDB 作者提到他选择 mmap 方法是为了避免将数据从文件系统缓存复制到用户空间并避免 LRU 重新发明。

我缺少哪些 mmap 的关键缺点导致缓冲池方法?

【问题讨论】:

  • 直到最近,数据库大小经常会超出虚拟内存地址范围...

标签: innodb mmap


【解决方案1】:

MMAP 的缺点:

  • 并非所有操作系统都支持它(咳咳 Windows)

  • 粗锁定。很难让多个客户端同时访问该文件。

  • 如果 RDBMS 引擎崩溃,依靠操作系统缓冲 I/O 写入会增加数据丢失的风险。需要使用日志文件系统,可能并非所有操作系统都支持。

  • 只能将文件大小映射到虚拟内存地址空间的大小,因此在 32 位操作系统上,数据库文件被限制为 4GB(根据上面 Roger Lipscombe 的评论)。

早期版本的 MongoDB 尝试在主存储引擎(最早的 MongoDB 中唯一的存储引擎)中使用 MMAP。从那时起,他们推出了其他存储引擎,尤其是 WiredTiger。这对调优有更好的支持,在多核系统上有更好的性能,对加密和压缩、多文档事务等的支持。

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多