5

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

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

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

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

4

2 回答 2

0

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

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

这些功能可能是您正在寻找的。

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

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

这是一篇 Linux 周刊文章,可能会对您有所帮助。巨大的页面 - 第 1 部分(介绍)

于 2013-02-27T22:20:07.480 回答
0

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

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

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

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

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

于 2020-12-08T10:30:55.873 回答