把数据库文件交给 mmap,就像把仓库钥匙交给管理员:程序可以像读内存一样直接访问文件,但什么时候搬货、腾位置,更多由操作系统决定。映射成功不等于数据已在内存;首次访问可能触发缺页(page fault),若页缓存里没有所需内容,一次看似普通的读取就可能突然等待磁盘。
这篇实践总结来自作者参与构建的两个 TB 级追加写数据库。追加写意味着旧数据不原地修改:内存缓冲区封成不可变文件后,才用 mmap 提供查询。作者认为,这改变了风险计算——映射只读取已经持久化的文件,不负责写入、刷盘或崩溃恢复;尚未封存的数据则由预写日志负责持久性。因此,mmap 最棘手的“脏页何时落盘”问题被绕开了。
但代价没有消失,只是藏进系统边界:缺页可能制造延迟尖峰,页缓存可能在内存紧张时被回收,数据库也部分交出了缓存与淘汰控制。值得记住的不是“mmap 好或坏”,而是作者的核心判断:它是否合适,取决于写入模式;对先写完、再只读的不可变段尤其有利。