Dlaczego 1 z moich 24 procesorów jest powiązany w 100%?

12

Mam system HP ProLiant DL380 G7 wykorzystujący 2 6-rdzeniowe procesory, z włączoną funkcją Hyper-Threading, w sumie 24 logiczne procesory (jak widać w systemie Windows).

Podczas uruchamiania naszej aplikacji całkowite wykorzystanie procesora przez system jest dobre, ale jeden z 24 CUP jest ustawiony na 100%: wprowadź opis zdjęcia tutaj

Edycja: To są dane PerfMon dla procesu systemowego w tym czasie i dla procesora o wysokim wykorzystaniu: wprowadź opis zdjęcia tutaj

Czy to normalne? Jeśli nie, to czy istnieje sposób na określenie, które procesy wykorzystują ten logiczny procesor? Windows PerfMon, ResMon, Menedżer zadań i Process Explorer nie pomogły poza ustaleniem, że procesor ma 100% mocy.

Patrick Mankiet
źródło
29
Domyślam się, że jest w użyciu, ponieważ proces go używa.
HopelessN00b
1
Wiesz, że możesz najechać kursorem na wykres i uzyskać podpowiedź, która proces wymaga najwięcej procesorów na tym procesorze ?!
Lieven Keersmaekers,
Byłbym podejrzliwy wobec delty przerwań 100k. Powinieneś opublikować zrzut ekranu listy procesów Process Explorer, w którym możemy zobaczyć, co mówi na temat takich rzeczy, jak System, DPC, Przerwania.
Gabe,
@RyanRies; nasza „aplikacja” składa się z kilku usług .Net WCF, które również WebSphere MQ i niektóre zewnętrzne oprogramowanie monitorujące.
Patrick Cuff,
2
Przenoszenie procesu z jednego procesora na inny jest stosunkowo drogie, w porównaniu do utrzymywania harmonogramu na tym samym procesorze, więc jeśli proces naprawdę wymaga procesora, system operacyjny często woli go nie przenosić.
Michael Hampton

Odpowiedzi:

11

Jak już zauważyli inni, z tego zrzutu ekranu widać, że tak ciężko pracujący procesor spędza cały czas w trybie jądra. (Kolor czerwony.)

Uruchamiając PowerShell jako administrator, wpisz:

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

Proces znajdujący się na górze listy jest obecnie procesem wykorzystującym obecnie najwięcej czasu procesora w trybie jądra. Jeśli ten proces nie jest „Systemowy”, właśnie zorientowałeś się, jaki proces trybu użytkownika powoduje użycie tego procesora. Jeśli proces z najwyższym uprzywilejowanym czasem procesora to System, co podejrzewam, że jest, to jest to trochę bardziej skomplikowane.

Otwórz Process Explorer. Opcjonalnie skonfiguruj serwer symboli. Upewnij się, że korzystasz z pełnej wysokości UAC. Kliknij prawym przyciskiem myszy „proces” systemu i przejdź do Właściwości. Następnie przejdź do zakładki Wątki. Sortuj wątki według zużycia procesora. Wątek, który powoduje cały ten tryb jądra powinien być tutaj. Jeśli spojrzysz na moduł wymieniony w polu Adres początkowy, powinien on dać ci wskazówkę, z czym praca jest związana. Jeśli na przykład jest to NDIS.sys, jest to sterownik interfejsu sieciowego. Jeśli skonfigurujesz serwer symboli, powinieneś zobaczyć nazwę funkcji w module (chyba że moduł jest inny niż Microsoft), w przeciwnym razie zobaczysz tylko numeryczne przesunięcie od adresu początkowego modułu.

Alternatywnie, użyj Xperf z Windows Performance Toolkit do profilowania przerwań, DPC itp.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

i zatrzymaj nagrywanie za pomocą xperf -d logfile.etl

Xperf zastępuje stare narzędzie Kernrate i może dostarczyć ci bardzo szczegółowe dane.

Gdy procesor pracuje w trybie jądra, przeważnie wykonuje procedury obsługi przerwań. (ISR) Gdy wystąpi przerwanie, praca w trybie użytkownika jest zawieszona na tym procesorze, a CPU uruchamia ISR zarejestrowany na tym przerwaniu. Jeśli zauważysz, że Twój procesor spędza nadmiernie dużo czasu na tych przerwaniach, zwykle oznacza to, że wadliwy sterownik urządzenia wymaga aktualizacji.

Co mnie jednak w tym scenariuszu wkurza (bez zamierzonej gry słów) to to, że wydaje się, że cokolwiek wątek jądra, który to robi, wydaje się być afinitowany do tego jednego rdzenia. Zastanawiam się, dlaczego dyspozytor wydaje się jedynie planować uruchamianie wątku na tym z pozoru arbitralnym rdzeniu. Mam więc wrażenie, że musimy znaleźć tego, kto napisał ten sterownik urządzenia i pokazać im, jak robić wątkowe DPC, a nie wyraźnie określać powinowactwo do wątków jądra itp.

Ryan Ries
źródło
IIRC, to dość standardowe zachowanie dla OS użyć tylko jednego procesora do przerwań sprzętowych uchwyt ...
Massimo
1
@Massimo Mogło tak być w przypadku starych systemów operacyjnych, ale już nie. Każdy procesor otrzymuje własną tablicę deskryptorów przerwań, a każdy procesor ma swój własny IRQL. Jeśli z jakiegoś powodu jeden procesor utknął na wysokim IRQL (tj. Już obsługuje przerwanie), nie może odbierać przerwań na tym samym lub niższym poziomie, więc system Windows albo przekaże przerwanie innemu procesorowi, albo po prostu go zatrzyma aż procesor stanie się dostępny. Nawet timery (obiekt wcześniej znany z działania tylko na CPU0) mają teraz algorytm wyboru procesora.
Ryan Ries
Ale tak, może to być tak proste, jak uruchomienie starszej lub źle napisanej aplikacji, która jest źle afinitowana, a następnie powoduje wiele wywołań systemowych. Przerwania zwykle muszą zaczynać się i kończyć na tym samym procesorze, z którego zostały wywołane ... ale normalnie nawet aplikacja jednowątkowa uzyskałaby „równoważenie obciążenia” między rdzeniami podczas pracy ... ta wydaje się mieć dziwne powinowactwo.
Ryan Ries
@RyanRies; Zainstalowałem Windows Performance Toolkit w systemie i korzystałem z Windows Performance Recorder; powyższe polecenie xperf ciągle dawało błędy. Wysoki procesor wygląda tak, jakby pochodził: Proces - System; Moduł - ntoskrnl.exe; Wątek - Phase1Initialize; Funkcja - KeZeroPages. Zdarza się to tylko wtedy, gdy aplikacja jest uruchomiona, więc myślę (mam nadzieję), że mam dość, aby wrócić do programistów, ale interesują mnie również wszelkie pomysły.
Patrick Cuff
23

Pokaż kolumnę „Czas procesora” na karcie „Szczegóły” w „Menedżerze zadań” i poszukaj procesu, w którym liczba procesorów stale rośnie. To twój kliniczny proces. Powinien stale używać około 4,17% procesora.

Evan Anderson
źródło
10

Wydaje się, że to cały czas jądra, mogą to być Przerwania, mogą być obsługiwane tylko przez jeden procesor.

MichelZ
źródło
+1 - Z pewnością wygląda jak czas jądra, prawda?
Evan Anderson
Czy pojawiłoby się to w ramach procesu „System”? Dane PerfMon, które zebraliśmy podczas testu, mają 100% procesora dla procesu „System”.
Patrick Cuff
Tak, myślę, że
objęłoby
6
Czy to nie może być błąd sterownika lub zły sprzęt współpracujący ze sterownikiem bez odzyskiwania po błędzie? A może oprogramowanie wywołuje jądro w ciasnej pętli.
Zan Lynx,
1
@MichelZ, proces użytkownika wykonujący wiele wywołań systemowych (które obejmowałyby wszelkiego rodzaju operacje wejścia / wyjścia) wyglądałby tak.
reirab
6

Poszukaj procesu ze stałym wykorzystaniem procesora ~ 4% (= 1/24 całkowitego dostępnego procesora). To powinien być ten, który stale zajmuje jeden procesor.

Massimo
źródło