【问题标题】:writing a mmapped file using a huge page mapping使用大页面映射编写映射文件
【发布时间】:2018-08-07 03:29:53
【问题描述】:

据我了解,目前在 linux 上,没有办法先对文件进行 mmap(在 xfs 或 ext4 上)然后写入文件并以某种方式使用大页面。

这是正确的还是过时的信息,现在有办法这样做吗?

谢谢。

【问题讨论】:

  • 是什么让你这么想?你可以mmap(2)MAP_HUGETLBMAP_HUGE_1GB。请在您的问题中显示一些minimal reproducible example
  • @BasileStarynkevitch 如果您尝试使用 MAP_HUGETLB | 的 mmap | MAP_SHARED ,它以 EINVAL 失败。 (处理磁盘文件时需要 MAP_SHARED。)
  • 这可能取决于您使用的内核和文件系统(以及它们的配置和设置)。这可能对性能影响不大(例如,使用 posix_fadvise(2) 可能更重要)
  • 你知道任何支持这种组合的文件系统(MAP_HUGETLB | MAP_SHARED)吗?
  • 这是一个不同的问题。我不知道。也许文件系统的设置(例如块大小,mkfs 时间)很重要。你应该编辑你的问题来激发它(它看起来像一些XY problem...)

标签: linux mmap huge-pages


【解决方案1】:

如果您使用不是来自“hugetlbfs”的 MAP_HUGETLB 对文件进行 mmap,则 mmap 将失败。来自ksys_mmap_pgoff()

if (!(flags & MAP_ANONYMOUS)) {
    ...
    if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
         goto out_fput;

is_file_hugepages() 检查文件操作是否为hugetlbfs_file_operations,例如分机4。

但是,您也许可以使用透明的大页面。目前(4.19 左右),您还必须使用 DAX(直接访问,通常与 nvdimms 和持久内存一起使用)。我还没有这样做,但那是通过跟踪代码。具体来说,要使大页面正常工作,您至少需要一个大页面对齐地址,该地址来自 thp_get_unmapped_area(),如果您不使用 DAX,该地址就可以解决:

 if (!IS_DAX(filp->f_mapping->host) || !IS_ENABLED(CONFIG_FS_DAX_PMD))
    goto out;

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2016-12-22
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多