Para citar o anúncio do systemd de 2013 da nova interface do grupo de controle (com ênfase adicionada):
Observe que o número de atributos de cgroup atualmente expostos como propriedades de unidade é limitado. Isso será estendido mais tarde, à medida que suas interfaces de kernel forem limpas. Por exemplo , cpuset ou freezer não são expostos atualmente devido à semântica de herança quebrada da lógica do kernel. Além disso, a migração de unidades para uma fatia diferente em tempo de execução não é suportada (ou seja, alterar a propriedade Slice= para unidades em execução), pois o kernel atualmente não possui movimentos de subárvore de cgroup atômicos.
Então, o que está quebrado sobre a semântica de herança da lógica do kernel para cpuset
(e como essa falha não se aplica a outros controladores cgroup como cpu
)?
Há um artigo no site da RedHat dando uma solução não verificada de como usar cgroup cpusets no RHEL 7 apesar de sua falta de suporte como propriedades de unidade systemd fáceis de gerenciar... mas isso é mesmo uma boa ideia? A citação em negrito acima é preocupante.
Para colocar de outra forma, quais são as "pegadinhas" (armadilhas) que podem se aplicar ao uso do cgroup v1 cpuset que estão sendo referenciados aqui?
Estou começando uma recompensa por isso.
As possíveis fontes de informação para responder a esta pergunta (sem ordem especial) incluem:
- documentação do cgroup v1;
- código-fonte do kernel;
- Resultado dos testes;
- experiência do mundo real.
Um significado possível da linha em negrito na citação acima seria que quando um novo processo é bifurcado, ele não permanece no mesmo cgroup cpuset que seu pai, ou que está no mesmo cgroup, mas em algum tipo de status "não imposto" pelo qual ele pode realmente estar sendo executado em uma CPU diferente do que o cgroup permite. No entanto, isso é pura especulação da minha parte e preciso de uma resposta definitiva.
Eu não sou bem versado o suficiente com cgroups para dar uma resposta definitiva (e eu certamente não tenho experiência com cgroups desde 2013!), mas em um Ubuntu 16.04 baunilha cgroups v1 parece agir em conjunto:
Eu criei um pequeno teste que força a bifurcação como um usuário diferente usando um filho
sudo /bin/bash
desmembrado&
- o-H
sinalizador é uma paranóia extra para forçarsudo
a execução com o ambiente inicial do root.Isso rende:
Para referência, esta é a estrutura das montagens do cgroup no meu sistema:
Pelo menos um problema definitivo e não resolvido com cpusets está documentado no rastreador de bugs do kernel aqui:
Para citar um comentário do ticket (estou adicionando os hiperlinks aos commits reais e removendo o endereço de e-mail da IBM no caso de spambots):
O commit de correção (que foi posteriormente revertido) descreve bem o problema:
O mesmo problema de hotplug assimétrico é descrito com mais informações sobre como ele se relaciona com a herança, em:
Citando esse bilhete:
Embora possa haver outros problemas com o cpuset, o que foi dito acima é suficiente para entender e entender a afirmação de que o systemd não expõe ou utiliza o cpuset "devido à semântica de herança quebrada da lógica do kernel".
A partir desses dois relatórios de bugs, não apenas as CPUs não são adicionadas de volta a um cpuset após o reinício, mas mesmo quando são adicionados (manualmente), os processos nesse cgroup ainda serão deixados em execução em CPUs potencialmente não permitidas pelo cpuset.
Encontrei uma mensagem de Lennart Poettering que confirma diretamente isso como o motivo (negrito adicionado):
Em quarta-feira, 03/08/2016 às 16:56 +0200, Lennart Poettering escreveu:
Resposta realmente curta: O código não é multiprocessado bem, diferentes processos usam e liberam PIDs retornando-os ao pool antes que os PIDs de seus filhos terminem - deixando o upstream acreditar que os filhos do PID estão ativos, então pule esse PID, mas esse PID não deveria ter sido reeditado antes de encerrar as crianças. Em suma, fechaduras pobres.
Serviços, escopos e slices podem ser criados livremente pelo administrador ou dinamicamente por programas. Isso pode interferir na configuração de slices padrão pelo sistema operacional durante a inicialização.
Com Cgroups um processo e todos os seus filhos extraem recursos do grupo que o contém.
E muito mais... levando a uma longa resposta...
Várias pessoas expressaram suas preocupações:
" Os grupos de controle do Linux não são trabalhos " (2016) por Jonathan de Boyne Pollard:
Função TerminateJobObject()
Objetos de trabalho do Windows NT
A resposta oferecida na explicação de Jonathan é:
Siga os links acima para a explicação completa.
" Cgroups v2: gerenciamento de recursos feito ainda pior na segunda vez " (14 de outubro de 2016), por davmac:
Veja também os documentos do cgroup v2: " Problemas com v1 e Rationales for v2 ":
Consulte o link da seção 3 para obter mais informações.
Comunicação entre Lennart Poettering (systemd Developer) e Daniel P. Berrange (Redhat) em Wed, 20.07.16 12:53 recuperada dos arquivos systemd-devel intitulado: " [systemd-devel] Confining ALL process to a CPUs/RAM via cpuset controlador ":
I hope that clarifies things.