How to use Linux hugetlbfs for shared memory maps of files?

问题描述 投票:0回答:2

我有一个程序使用

mmap()
和共享内存来有效地访问大型数据库文件。我想尝试使用大页面,看看它是否可以加快速度。

我认为一种快速简便的方法是将数据库文件复制到 Linux 的 hugetlbfs 目录中,并在旧位置创建一个 symlink 到它。

但是,这不起作用,因为

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

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

linux memory-mapped-files vfs huge-pages
2个回答
0
投票

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

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

这些功能可能就是你要找的

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

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

这里有一篇 Linux Weekly 文章,您可能会觉得有帮助。 大页面 - 第 1 部分(介绍)


0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.