como detectar se isolcpus está ativado?

7

Como detectar se o isolcpus está ativado e em qual cpus, quando, por exemplo, você se conecta pela primeira vez em um servidor. Condições:

não gera nenhum processo para ver onde ele será migrado.

O caso de uso é que isolcpus=1-7 em um i7 de 6 núcleos parece não ativar o isolcpus na inicialização, e eu gostaria de saber se é possível ler /proc/ , /sys ou quaisquer elementos internos do kernel que possam ser lidos no userspace, para fornecer um status claro de ativação de isolcpus e quais CPUs estão em causa. Ou até mesmo ler configuração ativa do agendador que é o primeiro preocupado com isolcpus.

Considere que o tempo de atividade é tão grande que dmesg não exibe mais o log de inicialização para detectar qualquer erro na inicialização. Resposta básica como " veja a linha cmd do kernel " não será aceita :)

    
por netmonk 09.01.2017 / 16:04

3 respostas

10

O que você procura deve ser encontrado dentro

/sys/devices/system/cpu/isolated

e o inverso em

/sys/devices/system/cpu/present          // Thanks to John Swinck

A partir de drivers/base/cpu.c , vemos que a fonte exibida é a variável do kernel cpu_isolated_map :

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

e cpu_isolated_map é exatamente o que é definido por kernel/sched/core.c no boot:

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

Mas, como você observou, alguém poderia ter modificado a afinidade dos processos, incluindo os gerados pelo daemon, cron , systemd e assim por diante. Se isso acontecer, novos processos serão gerados herdando a máscara de afinidade modificada, não a definida por isolcpus .

Então, o que foi mencionado acima lhe dará isolcpus conforme solicitado, mas isso ainda pode não ser útil.

Supondo que você descubra que isolcpus foi emitido, mas não "aceitou", esse comportamento indesejado poderia ser derivado por algum processo, percebendo que está vinculado apenas a CPU=0 , Acreditando que está no modo monoprocessador por engano, e tentando ajudar "acertar as coisas", redefinindo a máscara de afinidade. Se fosse esse o caso, você poderia tentar isolar o CPUS 0-5 em vez do 1-6, e ver se isso funciona.

    
por 18.01.2017 / 17:40
8

Uma das maneiras mais fáceis de detectar se isolcpus está consultando proc para ver quais parâmetros foram transmitidos para o kernel em tempo de execução.

Para isso, você usaria:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

Como você pode ver, neste exemplo em particular isolcpus=2,3 foi passado como um argumento para o kernel em execução.

Você também pode usar taskset apontado para o PID 1. Como o PID 1 é o PID padrão para a primeira tarefa lançada pelo kernel, podemos tomar uma boa indicação de que ele refletirá se temos isolcpus funcionando . Como em:

$taskset -cp 1
pid 1's current affinity list: 0,1

Comparando com o comando lscpu no mesmo servidor:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

Como pode ser visto, lscpu está mostrando 4 CPU / núcleos, enquanto taskset está mostrando apenas 0,1, então isso mostra que isolcpus está funcionando aqui.

Dê uma olhada em: Como garantir disponibilidade exclusiva da CPU para um processo em execução?

    
por 09.01.2017 / 17:56
1

Você pode verificar Cpus_allowed e Cpus_allowed_list para o processo de shell atual para ver quais CPUs foram reservadas

cat /proc/$$/status|tail -6

por exemplo,

Cpus_allowed_list:      0-1, 3-5

significa que o cpu = 2 foi reservado por isolcpus em um servidor de 6 cpus

    
por 18.01.2017 / 18:00

Tags