限制每个进程的物理内存

时间:2011-07-30 10:52:16

标签: c++ linux memory process linux-kernel

我正在编写一个算法来执行一些外部存储器计算,即输入数据不适合主存储器而你必须考虑I / O复杂性。

因为我的测试我并不总是想使用实际输入我想限制我的进程可用的内存量。我发现,我可以设置mem内核参数来限制所有进程的物理使用内存(这是正确的吗?)

有没有办法做同样的事情,但每个进程限制 。我见过ulimit,但它只限制每个进程的虚拟内存。任何想法(也许我甚至可以在我的C ++代码中以编程方式设置它)?

6 个答案:

答案 0 :(得分:11)

您可以尝试'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,它将自动分配。

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

答案 1 :(得分:5)

我无法提供直接的答案,但与做这些事情有关,我通常编写自己的内存管理系统,这样我就可以完全控制内存区域和分配的数量。当您为微控制器编写时,这通常是可以应用的。希望它有所帮助。

答案 2 :(得分:5)

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

答案 3 :(得分:2)

您是否考虑过在某种虚拟环境中尝试代码?虚拟机可能对您的需求太多,但User-Mode Linux之类的东西可能非常合适。这将Linux内核作为常规操作系统内的单个进程运行。然后,您可以提供单独的mem=内核设置,以及单独的交换空间来进行受控实验。

答案 4 :(得分:1)

内核mem=启动参数限制了操作系统将使用的内存量。

这几乎不是用户想要的。

对于物理内存,还有RSS rlimit aka RLIMIT_AS

答案 5 :(得分:1)

正如其他海报已经表明的那样,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手册页中。)