如何在多写入器情况下对文件支持的共享内存中的大页进行故障排除

Posted

技术标签:

【中文标题】如何在多写入器情况下对文件支持的共享内存中的大页进行故障排除【英文标题】:How to Fault Hugepages in File Backed Shared Memory in Multiple-Writer Case 【发布时间】:2020-01-20 02:07:24 【问题描述】:

我有多个写入器,它们将 mmap() 多个共享(即指定 MAP_SHARED)由文件支持的大页面。

将这些大页面归零(例如memset(ptr, 0, size))可能会提前对页面进行故障处理。

但是,如果我有多个编写器(多个进程),那么当这些页面第一次映射时,可能只有一个编写器应该将页面归零,因为这样,我不必担心读者仍在阅读或当作家归零时作家仍在写作。

问题:

    除了归零/写入页面之外,还有其他方法可以提前对页面进行故障处理吗? 如果不是,在不影响正在阅读的读者和正在写作的作者的情况下,常见的故障页面方法是什么?

mmap(2) 暗示mlock() 可以预先设置页面:

MAP_LOCKED (since Linux 2.5.37)
              Mark the mapped region to be locked in the same way as
              mlock(2).  This implementation will try to populate (prefault)
              the whole range but the mmap() call doesn't fail with ENOMEM
              if this fails.  Therefore major faults might happen later on.
              So the semantic is not as strong as mlock(2).  One should use
              mmap() plus mlock(2) when major faults are not acceptable
              after the initialization of the mapping.  The MAP_LOCKED flag
              is ignored in older kernels.

但是,mlock(2) 没有明确声明当调用mlock() 时页面会出错。想好了吗?

【问题讨论】:

【参考方案1】:

至于mlock(2)

请参阅these docs。

在此进程或其他进程中对锁定页面的引用不会导致需要 I/O 操作的页面错误

至于你的问题

    除了归零/写入页面之外,还有其他方法可以提前对页面进行故障处理吗?

是的,有一种“可能”的方式。请参阅posix_madivse(3)POSIX_MADV_WILLNEED 标志。

另请参阅madvise(2),它在功能方面比上述更酷,但没有任何标准规定。

【讨论】:

似乎posix_madivse()madvise() 都只允许提示操作系统提前故障页面,但不能保证页面是否有故障? @HCSF 对,查看mincore(2),它可能会帮助您获取有关页面的信息。

以上是关于如何在多写入器情况下对文件支持的共享内存中的大页进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

php pdf报价中的大页脚

PostgreSQL数据库配置大页

PG数据库配置大页

OpenStack中的CPU绑核、NUMA亲和、大页内存

大页内存原理

如何查看mysql内存占用原因