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 processoinit
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 comoocioso 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.