O Taskset não funciona em um intervalo de núcleos no isolcpus

9

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?

    
por user79126 04.02.2014 / 09:46

1 resposta

8

Depois de um dia de frustração, determinei uma solução. Este comportamento parece ser um artefato do algoritmo padrão do planejador de kernel (SCHED_OTHER para esta distribuição / kernel). Mudar o processo para um algoritmo diferente elimina o problema, isolcpus são utilizados adequadamente nos processos / threads.

Acabei usando SCHED_RR, mas também testei SCHED_FIFO e SCHED_IDLE, ambos parecem funcionar. O processo pode ser iniciado com o algoritmo alternativo usando o utilitário chrt:

$ sudo chrt -r 1 [comando]

(Se você quiser rodar como não-root, você pode usar o utilitário setcap para ativar CAP_SYS_NICE no arquivo binário relacionado ao comando)

    
por 05.02.2014 / 04:41