como detectar se o isolcpus está ativado?

15

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:

sem gerar nenhum processo para ver para onde será migrado.

O caso de uso é que, isolcpus=1-7em um i7 de 6 núcleos, parece não ativar o isolcpus na inicialização, e gostaria de saber se é possível /proc/, /sysou qualquer parte interna do kernel que possa ser lida no espaço do usuário, para fornecer um status claro de ativação do isolcpus e qual CPU está em causa. Ou mesmo leia a configuração ativa do agendador, que é a primeira a ser usada pelo isolcpus.

Considere que o tempo de atividade é tão grande que dmesgnão é mais necessário exibir 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 :)

netmonk
fonte
1
Você pode usar pidstat -C isolcpus. O pidstat é do sysstatpacote.
Timothy Pulliam
2
Pode ser imbecil, mas não vejo nenhum link entre pidstate isolcpus. Você pode elaborar um pouco mais?
Netmonk
Você diz que precisa saber em quais CPUs o comando está sendo executado. Não sei o que isolcpusé, mas pidstatposso lhe dizer em que CPU um processo está sendo executado se você passar a -C process_namebandeira. Por exemplo, pidstat -C topproduz o seguinte. 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
precisa saber é o seguinte
2
Ok, obrigado pela sua resposta. isolcpusé um parâmetro do kernel que força o agendador a não migrar nenhum processo sozinho, se eles estiverem isolados. Por exemplo, em servidores de 8 cpu, isolcpus=1-7na linha de comando do kernel, forçará todo o processo gerado bifurcado pelo init e qualquer tipo de comando no shell para executar apenas na CPU0. Para executar uma tarefa em uma CPU isolada, é necessário iniciá-la com, tasksetpor exemplo. Então, com relação ao que estou perguntando, parece que sua resposta está fora de tópico. Obrigado de qualquer maneira para tentar me responder
netmonk
1
Algo assim realmente não deve ser difícil ....
user997112 16/01

Respostas:

17

O que você procura deve ser encontrado dentro deste arquivo virtual:

/sys/devices/system/cpu/isolated

e o inverso em

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

Vimos drivers/base/cpu.cque 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 kernel/sched/core.cna inicialização:

/* 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 de processos, incluindo os gerados por daemon cron, systemde assim por diante. Se isso acontecer, novos processos serão gerados herdando a máscara de afinidade modificada, não a definida por isolcpus.

Portanto, o descrito acima fornecerá o isolcpusque você solicitou, mas isso ainda pode não ser útil.

Supondo que você descubra que isolcpusfoi emitido, mas não "aceitou", esse comportamento indesejado pode ser derivado por algum processo, percebendo que ele está vinculado apenas CPU=0, acreditando que ele está no modo monoprocessador por engano e tentando "definir coisas" direita "redefinindo a máscara de afinidade. Se for esse o caso, você pode tentar isolar o CPUS 0-5 em vez de 1-6 e verificar se isso funciona.

LSerni
fonte
1
Testado no Centos 7.x, observe que /sys/devices/system/cpu/possiblenão parece ser o 'reverso', dependendo de como você interpreta 'reverso'. Por exemplo, se .../cpu/isolatedretorna 2,4porque eles foram isolados, .../cpu/possibleretornaria 0-191.
precisa saber é
1
Eu acho que a maioria das pessoas quer /sys/devices/system/cpu/presentquais programas mostram quais CPUs existem, e não /sys/devices/system/cpu/possiblequais programas podem existir (mas podem não existir atualmente). Em alguns sistemas, eles são iguais, mas mesmo em uma área de trabalho bastante básica que eu verifiquei, eles não são.
John Zwinck 6/03/19
@JohnZwinck good catch. resposta de alteração
LSerni 6/03/19
1
Com isolcpus = 0 e 4 núcleos, estou ficando / isolado = 0 e / presente = 0-3.
Stefan Reich
10

Uma das maneiras mais fáceis de detectar se isolcpusé consultar procpara ver quais parâmetros foram passados ​​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,3foi passado como argumento para o kernel em execução.

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

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

Comparando com o lscpucomando 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, lscpuestá mostrando 4 CPU / núcleos, enquanto tasksetestá mostrando apenas 0,1, então isso mostra que isolcpusestá funcionando aqui.

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

Rui F Ribeiro
fonte
Obrigado, senhor, pela resposta, mas não aceito. Eu especifiquei que a resposta falando sobre a linha de comando do kernel não será aceita. Eu obviamente sei /proc/cmdlinequal é a cópia exata do conteúdo do grub.confarquivo. Não foi isso que eu pedi! Obrigado mesmo assim !
Netmonk
Eu adicionei à resposta.
Rui F Ribeiro
1
O que alguém modificou anteriormente a afinidade do processo com o conjunto de tarefas? e se alguém definir a afinidade de init somente para a CPU 0, isso me fornecerá informações sobre a ativação ou não da CPU isolada?
Netmonk
1

Você pode verificar Cpus_allowed e Cpus_allowed_list para o processo atual do shell para ver quais cpus foram reservados

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

por exemplo

Cpus_allowed_list:      0-1, 3-5

significa que a cpu = 2 foi reservada isolcpusem um servidor de 6 cpus

valentin
fonte
2
Na verdade não. Ele mostra o que as CPUs estão na máscara de afinidade herdada pelo processo atual do shell. Se fosse, digamos, sshe um tivesse limitado manualmente a afinidade do pai sshdà CPU 1, você sempre veria a CPU 1, independentemente de isolcpuster sido "tomada" ou não. A $$ramificação fornece os valores herdados do processo, não os originais do sistema.
precisa saber é o seguinte