Dizendo ao kernel do Linux * não * para usar determinadas CPUs

8

Estou tentando executar alguns benchmarks em uma máquina com vários núcleos e gostaria de dizer ao kernel do Linux para simplesmente evitar certos núcleos, a menos que seja explicitamente instruído a usá-los.

A idéia é que eu possa reservar um punhado de núcleos (a máquina possui 6 núcleos físicos) para fazer benchmarking e usar a máscara da CPU para permitir apenas processos de benchmark nos núcleos fornecidos.

Isso é viável?

Lajos Nagy
fonte
Quais são os benchmarks reais que você deseja executar?
Basile Starynkevitch
Relacionado: Usando apenas um núcleo de CPU
ilkkachu 2/18

Respostas:

5

Você pode isolar alguns núcleos de CPU da programação do kernel usando o isolcpusparâmetro Adicione este parâmetro ao seu grub.conf e reinicie para entrar em vigor.

VenkatC
fonte
2
O link está morto. Talvez seja melhor incluir um exemplo diretamente na resposta.
Pchaigno
4

Você deseja alguma afinidade de processador (ou afinidade de CPU ).

O syscall relevante é sched_setaffinity (2) , mas você deve usá-lo através de pthread_set_affinity_np (3) se desejar codificar seus benchmarks para isso.

O comando relacionado é o conjunto de tarefas (1) e você pode usá-lo nos comandos que deseja comparar (ou no seu shell).

Se possível, verifique se a máquina não é carregada muito por outras tarefas não relacionadas ao benchmark.

Como alternativa, use algum hipervisor como o Xen e inicialize o Linux como um SO convidado para esse hipervisor. Em seguida, configure xenpara usar apenas um conjunto restrito de núcleos da CPU (não sei os detalhes exatos, você precisa descobrir). No Debian (e afins) distribuições, você pode instalar pacotes como xen-linux-system-amd64, xen-hypervisor-amd64, xen-utilsetc (estou usando no Debian / Sid xen-hypervisor-4.5-amd64, xen-linux-system-4.0.0-1-amd64, xen-utils-4.5 etc ...).

Talvez haja alguma maneira de configurar (talvez no momento da compilação do kernel, ou passando argumentos específicos para o kernel através do carregador Grub) seu kernel Linux para restringir o número de núcleos utilizáveis.

Claro, é melhor, quando o benchmarking alguns -por exemplo, programa em um desktop Linux PC-, tomar cuidado para evitar ter muitos processos externos em execução (use ps auxw, pstree -p, toppara encontrar estes). Pelo menos, feche e feche a maioria dos aplicativos interativos (navegador como Firefox, email, editor, IDEs como Eclipse) e mantenha apenas um pequeno número de terminais como referência. Você pode até referência no modo de lote (usando batchou atpara executar os benchmarks), enquanto você não está mesmo logado (por isso não tem nenhum sessões GUI à la Gnome ou KDE ou Xfce , etc ... em execução).

Basile Starynkevitch
fonte
Definir a afinidade das tarefas como referência não é suficiente. Você também deve manter outras tarefas afastadas. Qual é a sugestão do seu hipervisor, mas de uma maneira muito pesada.
Gilles 'SO- stop be evil'
@Gilles: por que manter outras tarefas necessárias para fins de benchmarking? Na prática, quando comparados, o PC geralmente fica ocioso ... Para um servidor caro, as coisas são diferentes!
Basile Starynkevitch
Por exemplo, porque você está comparando seu PC de mesa, que também gasta recursos no Firefox, Eclipse e outras tarefas altamente exigentes.
Gilles 'SO- stop be evil'
No seu próprio PC de mesa, você pode facilmente parar a maioria das tarefas que consomem (por exemplo, fechar e sair do firefox e eclipse) enquanto faz o benchmarking. Você pode até executar os benchmarks no modo em lote (usando atou batch) enquanto não estiver conectado (portanto, não execute nenhuma sessão consumidora).
Basile Starynkevitch