Use o cgroup para limitar o uso de memória do virtualbox

9

Estou tentando usar cgroup (Grupo de Controle) para limitar o uso de memória do VirtualBox, mas parece que não funciona.

Minha máquina é:

$ 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

Eu tentei fazer isso funcionar assim:

  1. Criando novos cgroups sob a hierarquia de memória:

    $ cgcreate -g memory:vbox
    
  2. Configurando memory.limit_in_bytes para o vbox:

    $ cgset -r memory.limit_in_bytes=512M vbox
    
  3. Agrupando o pid da execução do vbox ao vbox:

    $ cgclassify -g memory:vbox 20015
    

Alguém pode explicar por que isso não está funcionando?

    
por Gilles 19.08.2011 / 17:16

2 respostas

3

você pode limitar a memória usando /etc/security/limits.conf neste arquivo você coloca:

domain type item value

em que domain é o @groupname , type é hard ou soft , em que hard é o limite que não pode ser excedido em nenhuma circunstância.

item é o campo do item que especifica qual tipo de item está sendo limitado. Exemplos  Detalhes incluir núcleo (o tamanho dos arquivos principais), dados (o tamanho da área de dados de um programa), fsize (o tamanho de arquivos criados pelo usuário), nofile (o número de arquivos de dados abertos), rss (o tamanho do conjunto residente), pilha (o tamanho da pilha), cpu (o tempo de CPU de um único processo em minutos), nproc (o número de processos simultâneos), maxlogins (o número de logins simultâneos) e prioridade (o prioridade do processo). Os dados, rss e itens de pilha estão relacionados à memória consumida por um grama. Essas e outras medidas de capacidade de dados são medidas em kilobytes.

e value estão relacionados ao campo item que você escolheu, por exemplo, se você escolheu cpu no campo item e colocar 2 no value , caso a domain (você grupo de VirtualBox) é levar mais de 2 do tempo de CPU será terminado.

Você pode usar ulimit também, mas restringe-se apenas ao shell bash.

Espero que isso ajude você no seu objetivo, embora isso não seja feito com o método que você pediu.

    
por 27.11.2011 / 06:57
1

Eu estou supondo que há algo errado com o seu arquivo /etc/cgconfig.conf . Essa configuração funciona para mim:

[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

No entanto, em vez de usar os comandos cgreate e cgset , aconselho criar apenas um arquivo /etc/cgconfig.conf que incluiria essas configurações para que você não precise repetir o processo após cada reinicialização . No seu caso, o arquivo ficaria assim:

[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
    memory  = /cgroup/memory;
}

group vbox {
    memory {
        memory.limit_in_bytes="536870912";
    }
}

Agora, toda vez que você iniciar o serviço cgconfig , você terá seu vbox cgroup pronto. Tudo o que é necessário é mover o PID da caixa virtual para o arquivo /cgroups/memory/vbox/tasks usando cgclassify ou simplesmente echo o número desse arquivo.

    
por 07.06.2012 / 20:29