Como posso configurar o cgroups para compartilhar recursos entre os usuários?

11

Costumava haver uma opção de configuração do kernel chamada sched_user ou similar no cgroups. Isso permitiu (que eu saiba) a todos os usuários compartilharem de maneira justa os recursos do sistema. No 2.6.35, ele não está disponível. Existe uma maneira de configurar meu sistema para compartilhar automaticamente recursos de io / cpu / memory entre todos os usuários (incluindo o root?). Eu nunca montei um cgroup antes, existe um bom tutorial para fazer isso? Muito obrigado.

NightwishFan
fonte
Bem, fiz um loot no pacote cgroups-bin no Ubuntu e tenho certeza de que "faz isso" por padrão se eu apenas o instalar. Presumi que seria necessário configurar, no entanto, suponho que apenas se você tiver necessidades especiais. Eu testei executando o estresse com 2 threads de CPU na raiz e 2 no meu usuário e todos os 4 threads parecem compartilhar 50% no topo, o que me faz pensar que está funcionando. Isso pode "resolvê-lo" para mim, no entanto, se desejar algo mais claro para confirmar ou uma idéia melhor de como configurá-lo, obrigado novamente!
NightwishFan

Respostas:

12

A documentação do kernel fornece uma cobertura geral do cgroups com exemplos.

O cgroups-binpacote (que depende libcgroup1) já fornecido pela distribuição deve estar bem.

A configuração é feita editando os dois arquivos a seguir:

/etc/cgconfig.conf

Usado pelo libcgroup para definir grupos de controle, seus parâmetros e pontos de montagem.

/etc/cgrules.conf

Usado pelo libcgroup para definir os grupos de controle aos quais o processo pertence.

Esses arquivos de configuração já possuem exemplos, portanto, tente ajustá-los aos seus requisitos. As páginas do manual cobrem muito bem sua configuração.

Depois, inicie o gerenciador de carga de trabalho e o daemon de regras:

service cgconfig restart
service cgred restart

O gerenciador de carga de trabalho (cgconfig) é responsável por alocar os recursos.
Adicionando um novo processo ao gerente:

cgexec [-g <controllers>:<path>] command [args]

Incluindo um processo já em execução no gerenciador:

cgclassify [-g <controllers>:<path>] <pidlist>

Ou automaticamente, sobre o arquivo cgrules.conf e o CGroup Rules Daemon (cgred), que força todo processo recém-gerado no grupo especificado.


Exemplo /etc/cgconfig.conf:

group group1 {
    perm {
            task {
                    uid = alice;
                    gid = alice;
            }
            admin {
                    uid = root;
                    gid = root;
            }
    }

    cpu {
            cpu.shares = 500;
    }

}

group group2 {
    perm {
            task {
                    uid = bob;
                    gid = bob;
            }
            admin {
                    uid = root;
                    gid = root;
            }
    }

    cpu {
            cpu.shares = 500;
    }

}

mount {
    cpu = /dev/cgroups/cpu;
    cpuacct = /dev/cgroups/cpuacct;
}

Exemplo /etc/cgrules.conf:

alice            cpu             group1/
bob              cpu             group2/

Isso compartilhará os recursos da CPU entre 50 e 50 entre o usuário 'alice' e 'bob'

abanar
fonte
Aprendendo cgroups, marcou isso como favorito. Obrigado.
Jigar