限制每个进程的物理内存

dcn*_*dcn 16 c++ linux memory process linux-kernel

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

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

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

rod*_*igo 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
Run Code Online (Sandbox Code Playgroud)

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

从现在开始,这些进程仅限于10MB的物理内存和12MB的物理内存+交换.

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

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

fork/exec时继承cgroup,因此如果将程序启动的shell添加到cgroup,它将自动分配.

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


Ver*_*ern 5

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


gby*_*gby 5

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