C语言 用于mmap大文件的窗口控件(linux,mmap)

vkc1a9a2  于 2022-12-22  发布在  Linux
关注(0)|答案(1)|浏览(151)

当Map一个大文件时,我们如何控制RSS中的窗口?现在让我来解释一下我的意思。例如,我们有一个大文件,超过RAM的几倍,我们为几个进程做共享内存Map,如果我们访问某个对象,其虚拟地址位于这个Map的内存中,并捕捉到一个页面错误,然后从磁盘阅读,子问题是,如果我们不再使用给定的对象,会发生相反的情况吗?2如果这种情况像LRU一样发生,那么LRU的大小是多少?3如何控制它?4在这种情况下,页面缓存是如何参与的?
RSS graph
这是80 GB tar文件的测试示例(2个线程,8 GB RAM)的RSS图。这个3800 MB的值是从哪里来的,并且在Map后运行文件时保持稳定?我如何控制它(或者建议内核控制它)?

2ic8powd

2ic8powd1#

只要你没有采取明确的行动来锁定内存中的页面,它们最终应该会被自动换出。内核基本上使用内存压力启发式来决定多少物理内存用于换入的页面,并根据需要频繁地重新平衡。
如果您想在控制此过程中扮演更积极的角色,请查看madvise() system call
这允许您调整mmap的分页算法,操作如下:

  • MADV_FREE(自Linux 4.5起)
  • 应用程序不再需要addr和len指定范围内的页面。内核可以释放这些页面,但释放可能会延迟,直到出现内存压力。
  • MADV_COLD(自Linux 5.4起)
  • 停用给定范围的页。这将使这些页更有可能成为内存压力的回收目标。
  • MADV_SEQUENTIAL
  • 预期页引用是按顺序的。(因此,给定范围内的页可以被积极地预读,并且可以在访问之后很快被释放。)
  • MADV_WILLNEED
  • 期待在不久的将来访问。(因此,提前阅读一些页面可能是个好主意。)
  • MADV_DONTNEED
  • 不要期望在不久的将来访问它。(目前,应用程序已经完成了给定的范围,因此内核可以释放与之相关的资源。)

创建mmap后发出madvise(MADV_SEQUENTIAL)可能足以获得可接受的行为。如果不能,您还可以在遍历过程中传递页组时散布一些MADV_WILLNEED/MADV_DONTNEED访问提示(和/或MADV_FREE/MADV_COLD)。

相关问题