Perché 1 delle mie 24 CPU è ancorato al 100%?


12

Ho un sistema HP ProLiant DL380 G7 che utilizza 2 CPU a 6 core, con Hyper-threading abilitato, per un totale di 24 CPU logiche (come visto da Windows).

Quando si esegue la nostra applicazione, l'utilizzo totale della CPU del sistema è buono, ma uno dei 24 CUP è ancorato al 100%: inserisci qui la descrizione dell'immagine

Modifica: si tratta dei dati PerfMon per il processo di sistema durante questo periodo e per il processore con elevato utilizzo: inserisci qui la descrizione dell'immagine

È normale? In caso contrario, esiste un modo per identificare quali processi stanno utilizzando quella CPU logica? Windows PerfMon, ResMon, Task Manager ed Process Explorer non sono stati d'aiuto, se non quello di identificare che la CPU è al 100%.


29
La mia ipotesi sarebbe che è in uso perché un processo lo sta utilizzando.
HopelessN00b

1
Sai che puoi passare il mouse sopra il grafico e ottenere un suggerimento che ti dice quale processo sta prendendo più CPU su quel processore ?!
Lieven Keersmaekers,

Sarei sospettoso del delta di interruzione 100k. Dovresti pubblicare uno screenshot dell'elenco dei processi di Process Explorer in cui possiamo vedere cosa dice per cose come Sistema, DPC, Interruzioni.
Gabe,

@RyanRies; la nostra "applicazione" comprende numerosi servizi .Net WCF che anche WebSphere MQ e alcuni software di monitoraggio di terze parti.
Patrick Cuff,

2
È relativamente costoso spostare un processo da una CPU all'altra, rispetto a mantenerlo programmato sulla stessa CPU, quindi se un processo richiede davvero la CPU, il sistema operativo piuttosto spesso preferirà non spostarlo.
Michael Hampton

Risposte:


11

Come altri hanno già sottolineato, da quello screenshot possiamo vedere che la CPU che sta lavorando così duramente sta trascorrendo tutto il suo tempo in modalità kernel. (Il colore rosso.)

Eseguendo Powershell come amministratore, digitare:

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

Il processo in cima all'elenco è il processo che attualmente utilizza la maggior parte del tempo CPU in modalità kernel in questo momento. Se quel processo non è "Sistema", hai appena capito quale processo in modalità utente sta causando questo utilizzo della CPU. Se il processo con il tempo di processore privilegiato più alto è il sistema, che sospetto sia, allora è un po 'più complicato.

Apri Process Explorer. Facoltativamente, imposta il server dei simboli. Assicurati di eseguire con elevazione UAC completa. Fare clic con il tasto destro del mouse sul "processo" del sistema e andare su Proprietà. Quindi vai alla scheda Discussioni. Ordina i thread in base all'utilizzo della CPU. Il thread che sta causando tutto questo funzionamento in modalità kernel dovrebbe essere qui. Se guardi il modulo elencato in Indirizzo iniziale, dovrebbe darti un indizio su ciò a cui è correlato il lavoro. Se si tratta di NDIS.sys, ad esempio, si tratta di un driver di interfaccia di rete. Se imposti il ​​server dei simboli, dovresti vedere il nome di una funzione all'interno di un modulo (a meno che il modulo non sia Microsoft), altrimenti vedrai solo un offset numerico dall'indirizzo iniziale del modulo.

In alternativa, utilizzare Xperf dal Performance Toolkit di Windows per profilare interrupt, DPC, ecc.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

e interrompere la registrazione con xperf -d logfile.etl

Xperf sostituisce il vecchio strumento di Kernrate e può fornirti alcuni dati estremamente dettagliati.

Quando una CPU funziona in modalità kernel, esegue principalmente routine di servizio di interrupt. (ISR) Quando si verifica un interrupt, il lavoro in modalità utente viene sospeso su quel processore e la CPU esegue l'ISR registrato per quell'interrupt. Se si riscontra che la CPU impiega una quantità eccessiva di tempo su questi interrupt, ciò indica di solito un driver di dispositivo difettoso che deve essere aggiornato.

Ciò che mi infastidisce (nessun gioco di parole) su questo scenario è che sembra che qualsiasi thread del kernel che sta facendo questo sembra essere affine a quell'unico core. Mi chiedo perché il dispatcher sembra solo programmare il thread per essere eseguito su quello che sembra un nucleo arbitrario. Quindi ho la sensazione che dobbiamo trovare chiunque abbia scritto questo driver di dispositivo e mostrare loro come fare DPC con thread, e non impostare esplicitamente un'affinità sui thread del kernel, ecc.


IIRC, è un comportamento abbastanza standard per un sistema operativo utilizzare una sola CPU per gestire gli interrupt di processo ...
Massimo

1
@Massimo Questo potrebbe essere stato il caso dei vecchi sistemi operativi, ma non di più. Ogni CPU ottiene la propria tabella descrittiva di interrupt e ogni processore ha il proprio IRQL. Se una CPU è bloccata a un alto IRQL per qualche motivo (ovvero sta già eseguendo la manutenzione di un interrupt), non può ricevere interruzioni dello stesso livello o di livello inferiore e quindi Windows darà l'interruzione a un altro processore o semplicemente si aggrapperà ad essa fino a quando una CPU non sarà disponibile. Anche i timer (un oggetto precedentemente noto per essere eseguito solo su CPU0) ora hanno un algoritmo di selezione del processore.
Ryan Ries,

Ma sì, questo può essere semplice come eseguire un'app legacy o scritta male che è poco affinata e che successivamente crea un sacco di syscall. Gli interrupt di solito devono iniziare e terminare sulla stessa CPU da cui sono stati chiamati ... ma normalmente anche un'app a thread singolo verrebbe "bilanciata sul carico" tra i core durante l'esecuzione ... questa sembra avere una strana affinità.
Ryan Ries,

@RyanRies; Ho installato Windows Performance Toolkit sul sistema e utilizzato Windows Performance Recorder; il comando xperf sopra continuava a dare errori. La CPU alta sembra provenire da: Process - System; Modulo: ntoskrnl.exe; Discussione - Phase1Initialize; Funzione: KeZeroPages. Succede solo quando l'app è in esecuzione, quindi penso (spero) di avere abbastanza da riportare agli sviluppatori, ma sono anche interessato a qualsiasi idea tu possa avere.
Patrick Cuff,

23

Mostra la colonna "Tempo CPU" nella scheda "Dettagli" in "Task Manager" e cerca un processo con un conteggio del tempo della CPU in costante aumento. Questo è il tuo processo incuneato. Dovrebbe utilizzare costantemente circa il 4,17% di CPU.


10

Sembra essere tutto il tempo del kernel, potrebbero essere interruzioni, potrebbero essere gestite solo da una singola CPU.


+1 - Assomiglia sicuramente al tempo del kernel, no.
Evan Anderson,

Apparirà nel processo "Sistema"? I dati PerfMon raccolti durante una prova hanno CPU al 100% per il processo "Sistema".
Patrick Cuff,

Sì, penso che rientrerebbe nel sistema (se elencato affatto ...)
MichelZ,

6
Non potrebbe essere anche un bug del driver o un pezzo di hardware danneggiato che interagisce con un driver senza recupero errori? O forse il software chiama nel kernel in un ciclo stretto.
Zan Lynx,

1
@MichelZ, Un processo utente che effettua un sacco di chiamate di sistema (che includerebbe qualsiasi tipo di I / O) sarebbe simile a quello.
reirab

6

Cercare un processo con un utilizzo costante della CPU del ~ 4% (= 1/24 della CPU disponibile totale). Dovrebbe essere quello che occupa continuamente una singola CPU.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.