使用cgroup限制virtualbox的内存使用

使用cgroup限制virtualbox的内存使用

我试图使用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

我试图让它像这样工作:

  1. 在内存层次结构下创建新的 cgroup:

    $ cgcreate -g memory:vbox
    
  2. 为 vbox 设置 memory.limit_in_bytes:

    $ cgset -r memory.limit_in_bytes=512M vbox
    
  3. 将运行 pid 的 vbox 分组到 vbox:

    $ cgclassify -g memory:vbox 20015
    

有人可以解释为什么这不起作用吗?

答案1

您可以在您放置的文件中使用 /etc/security/limits.conf 限制内存使用:

domain type item value

其中 是domain@groupnametypehardsofthard任何情况下都不能超过的限制。

item项目字段指定受限制的项目类型。例子包括core(核心文件的大小)、data(程序数据区的大小)、fsize(用户创建的文件的大小)、nofile(打开的数据文件的数量)、rss(驻留集) size)、stack(堆栈大小)、cpu(单个进程的CPU时间,以分钟为单位)、nproc(并发进程数)、maxlogins(同时登录数)和priority(进程优先级)。数据、RSS 和堆栈项都与程序消耗的内存相关。这些和其他数据容量度量均以千字节为单位。

与您选择的字段value相关item,例如,如果您cpu在该item字段中选择并输入2then value,则万一domain(您的 VirtualBox 组)占用的 CPU 时间超过了2cpu 时间,它将被终止。

您也可以使用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/taskscgclassifyecho

相关内容