繁体   English   中英

限制用于mmap的缓冲区缓存

[英]Limit buffer cache used for mmap

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

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

另外,可以实现类似效果但仍限制内存使用的mmap替代方案也可以工作。

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

madvise地给内核提示,但是它不支持限制用于一个进程的高速缓存。 您可以给它一些提示,例如MADV_DONTNEED ,它将减少其他应用程序的缓存压力,但是我希望它弊大于利,因为它很可能使缓存效率降低,从而导致更多的IO负载。在系统上。

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

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

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

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

如果您希望保留内存映射,则也可以仅映射文件在内存中的一部分,而在超出内存配额时取消映射其他部分。 它也具有与显式文件IO操作相同的问题(更多的实现工作和不费吹灰之力的调整才能找到一个好的缓存策略)。

话虽如此,您可能会对限制缓存使用的要求提出质疑。 我希望内核能够很好地分配内存资源。 至少,它可能会比我所介绍的解决方案更好。 (显式文件IO加上内部缓存可能很快,但是实现和调整却并非易事。这里是权衡的比较: mmap()与读取块 。)

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

通过使用mmap()Linux Control Groups (更一般地, 在此在此 ),可以实现此目的 安装之后,您就可以对进程使用的物理内存量进行任意限制。 例如,在这里我们将物理内存限制为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

我会一次只走文件的地图部分的路线,因此您可以完全控制使用多少内存。

您可以使用ipc共享内存段,您将成为内存段的主控者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM