Para prefácio, estou usando o Debian Wheezy com o kernel 3.2 em um chipset AMD64. Minha máquina possui dois núcleos Xeon E5-2690. Eu configurei os parâmetros de inicialização para que todos os núcleos em uma CPU sejam dedicados a um único processo. Para fazer isso, configurei isolcpus = 8,9,10,11,12,13,14,15 no grub.
Por enquanto, tudo bem. Agora, digamos que eu queira usar as CPUs isoladas para um determinado comando, para ser simples, usarei apenas um loop infinito simples:
$ taskset -c 8-15 bash -c 'enquanto verdadeiro; faça eco Olá> / dev / null; feito' &
Até agora, o top 8 mostra que o núcleo 8 gira até quase 100% de utilização. Agora, digamos que eu lance esse comando novamente:
$ taskset -c 8-15 bash -c 'enquanto verdadeiro; faça eco Olá> / dev / null; feito' &
Agora, o topo mostra que os núcleos 9 a 15 permanecem ociosos e os dois processos estão compartilhando o núcleo 8. Se, em vez disso, eu fizer isso:
$ taskset -c 8 bash -c 'enquanto verdadeiro; faça eco Olá> / dev / null; feito' &
$ taskset -c 9 bash -c 'enquanto verdadeiro; faça eco Olá> / dev / null; feito' &
Os núcleos 8 e 9 obtêm 100% de utilização como deveriam. Isso se aplica apenas ao isolcpus porque o mesmo conjunto de tarefas com os núcleos 1 a 7 distribui adequadamente os processos pelos núcleos relevantes. Além disso, "taskset -p" mostra que a máscara de afinidade para os processos de 8 a 15 está definida corretamente. Parece que o planejador do kernel se recusa a usar qualquer coisa, exceto o núcleo mais baixo especificado em uma máscara de afinidade isolcpus.
Agora, normalmente, isso não seria um grande problema com os exemplos acima, basta especificar núcleos individuais para cada processo. No entanto, eu quero executar um aplicativo altamente multithread na CPU dedicada. Desejo especificar o conjunto principal e fazer com que o pool de threads seja usado automaticamente, sem a necessidade de redefinir individualmente a afinidade do processador para cada segmento individual gerado.
Alguém tem alguma idéia de como fazer com que o agendador me dê mais de um núcleo do conjunto isolcpu?