cset como não raiz para definir a afinidade da CPU para processos em execução

1

Eu tenho jogado com cset para definir a afinidade da CPU para processos em execução. Estou recriando a função interna "blindagem" manualmente com set e proc, para adicionar alguns subconjuntos para threads específicos do meu aplicativo. Eu tenho um script bash que está chamando cset para criar os conjuntos e mover os segmentos corretos para os conjuntos corretos. Funciona quando executado com o sudo.

Agora eu gostaria de tornar esse script executável por outro usuário, que não possui poderes de sudo. Confio neste usuário o suficiente para ser responsável pelo cset, mas não quero abrir os amplos poderes do root.

Eu pensei que CAP_SYS_NICE - que é necessário para sched_setaffinity, que eu presumo que o cset deve usar - no script seria suficiente, mas não funcionou. Tentei estender CAP_SYS_NICE para o programa cset (que é um invólucro python fino para a biblioteca cset python). Sem dados. A saída de cap_to_text nos meus scripts CAP_SYS_NICE'd é "= cap_ipc_lock, cap_sys_nice, cap_sys_resource + eip" (possui ipc_lock e sys_resource por outros motivos; acho que apenas sys_nice é relevante).

Alguma ideia?

RaveTheTadpole
fonte
Coisa rápida ... Que distribuição é essa?
ewwhite
@ewwhite Estou usando o RHEL 6.2. Caso alguém mais queira saber, é o cset v1.5.6, mas eu poderia mudar isso.
RaveTheTadpole

Respostas:

1

Em vez disso, apenas dê a esse usuário permissão sudo restrita para executar apenas esse script, por exemplo:

bob ALL=(root) NOPASSWD: /usr/local/bin/cset.sh

Remova NOPASSWD:se você deseja que o usuário se autentique com sua senha.

mgorven
fonte
Obrigado, isso faz muito sentido. Eu tinha esquecido que esse sudo limitado era possível. (Você pode dizer que não trabalho muito com o administrador de sistemas?) E obrigado pelo exemplo.
RaveTheTadpole
1

Eu sempre pensei no cset como uma ferramenta SuSE. Eu o usei no RHEL no EL5, mas com o EL6, o cgroups é o método preferido para lidar com a blindagem.

Eu provavelmente seguiria a rota sudo, limitando o acesso aos comandos específicos necessários para colocar os processos de seus usuários no escudo.

ewwhite
fonte
+1 para cgroups. Eu não sabia que eles existiam e parecem ser o método preferido no RHEL 6. O RH fornece documentação no "Guia de gerenciamento de recursos". Quanto ao aspecto "como não raiz", vou marcar a marca de seleção verde mgorven, que veio com ele primeiro e com mais detalhes.
RaveTheTadpole
1

Enquanto o cgroups parece substituir o cset / cpusets (como o ewwhite disse), eu continuei com o método antigo de qualquer maneira, porque era mais familiar e ainda funciona.

Para a questão da permissão, meu problema específico foi resolvido usando primeiro o cset para criar uma árvore dentro de / cpusets com a qual eu sudo chown -R root:myusergroup /cpusets/mytreee sudo chmod -R g+rwX /cpusets/mytree. Depois disso, os usuários myusergrouppodem mover processos pela árvore echo $MYPID >> /cpusets/mytree/subtree/tasks. Infelizmente, o cset parece não funcionar sem permissão total em todos os / cpusets - acredito que ele tenta reler todo o diretório / cpusets toda vez que você executa um comando - então tive que recorrer a esse método manual de mover processos.

Não estou dizendo que é a solução ideal para todos, mas funcionou melhor com meus antecedentes e situação.

RaveTheTadpole
fonte