问题描述
InnoDB使用可配置大小的缓冲区bool来存储最近使用的页面(b + tree块)。
为什么不映射整个文件呢?是的,这不适用于已更改的页面,因为您想在将它们写回到目标位置之前将它们存储在双写缓冲区中。但是mmap允许内核管理页面的LRU,并避免了用户空间复制。同样,内核复制代码不使用向量指令(以避免将其寄存器存储在过程上下文中)。
但是,当页面未更改时,为什么不使用mmap读取页面并让内核管理它们在文件系统ram缓存中的缓存呢?因此,您只需要“自定义”用户空间缓存即可用于已更改的页面。
LMDB作者提到,他选择了mmap方法来避免将数据从fisystem缓存复制到用户空间并避免LRU的重新发明。
我缺少mmap的哪些关键缺点导致缓冲池方法?
解决方法
MMAP的缺点:
-
并非所有操作系统都支持它( ahem Windows)
-
粗锁定。很难让许多客户端同时访问文件。
-
如果RDBMS引擎崩溃,则依靠操作系统来缓冲I / O写入会导致数据丢失的风险增加。需要使用日记文件系统,并非所有操作系统都支持该文件系统。
-
只能将文件大小映射为虚拟内存地址空间的大小,因此在32位操作系统上,数据库文件限制为4GB(来自上述Roger Lipscombe的评论)。
MongoDB的早期版本尝试在主存储引擎(最早的MongoDB中唯一的存储引擎)中使用MMAP。从那时起,他们推出了其他存储引擎,特别是WiredTiger。这样可以更好地支持调优,在多核系统上提供更好的性能,支持加密和压缩,多文档事务等等。