Para começar, estou usando o Debian Wheezy com o kernel 3.2 em um chipset AMD64. Minha máquina tem dois núcleos Xeon E5-2690. Eu configuro os parâmetros de inicialização para que todos os núcleos em uma CPU sejam dedicados a um único processo. Para fazer isso eu coloquei isolcpus = 8,9,10,11,12,13,14,15 no grub.
Até agora, tudo bem. Agora vamos dizer que eu quero usar as CPUs isoladas para um dado comando, para ser simples eu vou usar apenas um loop infinito simples:
$ taskset -c 8-15 bash -c 'enquanto verdadeiro; do echo ola > / dev / null; feito '&
Até aí tudo bem, o top mostra que o core 8 gira até quase 100% de utilização. Agora, digamos que eu inicie esse comando novamente:
$ taskset -c 8-15 bash -c 'enquanto verdadeiro; do echo ola > / dev / null; feito '&
Agora o top mostra que os núcleos 9-15 permanecem inativos e os dois processos estão compartilhando o núcleo 8. Se eu fizer isso:
$ taskset -c 8 bash -c 'while true; do echo ola > / dev / null; feito '&
$ taskset -c 9 bash -c 'while true; do echo ola > / dev / null; feito '&
Os núcleos 8 e 9 recebem 100% de utilização como deveriam. Isso se aplica somente ao isolcpus, porque o mesmo conjunto de tarefas com os núcleos 1-7 propaga adequadamente os processos sobre os núcleos relevantes. Além disso, "taskset -p" mostra que a máscara de afinidade para os processos 8-15 está definida corretamente. Parece que o agendador de kernel se recusa a usar qualquer coisa, exceto o núcleo mais baixo especificado em uma máscara de afinidade de isolcpus.
Agora, normalmente, isso não seria um grande problema com meus exemplos acima, apenas especifique núcleos individuais para cada processo. No entanto, quero executar um aplicativo altamente multithread na CPU dedicada. Eu quero especificar o conjunto principal e ter o pool de segmentos automaticamente usado, sem precisar redefinir individualmente a afinidade do processador para cada thread individual gerada.
Alguém tem alguma idéia de como obter o agendador para me dar mais de um núcleo do conjunto isolcpu?