Atribui um núcleo individual a um processo

4

O que estou tentando implementar é executar um script python em seu próprio núcleo no Raspberry Pi 2 com o Debian. Pode-se usar taskset para ligar um processo a um núcleo particular. Mas eu preciso que esse núcleo seja livre da carga do sistema operacional e de outros processos ao mesmo tempo. Como posso fazer isso?

    
por Leonid 29.05.2016 / 19:07

2 respostas

5

Esse tópico inteiro deve ser útil.

I would look for a way to limit the 'init' process to running on cpu 1.

Em geral, as últimas palavras devem estar "sendo executadas em todas as CPUs, exceto 1". Eu acho que é possível usar alguns parâmetros do kernel ; irqaffinity , isolcpus parece promissor.

EDITAR:

Sobre o isolcpus na documentação dos parâmetros do kernel :

This option is the preferred way to isolate CPUs. The alternative -- manually setting the CPU mask of all tasks in the system -- can cause problems and suboptimal load balancer performance.

Eu fiz alguns testes. Resultados:

  • O parâmetro isolcpus do kernel é o que você pode usar para limitar o processo init e isolar CPU (s).

  • Pareceu-me que o parâmetro do kernel irqaffinity não afetou a (s) CPU (s) isolada (s). Você provavelmente não precisa desse parâmetro.

  • Quando isolei CPU0 , ele não ficou completamente inativo. É esse requisito de sistema ou hardware para fazer alguma computação com ele, apesar do isolamento? - Eu não sei.

  • Quando isolei CPU1 ou CPU7 , era sólido como ocioso como uma rocha.

Para isolar CPU1 , adicione isolcpus=1 no seu grub.cfg , assim: linux /vmlinuz- (… todos os seus parâmetros atuais aqui…) isolcpus=1

RESPOSTA ORIGINAL CONTINUA:

Alternatively, after the system has started, you can re-assign the affinity of all currently running processes, but that seems less elegant.

Eu concordo que parece menos elegante, mas pode funcionar bem o suficiente (EDIT: pode causar problemas e desempenho do balanceador de carga abaixo do ideal, como dito acima). Há um one-liner rápido e sujo que funciona no meu Debian:

sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'

Eu tenho erros para alguns pid , no entanto htop mostra que um núcleo está virtualmente ocioso depois disso. É claro que você tem que executar seu script mais tarde, excluí-lo de alguma forma ou simplesmente reatribuir:

taskset -a -p 1 PID

Espero que não seja necessário repetir o one-liner para cobrir novos processos, pois a afinidade da CPU é herdada.

    
por 30.05.2016 / 11:26
3

Com o pacote Cpuset:

# cset shield -c 42 -k on

para reservar CPU # 42 para sua tarefa (você pode reservar um grupo de CPUs), então

# cset shield -e your_script

para iniciar your_script em suas CPUs reservadas. (Veja também as opções --user e --group .)

Quando terminar, solte as CPUs ("redefina a blindagem") com:

# cset shield -r

Há muito, muito mais para essa ferramenta. Por exemplo, anexando um processo anteriormente em execução à CPU reservada:

# cset shield -s -p <PID> --threads

Ajuda da linha de comando:

# cset help

Ajuda / tutorial on-line

    
por 30.05.2016 / 15:44