2017-07-25 96 views
8

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

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

或者,mmap替代方案可以实现类似的功能,但仍会限制内存使用情况。

+2

缓冲区缓存由内核自动维护。它本身不会导致内存不足错误。你为什么想自己控制它? – fukanchik

+0

@fukanchik由于我的环境,我必须确切知道我的进程将使用多少内存,并将其限制为此。另外,我有一台拥有100GB内存的机器,但我想测试软件,就好像机器只有1GB内存一样。 – JaredC

+0

我认为你最好的选择不是在应用程序内处理这个问题,而是在操作系统层面处理。这是一个很好的起点:https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process – Frank

回答

3

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

madvise提供内核提示,但它不支持限制用于一个进程的缓存。您可以给它一些暗示,例如MADV_DONTNEED,这将减少其他应用程序缓存的压力,但我认为它会造成更多的伤害而不是更好,因为它很可能会使缓存效率降低,这会导致更多的IO负载在系统上。

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

在OS层面上,我看到两个选项:

  1. 你可以运行一个虚拟机,但最有可能的,这是不是你想要的。我也希望它不会提高整个系统的性能。不过,这至少是一种定义内存消耗上限的方法。
  2. Docker是我想到的另一个想法,也是在操作系统级别上运行,但据我所知,它不支持在高速缓存上定义配额。我不认为它会起作用。

只留下一个选项,即查看应用程序级别。您可以使用显式的文件系统操作,而不是使用内存映射文件。如果你需要完全控制缓冲区,我认为这是唯一可行的选择。它比内存映射更多的工作,并且不保证性能更好。

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

话虽如此,你可能会质疑限制缓存内存使用的要求。我期望内核在分配内存资源方面做得非常好。至少,这可能会比我绘制的解决方案更好。 (显式文件IO加上一个内部缓存可能很快,但实现和调整并不是微不足道的,这里是对比的权衡:mmap() vs. reading blocks

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

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 
1

我会去在一个时刻的文件,只图件的途径,所以你可以保留在准确全面控制使用多少内存。

-1

您可能会使用ipc共享内存段,您将成为您的内存段的主人。