【问题标题】:How to use Linux hugetlbfs for shared memory maps of files?如何将 Linux hugetlbfs 用于文件的共享内存映射?
【发布时间】:2012-04-27 00:16:09
【问题描述】:

我有一个程序使用mmap() 和共享内存来有效地访问大型数据库文件。我想试验一下大页面,看看它是否能加快速度。

我认为一种快速简便的方法是将数据库文件复制到 Linux 的 hugetlbfs 目录并在旧位置创建一个 符号链接

但是,这不起作用,因为cp 命令无法写入文件。我怀疑只能通过调用ftrunc()mmap() 系统调用来写入文件来创建文件。我可能会尝试编写一个复制工具来执行此操作,除非我得到描述现有工具的答案。

我正在寻找在 Linux 中使用大页进行共享内存映射的任何其他好方法。

【问题讨论】:

  • “透明大页”可能会给您带来所有好处,而无需任何特殊编码或将所有数据复制到hugetlb ramdisk。此功能是最新内核的标准功能,Red Hat 和 Suse 都已将其向后移植到其最新的企业版本(分别为 RHEL 6 update 2 和 SLES 11 SP2)
  • @Nemo:根据文档,透明大页面目前仅适用于私有匿名内存。我希望可以使用共享文件映射。
  • 嗯,这听起来像是“未来工作”的一部分。好吧,遗留的hugetlbfs也只是匿名页面(一个ramdisk,基本上是一样的)。所以看起来 Linux 目前不支持你正在尝试做的事情。
  • @Nemo:是的,但是在 ramdisk 中它们被命名为匿名页面,应该可以在共享访问中打开。

标签: linux memory-mapped-files vfs huge-pages


【解决方案1】:

现在是一个老问题。但是看到没有人回答,我实际上也想尝试大页面支持(出于不同的原因)。我会提供答案。

尽管现在大页面在现代内核中是透明的,但您仍然可以获得更多控制权。

这些功能可能正是您想要的。

get_huge_pages()free_huge_pages()get_hugepage_region()free_hugepage_region()

您需要安装libhugetlbfs,它是hugetlbfs 的包装器。

这是一篇 Linux 周刊文章,可能对您有所帮助。 Huge pages - part 1 (Introduction)

【讨论】:

    【解决方案2】:

    Huge pages 是一种通过将多个连续的物理内存页面(例如 4KB 长)映射到单个大内存页面(例如 2 MB、1 GB...)来节省 TLB 未命中的方法。 Linux 提出了两种机制:

    • 透明大页 (THP) 在内核内部透明管理;
    • 由用户空间应用程序管理的用户控制的大页面。

    此外,一个名为libhugetlbfs 的可选用户空间库可用于提供用户友好的API 和工具,以将大页面用于堆、静态链接程序的代码和数据段。这个库隐藏了内核提供的“原始”接口。根据应用程序,这可能有用或不够灵活。

    对于问题的数据库示例问题,想法是在 hugetlbfs 文件系统中创建文件(它实际上是一种基于巨大内存页面的 RAM 文件系统),扩展将文件(使用 ftrunc())复制到大页面大小的倍数,将文件映射到内存中,并将这些内存区域用作读取/写入数据库文件的缓冲区。由于访问内存页面所需的 TLB 条目更少,因此性能有所提高。

    answer 提供了有关使用 Linux“原始”接口映射大页面的方法的详细信息。

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 2019-05-08
      • 2011-01-16
      • 2023-04-11
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      相关资源
      最近更新 更多