我试图使用cgroup
(Control Group)来限制virtualbox的内存使用量,但它似乎不起作用。
我的机器是:
$ uname -a
Linux fc.bgi 2.6.40-4.fc15.i686 #1 SMP Fri Jul 29 18:54:39 UTC 2011 i686 i686 i386 GNU/Linux
我试图让它像这样工作:
在内存层次结构下创建新的 cgroup:
$ cgcreate -g memory:vbox
为 vbox 设置 memory.limit_in_bytes:
$ cgset -r memory.limit_in_bytes=512M vbox
将运行 pid 的 vbox 分组到 vbox:
$ cgclassify -g memory:vbox 20015
有人可以解释为什么这不起作用吗?
答案1
您可以在您放置的文件中使用 /etc/security/limits.conf 限制内存使用:
domain type item value
其中 是domain
、@groupname
是type
或hard
是soft
在hard
任何情况下都不能超过的限制。
item
项目字段指定受限制的项目类型。例子包括core(核心文件的大小)、data(程序数据区的大小)、fsize(用户创建的文件的大小)、nofile(打开的数据文件的数量)、rss(驻留集) size)、stack(堆栈大小)、cpu(单个进程的CPU时间,以分钟为单位)、nproc(并发进程数)、maxlogins(同时登录数)和priority(进程优先级)。数据、RSS 和堆栈项都与程序消耗的内存相关。这些和其他数据容量度量均以千字节为单位。
与您选择的字段value
相关item
,例如,如果您cpu
在该item
字段中选择并输入2
then value
,则万一domain
(您的 VirtualBox 组)占用的 CPU 时间超过了2
cpu 时间,它将被终止。
您也可以使用ulimit
,但它仅限于 bash shell。
希望这可以帮助您实现目标,尽管它不是按照您要求的方法完成的。
答案2
我猜你的文件有问题/etc/cgconfig.conf
。这个设置对我有用:
[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
memory = /cgroup/memory;
}
[root@localhost cgroup]# service cgconfig start
Starting cgconfig service: [ OK ]
[root@localhost cgroup]# ls
memory
[root@localhost cgroup]# ls memory/
cgroup.event_control memory.limit_in_bytes memory.memsw.max_usage_in_bytes memory.soft_limit_in_bytes memory.use_hierarchy
cgroup.procs memory.max_usage_in_bytes memory.memsw.usage_in_bytes memory.stat notify_on_release
memory.failcnt memory.memsw.failcnt memory.move_charge_at_immigrate memory.swappiness release_agent
memory.force_empty memory.memsw.limit_in_bytes memory.oom_control memory.usage_in_bytes tasks
[root@localhost cgroup]# cgcreate -g memory:vbox
[root@localhost cgroup]# cgset -r memory.limit_in_bytes=512M vbox
[root@localhost cgroup]# cgclassify -g memory:vbox 11727
[root@localhost cgroup]# cat memory/vbox/tasks
11727
不过,我建议您不要使用cgreate
和命令,而是创建一个包含这些设置的文件,这样您就不必在每次重新启动后重复该过程。在您的情况下,该文件将如下所示:cgset
/etc/cgconfig.conf
[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
memory = /cgroup/memory;
}
group vbox {
memory {
memory.limit_in_bytes="536870912";
}
}
现在,每次启动服务时,vbox cgroup 都会准备就绪。只需使用或仅使用文件中的数字cgconfig
将 virtualbox 的 PID 移入文件中即可。/cgroups/memory/vbox/tasks
cgclassify
echo