限制用于mmap的缓冲区缓存

时间:2017-07-25 18:29:05

标签: c++ memory mmap

我有一个数据结构,我想按需翻页进行返工。 mmap似乎是进行一些初步实验的简单方法。但是,我想限制mmap使用的缓冲区缓存量。该机器有足够的内存将整个数据结构分页到缓存中,但出于测试原因(以及一些生产原因),我不想让它这样做。

有没有办法限制mmap使用的缓冲区缓存量?

或者,可以实现类似但仍然限制内存使用的mmap替代方案也可以。

4 个答案:

答案 0 :(得分:3)

根据我的理解,这是不可能的。内存映射由操作系统控制。内核将以最佳方式决定如何使用可用内存,但它总体上会查看系统。我不知道支持进程级缓存的配额(至少,我没有在Linux或BSD中看到过这样的API)。

madvise来提供内核提示,但它不支持限制用于一个进程的缓存。你可以给它MADV_DONTNEED这样的提示,这将减少其他应用程序缓存的压力,但我认为它会带来更多弊大于利,因为它很可能会使缓存效率降低,这将导致更多地在系统上加载IO负载。

我只看到两种选择。 On正在尝试解决操作系统级别的问题,另一种是在应用程序级别上解决它。

在操作系统级别,我看到两个选项:

  1. 您可以运行虚拟机,但很可能这不是您想要的。我也希望它不会提高整体系统性能。不过,它至少是一种定义内存消耗上限的方法。
  2. Docker是另一个想到的想法,也在操作系统级别上运行,但据我所知,它不支持在缓存上定义配额。我不认为它会起作用。
  3. 只留下一个选项,即查看应用程序级别。您可以使用显式文件系统操作,而不是使用内存映射文件。如果你需要完全控制缓冲区,我认为这是唯一可行的选择。它比内存映射工作更多,并且也不能保证其表现更好。

    如果您希望保留内存映射,则还可以在内存中仅映射部分文件,并在超出内存配额时取消映射其他部分。它也有与显式文件IO操作相同的问题(更多的实现工作和非平凡的调优以找到一个好的缓存策略)。

    话虽如此,您可以质疑限制缓存内存使用量的要求。我希望内核在以良好的方式分配内存资源方面做得非常好。至少,它可能比我描绘的解决方案更好。 (显式文件IO,加上内部缓存,可能很快,但实现和调整并不容易。这里是权衡的比较:mmap() vs. reading blocks。)

    在测试期间,您可以使用ionice -c 3nice -n 20运行应用程序,以减少对其他生产应用程序的影响。 还有一个名为nocache的工具。我从未使用它,但在阅读其文档时,它似乎与您的问题有些相关。

答案 1 :(得分:1)

我一次只能查看文件的地图部分路径,这样您就可以完全控制确切使用的内存量。

答案 2 :(得分:0)

通过使用mmap()Linux Control Groups(更一般地,herehere),可以实现此目的。安装后,您可以对进程使用的物理内存量等创建任意限制。例如,这里我们将物理内存限制为128兆,并将内存交换为256兆;

cgcreate -g memory:/limitMemory
echo $(( 128 * 1024 * 1024 )) > /sys/fs/cgroup/memory/limitMemory/memory.limit_in_bytes
echo $(( 256 * 1024 * 1024 )) > /sys/fs/cgroup/memory/limitMemory/memory.memsw.limit_in_bytes

答案 3 :(得分:0)

你可以使用ipc共享内存段,你将成为你的内存段的主人。