5

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

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

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

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

4

1 回答 1

1

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

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

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

您真正需要的是让内核使用fadvisewithFADV_WILLNEEDmadvisewith开始预取数据MADV_WILLNEED。进行系统调用不是“免费的”,但如果您知道您将很快访问 2MB 区域,那么它们应该是完美的。

有关更多信息,您可以阅读本文以更深入地了解内核开发人员对大页面的想法(想法)。

于 2018-09-15T17:37:24.597 回答