다른 사람들이 이미 지적했듯이, 우리는 그 스크린 샷에서 너무 열심히 작동하는 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를 수행하는 방법을 보여 주어야하며 커널 스레드 등에 친화력을 명시 적으로 설정하지 않아야한다고 생각합니다.