使用mmap和大页面随机读取大文件

时间:2017-04-30 11:42:45

标签: linux io mmap memory-mapped-files huge-pages

我正在使用mmap读取一个大型数据库文件(例如100GB),索引保存在主内存中(键偏移对)。

由于默认的4KB虚拟内存页面大小,我假设文件系统上的读取调用也将使用4KB的块。但是,对于我的应用程序的访问模式来说,这是非常低效的。因此,我正在调查使用大页面透明地将I / O单元的大小从4KB增加到2MB的可能性。

大页面的典型用法似乎是提高内存分配和TLB利用率,但我无法找到有关如何与实际文件I / O相关的任何信息。使用mmap,似乎只有私有匿名地图才支持大页面。这个假设是否正确?我也尝试过查看libhugetlbfs,但是我无法找到如何用它来读取实际文件。

那么,有没有办法使用mmap透明地访问文件并使用大于4KB的I / O单元?

1 个答案:

答案 0 :(得分:1)

Linux不支持通过页面缓存使用大页面(与其他操作系统相同)。

最重要的原因是系统中的每个进程以及内核本身都使用(共享)页面缓存。

请考虑以下情形:您的进程使用2MB的大页面映射文件,但是另一个进程使用常规的4KB的页面映射文件。唯一的方法是将进程动态切换到4KB页面,因此首先从2MB页面开始是没有意义的。

您实际需要的是让内核使用FADV_WILLNEED的{​​{3}}或MADV_WILLNEED的{​​{3}}开始预取数据。进行系统调用不是“免费”的,但是如果您知道即将访问2MB区域,那么它们应该是完美的。

有关其他信息,您可以阅读fadvise,以获得有关内核开发人员对大型页面的看法(想法)的更多见解。