限制每个进程的物理内存

我正在写一个algorithm来执行一些外部存储器的计算,即你的input数据不适合主内存的地方,你必须考虑I / O的复杂性。

因为对于我的testing,我并不总是希望使用真正的input,我想限制可用于我的进程的内存量。 我发现的是,我可以设置mem内核参数来限制所有进程的物理内存(是正确的?)

有没有办法做到这一点,但每个进程的限制 。 我看到ulimit ,但它只限制每个进程的虚拟内存。 任何想法(也许我甚至可以从我的C ++代码编程)?

Solutions Collecting From Web of "限制每个进程的物理内存"

你可以试试'cgroups'。 要使用它们,以root身份键入以下命令。

 # mkdir /dev/cgroups # mount -t cgroup -omemory memory /dev/cgroups # mkdir /dev/cgroups/test # echo 10000000 > /dev/cgroups/test/memory.limit_in_bytes # echo 12000000 > /dev/cgroups/test/memory.memsw.limit_in_bytes # echo <PID> > /dev/cgroups/test/tasks 

您想要添加到cgroup的进程的PID在哪里? 请注意,限制适用于分配给此cgroup的所有进程的总和。

从这一刻开始,进程被限制在10MB的物理内存和12MB的物理+交换。

该目录中还有其他可调参数,但确切的列表将取决于您正在使用的内核版本。

你甚至可以创建限制的层次结构,只是创建子目录。

当你fork / exec的时候,cgroup是继承的,所以如果你从启动程序的地方添加shell到cgroup,它将被自动分配。

请注意,您可以将cgroups安装在您想要的任何目录中,而不仅仅是/ dev / cgroups。

我不能提供直接的答案,而是关于做这样的事情,我通常编写我自己的内存管理系统,以便我可以完全控制内存区域以及分配多少。 在编写微控制器时,这通常也是适用的。 希望能帮助到你。

我将使用带有RLIMIT_AS参数的setrlimti来设置虚拟内存的限制(这是ulimit的作用),然后让进程使用mlockall(MCL_CURRENT | MCL_FUTURE)强制内核错误进入物理RAM并锁定所有进程页面,这样虚拟数量==这个进程的物理内存量

你有没有考虑在某种虚拟环境中尝试你的代码? 虚拟机可能太多了,但是像User-Mode Linux这样的软件可能是非常合适的。 这将在您的常规操作系统内运行一个Linux内核作为一个单独的进程。 然后你可以提供一个单独的mem=内核设置,以及一个单独的交换空间来进行对照实验。

内核mem=引导参数限制了操作系统将使用多少内存。

这几乎从来不是用户想要的。

对于物理内存,RSS Rlimit又名RLIMIT_AS

正如其他海报已经表明,setrlimit是最可能的解决方案,它控制的过程环境的所有可配置方面的限制。 使用这个命令可以在你的shell进程中看到这些单独的设置:

 ulimit -a 

在结果输出中与您的方案最相关的内容如下所示:

 data seg size (kbytes, -d) unlimited max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited virtual memory (kbytes, -v) unlimited 

检查setrlimit手册页(“man setrlimit”),它可以从您的C / C ++代码以编程方式调用。 过去我已经使用它来控制堆栈大小限制。 (顺便说一句,没有专门的ulimit手册页,它实际上是一个嵌入的bash命令,所以它在bash手册页。)