我有一个数据结构,我想按需翻页进行返工。 mmap
似乎是进行一些初步实验的简单方法。但是,我想限制mmap
使用的缓冲区缓存量。该机器有足够的内存将整个数据结构分页到缓存中,但出于测试原因(以及一些生产原因),我不想让它这样做。
有没有办法限制mmap
使用的缓冲区缓存量?
或者,可以实现类似但仍然限制内存使用的mmap
替代方案也可以。
答案 0 :(得分:3)
根据我的理解,这是不可能的。内存映射由操作系统控制。内核将以最佳方式决定如何使用可用内存,但它总体上会查看系统。我不知道支持进程级缓存的配额(至少,我没有在Linux或BSD中看到过这样的API)。
有madvise
来提供内核提示,但它不支持限制用于一个进程的缓存。你可以给它MADV_DONTNEED
这样的提示,这将减少其他应用程序缓存的压力,但我认为它会带来更多弊大于利,因为它很可能会使缓存效率降低,这将导致更多地在系统上加载IO负载。
我只看到两种选择。 On正在尝试解决操作系统级别的问题,另一种是在应用程序级别上解决它。
在操作系统级别,我看到两个选项:
只留下一个选项,即查看应用程序级别。您可以使用显式文件系统操作,而不是使用内存映射文件。如果你需要完全控制缓冲区,我认为这是唯一可行的选择。它比内存映射工作更多,并且也不能保证其表现更好。
如果您希望保留内存映射,则还可以在内存中仅映射部分文件,并在超出内存配额时取消映射其他部分。它也有与显式文件IO操作相同的问题(更多的实现工作和非平凡的调优以找到一个好的缓存策略)。
话虽如此,您可以质疑限制缓存内存使用量的要求。我希望内核在以良好的方式分配内存资源方面做得非常好。至少,它可能比我描绘的解决方案更好。 (显式文件IO,加上内部缓存,可能很快,但实现和调整并不容易。这里是权衡的比较:mmap() vs. reading blocks。)
在测试期间,您可以使用ionice -c 3
和nice -n 20
运行应用程序,以减少对其他生产应用程序的影响。
还有一个名为nocache
的工具。我从未使用它,但在阅读其文档时,它似乎与您的问题有些相关。
答案 1 :(得分:1)
我一次只能查看文件的地图部分路径,这样您就可以完全控制确切使用的内存量。
答案 2 :(得分:0)
通过使用mmap()
和Linux Control Groups(更一般地,here或here),可以实现此目的。安装后,您可以对进程使用的物理内存量等创建任意限制。例如,这里我们将物理内存限制为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共享内存段,你将成为你的内存段的主人。