[英]Limit buffer cache used for mmap
我有一个数据结构,我想重新设计以按需分页。 mmap
似乎是进行一些初始实验的简便方法。 但是,我想限制mmap
使用的缓冲区高速缓存的数量。 该机器有足够的内存来将整个数据结构分页到缓存中,但是出于测试原因(以及某些生产原因),我也不想允许它这样做。
有没有办法限制mmap
使用的缓冲区高速缓存的数量?
另外,可以实现类似效果但仍限制内存使用的mmap
替代方案也可以工作。
据我了解,这是不可能的。 内存映射由操作系统控制。 内核将决定如何以最佳方式使用可用内存,但它会从整体上看待系统。 我不知道在进程级别上支持缓存的配额(至少,我在Linux或BSD中没有看到这样的API)。
madvise
地给内核提示,但是它不支持限制用于一个进程的高速缓存。 您可以给它一些提示,例如MADV_DONTNEED
,它将减少其他应用程序的缓存压力,但是我希望它弊大于利,因为它很可能使缓存效率降低,从而导致更多的IO负载。在系统上。
我只看到两种选择。 一种尝试在操作系统级别解决该问题,另一种尝试在应用程序级别解决。
在操作系统级别,我看到两个选项:
剩下的只有一个选择,那就是查看应用程序级别。 您可以使用显式文件系统操作,而不是使用内存映射文件。 如果您需要完全控制缓冲区,那么我认为这是唯一可行的选择。 它比内存映射更多的工作,并且不能保证性能更好。
如果您希望保留内存映射,则也可以仅映射文件在内存中的一部分,而在超出内存配额时取消映射其他部分。 它也具有与显式文件IO操作相同的问题(更多的实现工作和不费吹灰之力的调整才能找到一个好的缓存策略)。
话虽如此,您可能会对限制缓存使用的要求提出质疑。 我希望内核能够很好地分配内存资源。 至少,它可能会比我所介绍的解决方案更好。 (显式文件IO加上内部缓存可能很快,但是实现和调整却并非易事。这里是权衡的比较: mmap()与读取块 。)
在测试期间,您可以使用ionice -c 3
和nice -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.