Como desativar uma CPU

6

Estou tentando desativar algumas CPUs do meu servidor.
Encontrei este link: link , que me oferece um método como abaixo:

Aqui está o que o numactl --hardware me deu:

Eu quero desabilitar todas as CPUs de 16 a 63, então eu escrevo um script chamado opCPUs.sh como abaixo:

#!/bin/bash

for i in {16..63}; do
    if [[ "$1" == "enable" ]]; then
        echo 1 > /sys/devices/system/cpu/cpu$i/online
    elif [[ "$1" == "disable" ]]; then
        echo 0 > /sys/devices/system/cpu/cpu$i/online
    else
        echo 'illegal parameter'
    fi
done
grep "processor" /proc/cpuinfo

Então eu executo: ./opCPUs.sh disable e eu posso ver o resultado de grep no script:

Parecefuncionar.

Agora,achoquetodososprocessosdevemestarnaCPUde0a15,porqueoutrosforamdesativados.
Então,euusoosprocessosexistentesdbusparaverificarcomoabaixo:ps-Lopsr$(pgrepdbus)

Eureceboisto:

O psr me diz em qual CPU o processo está rodando, certo? Em caso afirmativo, eu desativei a CPU 60, CPU 52 etc, porque eles ainda estão aqui?

    
por Yves 17.01.2018 / 04:25

2 respostas

4

Além da resposta do @ Yves, você realmente pode usar o parâmetro do kernel isolcpus .

Para desativar a quarta CPU / core (CPU 3) com Debian ou Ubuntu:

Em /etc/default/grub adicionar isolcpus=3 a GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=3"

Executar

sudo update-grub

Reinicialize o servidor.

isolcpus — Isolate CPUs from the kernel scheduler.

Synopsis isolcpus= cpu_number [, cpu_number ,...]

Description Remove the specified CPUs, as defined by the cpu_number values, from the general kernel SMP balancing and scheduler algroithms. The only way to move a process onto or off an "isolated" CPU is via the CPU affinity syscalls. cpu_number begins at 0, so the maximum value is 1 less than the number of CPUs on the system.

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.

Curiosamente, o uso desses parâmetros do kernel pode reservar uma CPU para posteriormente usar a afinidade da CPU em um processo / fixar um processo em uma CPU e, portanto, garantir que não haja mais processos do usuário em execução nessa CPU .

Além disso, também pode tornar o servidor mais estável, garantindo que um processo específico com uma carga muito alta terá suas próprias CPUs para jogar. Eu vi Meru fazendo isso com seus controladores baseados em Linux antes de tomar conhecimento desta configuração.

O comando associado para designar um processo para a quarta CPU (CPU 3) é:

sudo taskset -cp PID

taskset is used to set or retrieve the CPU affinity of a running process given its PID or to launch a new COMMAND with a given CPU affinity. CPU affinity is a scheduler property that "bonds" a process to a given set of CPUs on the system. The Linux scheduler will honor the given CPU affinity and the process will not run on any other CPUs. Note that the Linux scheduler also supports natural CPU affinity: the scheduler attempts to keep processes on the same CPU as long as practical for performance reasons. Therefore, forcing a specific CPU affinity is useful only in certain applications.


SUMMARY

Existem várias técnicas aplicadas a esta questão:

set isolcpus = 4 no grub e reboot podem desativar a 5ª CPU / CPU 4 permanentemente para processos de terra do usuário;

echo 0 > /sys/devices/system/cpu/cpu4/online desativa a 5ª CPU / CPU 4, que continuará trabalhando nos processos que já foram atribuídos a ela, mas nenhum novo processo será atribuído à CPU 4;

taskset -c 3 ./MyShell.sh forçará MyShell.sh a ser atribuído à 4ª CPU / CPU 3, enquanto a 4ª CPU ainda pode aceitar outros processos de usuário se o isolcpus não o estiver excluindo de fazê-lo.

PS. Curiosamente, meu melhor exemplo de usar o isolcpus / taskset no campo, era um frontend SSL para um site muito ocupado , que ficava instável a cada duas semanas, onde Ansible / ssh não me deixaria mais remotamente.

Apliquei as técnicas discutidas acima e continuei trabalhando de uma forma muito estável desde então.

    
por 25.01.2018 / 11:27
5

Depois de fazer alguns testes, recebi os resultados abaixo:

echo 0 > /sys/devices/system/cpu/cpu4/online

desabilita a 4ª CPU.

"desativar a quarta CPU" significa que os processos posteriores não serão mais atribuídos à quarta CPU. Em outras palavras, os processos localizados na 4ª CPU antes de "desabilitar a 4ª CPU" não serão removidos da CPU enquanto a CPU estiver sendo desativada.

Dizendo que tenho quatro CPUs: 0, 1, 2 e 3. Assim, posso:

echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
./MyShell.sh

para forçar o ./MyShell.sh a ser atribuído à CPU0.

A propósito, a reinicialização ativará todos os processadores automaticamente.

    
por 25.01.2018 / 08:15