Usando apenas um núcleo de cpu

9

Eu preciso executar testes de desempenho para meu programa simultâneo e minha exigência é que ele seja executado em apenas um núcleo da CPU. (Eu não quero tópicos cooperativos - eu quero sempre ter uma alternância de contexto).

Então eu tenho duas perguntas:

  1. A melhor solução - Como assinar e reservar apenas um núcleo da CPU apenas para o meu programa (para forçar o sistema operacional a não usar esse núcleo da CPU). Eu acho que não é possível, mas talvez eu esteja errado ...

  2. Como definir o Linux (Fedora 24) para usar apenas um núcleo de CPU?

por peter55555 21.10.2016 / 11:06

1 resposta

24

No linux, a chamada do sistema para definir a afinidade da CPU para um processo é sched_setaffinity . Depois, há a taskset tool para fazer isso na linha de comando.

Para que esse único programa seja executado em apenas uma CPU, eu acho que você gostaria de algo como

taskset -c 1 ./myprogram

(defina qualquer número de CPU como argumento para a opção -c ).

Isso deve estar perto o suficiente de um sistema de processador único, contanto que seus outros processos não sejam muito executados em comparação com o que você deseja medir, ou que eles sejam programados para outras CPUs. Se você quiser dedicar uma CPU a esse único processo somente , e evitar que outros processos sejam executados nessa CPU, você também precisará definir sua afinidade.

Isso, eu não sei como fazer corretamente. Você precisaria definir a afinidade do processador de init bem no início do processo de inicialização para garantir que ele seja herdado em todos os processos do sistema. Como solução alternativa, você pode usar taskset -c -p 0 $PID para todos os outros processos para forçá-los a executar somente na CPU # 0.

O systemd também tem CPUAffinity= para controlar a afinidade em arquivos de unidade e há são um par de perguntas sobre a configuração da afinidade padrão aqui no unix.SE, mas não o fiz Não encontre nenhum com uma boa solução.

Embora @Kamil Maciorowski comentou e respondeu a outra pergunta no superuser.com , definindo isolcpus=1 na linha de comando do kernel deve "isolar essa CPU dos algoritmos de agendamento geral", o que é algo você pode querer.

    
por 21.10.2016 / 11:11