如何使用Linux的hugetlbfs共享内存Map文件?

6tqwzwtp  于 2023-01-20  发布在  Linux
关注(0)|答案(2)|浏览(175)

我有一个使用mmap()和共享内存来高效访问大型数据库文件的程序。我想用大型页面来试验一下,看看它是否能加快速度。
我认为一种快速而简单的方法是将数据库文件复制到Linux的 hugetlbfs 目录中,并在旧位置创建一个指向它的 symlink
但是,这不起作用,因为cp命令不能写入文件。我怀疑只有通过调用ftrunc()mmap()系统调用才能创建文件。我可能会尝试编写一个复制工具来执行此操作,除非我得到一个描述现有工具的答案。
我正在寻找任何其他好的方法来在Linux中使用巨大的页面进行共享内存Map。

lstz6jyr

lstz6jyr1#

这是一个老问题了。但是鉴于没有人回答,我也想尝试一下大页面支持(原因不同)。我会提供一个答案。
尽管在现代内核中,巨大的页面现在是透明的,但您仍然可以获得更多的控制。
这些功能可能正是您所需要的。
get_huge_pages()free_huge_pages()get_hugepage_region()free_hugepage_region()
您需要安装libhugetlbfs,它是hugetlbfs的 Package 器。
下面是一篇Linux周刊文章,您可能会觉得很有帮助。Huge pages - part 1 (Introduction)

eagi6jfj

eagi6jfj2#

巨型页是一种通过将多个连续的物理内存页(例如4KB长)Map到单个巨型页(例如2 MB、1GB...)来保存TLB未命中的方法。Linux提出了两种机制:

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

除此之外,还有一个可选的用户空间库libhugetlbfs,它提供了一个用户友好的API和工具,可以将巨大的页面用于堆、静态链接程序的代码和数据段。这个库隐藏了内核提供的“原始”接口。根据应用程序的不同,这可能有用,也可能不够灵活。
对于问题的数据库示例问题,我们的想法是在 hugetlbfs 文件系统中创建文件(它实际上是一种基于内存页的RAM文件系统),扩展文件(使用 ftrunc())转换为巨大页面大小的倍数,将文件mmap到内存中,并将这些内存区域用作读/写数据库文件的缓冲区。由于需要更少的TLB条目来访问存储器页,因此性能得到提高。
这个answer提供了使用Linux“raw”接口Map巨大页面的详细方法。

相关问题