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-7
em um i7 de 6 núcleos, parece não ativar o isolcpus na inicialização, e gostaria de saber se é possível /proc/
, /sys
ou 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 dmesg
nã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 :)
pidstat -C isolcpus
. O pidstat é dosysstat
pacote.pidstat
eisolcpus
. Você pode elaborar um pouco mais?isolcpus
é, maspidstat
posso lhe dizer em que CPU um processo está sendo executado se você passar a-C process_name
bandeira. Por exemplo,pidstat -C top
produz 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
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-7
na 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,taskset
por 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 responderRespostas:
O que você procura deve ser encontrado dentro deste arquivo virtual:
e o inverso em
Vimos
drivers/base/cpu.c
que a fonte exibida é a variável do kernelcpu_isolated_map
:e
cpu_isolated_map
é exatamente o que é definidokernel/sched/core.c
na inicialização:Mas, como você observou, alguém poderia ter modificado a afinidade de processos, incluindo os gerados por 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 porisolcpus
.Portanto, o descrito acima fornecerá o
isolcpus
que você solicitou, mas isso ainda pode não ser útil.Supondo que você descubra que
isolcpus
foi emitido, mas não "aceitou", esse comportamento indesejado pode ser derivado por algum processo, percebendo que ele está vinculado apenasCPU=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.fonte
/sys/devices/system/cpu/possible
não parece ser o 'reverso', dependendo de como você interpreta 'reverso'. Por exemplo, se.../cpu/isolated
retorna2,4
porque eles foram isolados,.../cpu/possible
retornaria0-191
./sys/devices/system/cpu/present
quais programas mostram quais CPUs existem, e não/sys/devices/system/cpu/possible
quais 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.Uma das maneiras mais fáceis de detectar se
isolcpus
é consultarproc
para ver quais parâmetros foram passados para o kernel em tempo de execução.Para isso, você usaria:
Como você pode ver, neste exemplo em particular
isolcpus=2,3
foi passado como argumento para o kernel em execução.Você também pode usar o
taskset
PID 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 estamosisolcpus
trabalhando. Como em:Comparando com o
lscpu
comando no mesmo servidor:Como pode ser visto,
lscpu
está mostrando 4 CPU / núcleos, enquantotaskset
está mostrando apenas 0,1, então isso mostra queisolcpus
está funcionando aqui.Dê uma olhada em: Como garantir a disponibilidade exclusiva da CPU para um processo em execução?
fonte
/proc/cmdline
qual é a cópia exata do conteúdo dogrub.conf
arquivo. Não foi isso que eu pedi! Obrigado mesmo assim !Você pode verificar Cpus_allowed e Cpus_allowed_list para o processo atual do shell para ver quais cpus foram reservados
por exemplo
significa que a cpu = 2 foi reservada
isolcpus
em um servidor de 6 cpusfonte
ssh
e um tivesse limitado manualmente a afinidade do paisshd
à CPU 1, você sempre veria a CPU 1, independentemente deisolcpus
ter sido "tomada" ou não. A$$
ramificação fornece os valores herdados do processo, não os originais do sistema.