시스템 전체 (exclude_kernel == 0) PEBS 샘플을 모니터링하기 위해 Linux perf 도구를 사용하고 있습니다. PEBS 샘플이 인터럽트 컨텍스트에서 발생하는지 (즉, 인터럽트가 인터럽트 핸들러에 의해 처리되는 동안) 발생할 수 있는지 궁금합니다. 가능한 경우 PEBS 샘플 (즉, 레지스터 비트)의 컨텍스트 (예 : 프로세스 컨텍스트, 인터럽트 컨텍스트)를 결정할 수있는 방법이 있습니까?Intel PEBS 예제 컨텍스트
1
A
답변
0
인터럽트가 처리 될 때 PEBS 샘플링이 발생하지 않습니다..
PEBS는 위의 버퍼링 메커니즘을 사용하여 레코드를 저장합니다. PEBS buffer base
및 PEBS interrupt threshold
등 PEBS 인터럽트과 같은 모든 PEBS 관련 필드가 명확하게 표시됩니다. PEBS buffer index
이 PEBS interrupt threshold
과 일치 할 때 발생합니다.
PEBS 인터럽트 처리기는 PEBS Buffer Index
을 PEBS buffer base
의 시작 부분으로 다시 설정합니다. PEBS 샘플링이 계속되면 PEBS는 DS 버퍼에 액세스하여 PEBS Buffer Index
을 증가시킵니다. 따라서 PEBS 인터럽트와 PEBS는 모두 동일한 DS 저장 영역에 쓰기를 시도합니다. 이것은 분명히 경쟁 조건 PEBS 인터럽트 처리기와 PEBS 모듈 사이에 가리 킵니다.
이 경쟁 조건을 피하려면 PEBS 샘플링을 비활성화해야합니다 (IA32_PEBS_ENABLE
msr 레지스터의 플래그를 비활성화하여). 또한 모든 이벤트 카운터는 인터럽트 핸들러에 의해 비활성화되어야합니다. 이것은 커널에 proof입니다. 원인은 너무 많이 CPU에 조절PEBS 인터럽트 경우
그러나, 당신은 PERF_RECORD_THROTTLE 이벤트를 가질 수 있지만, 이것은 물론 오히려 아닌 PEBS_SAMPLE 이벤트하지만 PERF_RECORD 이벤트입니다.
귀하의 의견에서 PEBS 인터럽트 처리기가 제공 될 때 PEBS를 비활성화해야하는 것으로 보입니다. PEBS는 다른 인터럽트 핸들러와 충돌이 없으며 경쟁없이 인터럽트 컨텍스트에서 샘플을 생성 할 수 있습니다. 내가 틀렸다면 나를 바로 잡아라. –
PEBS는 다른 인터럽트 처리기와 충돌하지 않습니다. 내가 아는 한, PEBS 중 데이터 저장소 저장은 INIT, 프로세서 재설정 및 SMM (시스템 관리 모드) 또는 ia-32 모드로 이동할 때만 피할 수 있습니다. –