限制每个进程的物理内存

Limit physical memory per process

本文关键字:物理内存 进程      更新时间:2023-10-16

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

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

是否有一种方法可以做同样的事情,但是每个进程限制。我看过ulimit,但它只限制每个进程的虚拟内存。有什么想法吗(也许我甚至可以在我的c++代码中以编程方式设置它)?

您可以尝试使用'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。注意,该限制适用于分配给该c组的所有进程的总和。

从现在开始,进程被限制为10MB的物理内存和12MB的物理+交换空间。

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

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

cgroup是在你fork/exec的时候被继承的,所以如果你从启动你的程序的地方添加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手册页中。)