24 개의 CPU 중 1 개가 100 %로 페깅 된 이유는 무엇입니까?


12

하이퍼 스레딩이 활성화 된 2 개의 6 코어 CPU를 사용하는 HP ProLiant DL380 G7 시스템에 총 24 개의 논리 CPU가 있습니다 (Windows에서 볼 수 있음).

응용 프로그램을 실행할 때 총 시스템 CPU 사용률은 좋지만 24 개의 CUP 중 하나가 100 %로 고정되어 있습니다. 여기에 이미지 설명을 입력하십시오

편집 : 이 시간 동안 시스템 프로세스 및 활용률이 높은 프로세서에 대한 PerfMon 데이터입니다. 여기에 이미지 설명을 입력하십시오

이것이 정상입니까? 그렇지 않은 경우 해당 논리 CPU를 사용중인 프로세스를 식별하는 방법이 있습니까? Windows PerfMon, ResMon, 작업 관리자 및 프로세스 탐색기는 CPU가 100 %임을 식별하는 것 외에는 도움이되지 않았습니다.


29
프로세스가 사용하고 있기 때문에 사용 중이라고 생각합니다.
HopelessN00b

1
그래프 위로 마우스를 가져 가면 어떤 프로세서가 해당 프로세서에서 CPU를 가장 많이 사용하는지 알려주는 힌트를 얻을 수 있습니다!
Lieven Keersmaekers

100k 인터럽트 델타가 의심됩니다. 시스템, DPC, 인터럽트와 같은 내용을 볼 수있는 프로세스 탐색기 프로세스 목록 스크린 샷을 게시해야합니다.
Gabe

@RyanRies; "애플리케이션"은 WebSphere MQ 및 일부 타사 모니터링 소프트웨어 인 여러 .Net WCF 서비스로 구성됩니다.
Patrick Cuff

2
동일한 CPU에서 예약 된 상태를 유지하는 것과 비교하여 한 CPU에서 다른 CPU로 프로세스를 이동하는 것은 상대적으로 비용이 많이 들기 때문에 프로세스가 실제로 CPU를 요구하는 경우 OS는 프로세스를 옮기지 않는 것을 선호합니다.
Michael Hampton

답변:


11

다른 사람들이 이미 지적했듯이, 우리는 그 스크린 샷에서 너무 열심히 작동하는 CPU가 커널 모드에서 모든 시간을 보내고 있음을 알 수 있습니다. (빨간색)

관리자로 Powershell을 실행하려면 다음을 입력하십시오.

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

목록 맨 위에있는 프로세스는 현재 가장 많은 커널 모드 CPU 시간을 사용하는 프로세스입니다. 해당 프로세스가 "시스템" 이 아닌 경우이 CPU 사용을 유발하는 사용자 모드 프로세스를 파악했습니다. Privileged Processor Time이 가장 높은 프로세스가 시스템이라고 생각하면 조금 더 복잡합니다.

프로세스 탐색기를 엽니 다. 선택적으로 기호 서버를 설정하십시오. 전체 UAC 권한으로 실행 중인지 확인하십시오. 시스템 "프로세스"를 마우스 오른쪽 단추로 클릭하고 특성으로 이동하십시오. 그런 다음 스레드 탭으로 이동하십시오. CPU 사용량별로 스레드를 정렬하십시오. 이 모든 커널 모드 작동을 일으키는 스레드가 여기에 있어야합니다. 시작 주소 아래에 나열된 모듈을 보면 작업과 관련된 내용을 알 수 있습니다. 예를 들어 NDIS.sys라면 네트워크 인터페이스 드라이버입니다. 심볼 서버를 설정하면 모듈이 Microsoft가 아닌 경우를 제외하고 모듈 내에서 함수 이름이 표시되어야합니다. 그렇지 않으면 모듈의 시작 주소에서 숫자 오프셋이 표시됩니다.

또는 Windows Performance Toolkit에서 Xperf를 사용하여 인터럽트, DPC 등을 프로파일하십시오.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

와 녹음을 중지 xperf -d logfile.etl

Xperf는 이전 Kernrate 도구를 대체하며 매우 상세한 데이터를 얻을 수 있습니다.

CPU가 커널 모드에서 작업을 수행 할 때 대부분 인터럽트 서비스 루틴을 실행합니다. (ISR) 인터럽트가 발생하면 해당 프로세서에서 사용자 모드 작업이 일시 중단되고 CPU는 해당 인터럽트에 등록 된 ISR을 실행합니다. CPU가 이러한 인터럽트에 많은 시간을 소비하는 경우 일반적으로 업데이트해야하는 결함이있는 장치 드라이버를 나타냅니다.

이 시나리오에서 나에게 버그가되는 것은 (펑 의도하지 않은) 이것은이 작업을 수행하는 커널 스레드 가 하나의 코어에 친화 된 것처럼 보인다는 것 입니다. 디스패처가 스레드가 임의의 코어처럼 실행되도록 예약하는 이유가 궁금합니다. 따라서이 장치 드라이버를 작성한 사람을 찾아 스레드 DPC를 수행하는 방법을 보여 주어야하며 커널 스레드 등에 친화력을 명시 적으로 설정하지 않아야한다고 생각합니다.


IIRC, OS가 단일 CPU 만 사용하여 하드웨어 인터럽트를 처리하는 것은 매우 표준적인 행동입니다.
Massimo

1
@Massimo 이전 운영 체제의 경우 일 수 있지만 더 이상은 아닙니다. 모든 CPU에는 자체 인터럽트 설명자 테이블이 있으며 모든 프로세서에는 자체 IRQL이 있습니다. 어떤 이유로 하나의 CPU가 어떤 이유로 (즉, 이미 인터럽트를 처리하고있는) IRQL이 높은 경우 동일하거나 낮은 레벨의 인터럽트를 수신 할 수 없으므로 Windows는 다른 프로세서에 인터럽트를 주거나 보류합니다. CPU를 사용할 수있게 될 때까지 심지어 타이머 (이전에 CPU0에서만 실행되는 것으로 악명 높은 객체)에도 프로세서 선택 알고리즘이 있습니다.
Ryan Ries

그러나 예, 이것은 잘못 익숙한 레거시 또는 잘못 작성된 앱을 실행하는 것만 큼 간단 할 수 있으며 결과적으로 많은 시스템 콜을 만듭니다. 인터럽트는 일반적으로 호출 된 동일한 CPU에서 시작하고 끝나야합니다. 그러나 일반적으로 단일 스레드 응용 프로그램조차 코어가 실행될 때 "로드 균형 조정"될 것입니다. 유연.
Ryan Ries

@RyanRies; 시스템에 Windows Performance Toolkit을 설치하고 Windows Performance Recorder를 사용했습니다. 위의 xperf 명령은 계속 오류를 발생 시켰습니다. 높은 CPU는 다음과 같이 보입니다. Process-System; 모듈-ntoskrnl.exe; 글타래 (쓰레드)-Phase1Initialize; 기능-KeZeroPages. 앱이 실행될 때만 발생하므로 개발자에게 다시 가져갈만큼 충분하다고 생각하지만 아이디어가 있다면 관심이 있습니다.
Patrick Cuff

23

"작업 관리자"의 "세부 사항"탭에 "CPU 시간"열을 표시하고 꾸준히 증가하고있는 CPU 시간 수가있는 프로세스를 찾으십시오. 그것은 당신의 쐐기 과정입니다. 약 4.17 %의 CPU를 지속적으로 사용해야합니다.


10

모든 커널 시간 인 것 같고 인터럽트 일 수 있으며 단일 CPU로만 처리 될 수 있습니다.


+1-커널 시간처럼 보이지만 그렇지 않습니다.
Evan Anderson

"시스템"프로세스 아래에 나타 납니까? 테스트 실행 중에 수집 한 PerfMon 데이터에는 "시스템"프로세스에 대해 100 % CPU가 있습니다.
Patrick Cuff

그래, 난 (... 그것은 모두에 열거 된 경우) 그 시스템에 속하는 것이라고 생각
MichelZ

6
드라이버 버그이거나 오류 복구없이 드라이버와 상호 작용하는 나쁜 하드웨어 일 수 있습니까? 또는 소프트웨어가 타이트한 루프로 커널을 호출 할 수도 있습니다.
Zan Lynx

1
@MichelZ, 많은 시스템 호출 (모든 종류의 I / O 포함)을 만드는 사용자 프로세스는 다음과 같습니다.
reirab

6

CPU 사용률이 ~ 4 % (사용 가능한 총 CPU의 1/24) 인 프로세스를 찾으십시오. 그것은 지속적으로 단일 CPU를 차지하는 것이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.