Por que 1 de minhas 24 CPUs está 100% indexado?

12

Eu tenho um sistema HP ProLiant DL380 G7 usando 2 CPUs de 6 núcleos, com o Hyper-threading ativado, para um total de 24 CPUs lógicas (como visto pelo Windows).

Ao executar nosso aplicativo, a utilização total da CPU do sistema é boa, mas um dos 24 CUPs está atrelado a 100%: insira a descrição da imagem aqui

Editar: esses são os dados do PerfMon para o processo do sistema durante esse período e para o processador com alta utilização: insira a descrição da imagem aqui

Isso é normal? Caso contrário, existe uma maneira de identificar quais processos estão usando essa CPU lógica? O Windows PerfMon, ResMon, Gerenciador de Tarefas e Process Explorer não ajudaram, além de identificar que a CPU está em 100%.

Patrick Cuff
fonte
29
Meu palpite seria que ele está sendo usado porque um processo está sendo usado.
HopelessN00b
1
Você sabe que pode passar o mouse sobre o gráfico e obter uma dica dizendo qual processo está consumindo mais CPU nesse processador ?!
Lieven Keersmaekers
Eu suspeitaria do delta de 100k de interrupção. Você deve publicar uma captura de tela da lista de processos do Process Explorer, onde podemos ver o que diz para coisas como Sistema, DPCs, Interrupções.
Gabe
@RyanRies; nosso "aplicativo" consiste em vários serviços .Net WCF que também WebSphere MQ e algum software de monitoramento de terceiros.
Patrick Cuff
2
É relativamente caro mover um processo de uma CPU para outra, em comparação com mantê-lo agendado na mesma CPU; portanto, se um processo realmente exige a CPU, o sistema operacional prefere não movê-lo.
Michael Hampton

Respostas:

11

Como outros já apontaram, podemos ver nessa captura de tela que a CPU que está trabalhando tanto está gastando todo o seu tempo no modo kernel. (A cor vermelha.)

Executando o Powershell como administrador, digite:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

O processo no topo da lista é o processo atualmente usando o tempo de CPU com mais kernel no momento. Se esse processo não for "Sistema", você acabou de descobrir qual processo do modo de usuário está causando esse uso da CPU. Se o processo com o maior tempo de processador privilegiado for System, que eu suspeito que seja, será um pouco mais complicado.

Abra o Process Explorer. Opcionalmente, configure seu servidor de símbolos. Verifique se você está executando com elevação total do UAC. Clique com o botão direito do mouse no "processo" do sistema e vá para Propriedades. Em seguida, vá para a guia Threads. Classifique os threads por uso da CPU. O thread que está causando todo esse trabalho no modo kernel deve estar aqui. Se você observar o módulo listado em Endereço inicial, ele deverá fornecer uma pista sobre o que o trabalho está relacionado. Se for NDIS.sys, por exemplo, esse é um driver de interface de rede. Se você configurar o servidor de símbolos, deverá ver o nome de uma função dentro de um módulo (a menos que o módulo não seja da Microsoft); caso contrário, verá apenas um deslocamento numérico do endereço inicial do módulo.

Como alternativa, use o Xperf do Windows Performance Toolkit para criar perfil de interrupções, DPCs, etc.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

e pare de gravar com xperf -d logfile.etl

O Xperf substitui a antiga ferramenta Kernrate e pode fornecer dados extremamente detalhados.

Quando uma CPU está trabalhando no modo kernel, geralmente executa rotinas de serviço de interrupção. (ISRs) Quando ocorre uma interrupção, o trabalho no modo de usuário é suspenso nesse processador e a CPU executa o ISR registrado para essa interrupção. Se você encontrar sua CPU gastando uma quantidade excessiva de tempo nessas interrupções, isso geralmente indica um driver de dispositivo com defeito que precisa ser atualizado.

O que me incomoda (sem trocadilhos) sobre esse cenário é que parece que qualquer thread do kernel que está fazendo isso parece estar afinizada nesse único núcleo. Eu me pergunto por que o expedidor parece apenas agendar o thread para executar nesse núcleo aparentemente arbitrário. Portanto, tenho a sensação de que precisamos encontrar quem escreveu esse driver de dispositivo e mostrar a eles como executar DPCs encadeados, e não definir explicitamente uma afinidade nos encadeamentos do kernel, etc.

Ryan Ries
fonte
IIRC, é um comportamento perfeitamente normal para um sistema operacional para usar apenas uma única CPU para interrupções de hardware punho ...
Massimo
1
@ Massimo Esse pode ter sido o caso de sistemas operacionais antigos, mas não mais. Toda CPU obtém sua própria tabela de descritores de interrupção e todo processador possui seu próprio IRQL. Se uma CPU estiver presa em um IRQL alto por algum motivo (por exemplo, já está atendendo a uma interrupção), ela não poderá receber interrupções de nível igual ou inferior e, portanto, o Windows interromperá o processo para outro processador ou apenas o manterá. até que uma CPU fique disponível. Até os temporizadores (um objeto anteriormente conhecido por ser executado apenas na CPU0) agora têm um algoritmo de seleção de processador.
Ryan Ries
Mas sim, isso pode ser tão simples quanto executar um aplicativo herdado ou mal escrito, pouco afinizado e, posteriormente, gerar muitos chamados. As interrupções geralmente precisam começar e terminar na mesma CPU a partir da qual foram chamadas ... mas normalmente até um aplicativo de thread único fica com "balanceamento de carga" entre os núcleos enquanto é executado ... esse parece ter um problema estranho afinidade.
Ryan Ries
@RyanRies; Instalei o Windows Performance Toolkit no sistema e usei o Windows Performance Recorder; o comando xperf acima continuou dando erros. A alta CPU parece que está vindo de: Process - System; Módulo - ntoskrnl.exe; Thread - Phase1Initialize; Função - KeZeroPages. Isso só acontece quando o aplicativo está sendo executado, então acho que (espero) tenho o suficiente para levar de volta aos desenvolvedores, mas também estou interessado em quaisquer idéias que você possa ter.
Patrick Cuff
23

Mostre a coluna "Tempo da CPU" na guia "Detalhes" em "Gerenciador de tarefas" e procure um processo com uma contagem de tempo da CPU que está aumentando constantemente. Esse é o seu processo em cunha. Ele deve usar cerca de 4,17% da CPU constantemente.

Evan Anderson
fonte
10

Parece que todo o tempo do Kernel pode ser interrompido, eles podem ser manipulados apenas por uma única CPU.

MichelZ
fonte
+1 - Com certeza parece o tempo do kernel, não é?
Evan Anderson
Isso apareceria no processo "Sistema"? Os dados do PerfMon que coletamos durante uma execução de teste têm 100% de CPU para o processo "Sistema".
Patrick Cuff
Sim, acho que cairia sob o sistema (se ele é listado em tudo ...)
MichelZ
6
Também não poderia ser um bug de driver ou um hardware ruim interagindo com um driver sem recuperação de erro? Ou talvez um software que chame o kernel em um loop apertado.
Zan Lynx
1
@MichelZ, um processo de usuário que faz várias chamadas de sistema (que incluem qualquer tipo de E / S) seria assim.
precisa
6

Procure um processo com uma utilização constante da CPU de ~ 4% (= 1/24 da CPU total disponível). Essa deve ser a que está continuamente ocupando uma única CPU.

Massimo
fonte