加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 22:44:56 所属栏目:Linux 来源:网络整理
导读:我正在使用mmap来读取一个大型数据库文件(例如,100GB),索引保存在主内存中(键偏移对). 由于默认的4KB虚拟内存页面大小,我假设文件系统上的读取调用也将使用4KB的块.但是,对于我的应用程序的访问模式来说,这是非常低效的.因此,我正在调查使用大页面透明地将I
我正在使用mmap来读取一个大型数据库文件(例如,100GB),索引保存在主内存中(键偏移对).

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

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

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

解决方法

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

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

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

您实际需要的是要求内核使用带有FADV_WILLNEED的fadvise或带有MADV_WILLNEED的madvise来开始预取数据.做一个系统调用不是“免费”,但如果你知道你很快就要访问2MB区域,那么它们应该是完美的.

有关其他信息,请阅读this以更深入地了解内核开发人员对大页面的看法(思考).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读