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