为什么mmap仍会增加磁盘读取?

时间:2020-10-11 06:47:00

标签: linux memory linux-kernel ubuntu-20.04

对于Ubuntu 20.04,我使用mmap映射磁盘文件(大约4G)。 该文件每天都在变化,因此我必须每天映射另一个文件。
而且我发现有时候(并非总是如此),尽管mmap完成了,但磁盘读取却迅速增加。
为什么mmap不能将所有文件都加载到内存中?

1 个答案:

答案 0 :(得分:0)

为了理解问题,首先需要了解如果致电mmap()会发生什么。

mmap()可用于将虚拟内存映射到物理内存,也可以将文件映射到自己的虚拟内存。函数堆栈就像ksys_mmap_pgoff()->vm_mmap_pgoff()->do_mmap_pgoff()->do_mmap()。此后,我们将构建用户空间内存映射,但是它只在虚拟内存中应用了一个新区域,我们还没有触及物理内存。当进程计划为此进程进行调度并且我们要寻址该物理内存时,它会触发页面错误中断并调用do_page_fault()->find_vma()->handle_mm_fault()与物理内存进行真正的联系,对于不同的文件系统,我们将使用诸如{{1 }}。

现在让我们回到问题所在。ext3_filemap_fault()将导致磁盘读取,但是我们不确定何时会发生。这取决于您何时使用它以及何时为该进程安排CPU。

此外,如果您使用mmap()或其他工具,则会发现Linux操作系统具有名为freeBuffer的设计。

Cache

此机制将有助于加快I / O读/写速度,并且当您使用buffers Memory used by kernel buffers (Buffers in /proc/meminfo) cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo) 时,也可能导致磁盘读取增加。