我有一个数据结构,希望重新设计以进行按需分页。 mmap
似乎是一种运行一些初始实验的简单方法。不过,我想限制 mmap
使用的缓冲区缓存量。机器有足够的内存将整个数据结构分页到缓存中,但出于测试原因(以及某些生产原因),我不想允许它这样做。
是否有一种方法可以限制 mmap
使用的缓冲区缓存量?
或者,一种类似的 mmap
替代方案,可以实现类似的功能并仍然限制内存使用也可以。
madvise
可以给内核提供提示,但它不支持限制一个进程使用的缓存。您可以给它一些提示,如 MADV_DONTNEED
,这将减少其他应用程序缓存的压力,但我认为它会带来更多的伤害而不是好处,因为它很可能使缓存效率降低,从而导致总体上更多的IO负载。在测试期间,您可以使用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共享内存段,你将成为您的内存段的主人。
length
参数控制虚拟映射的大小,而不是在缓存 mmap 内容时使用的物理内存量。 - JaredC