높은 컨텍스트 전환 속도
이 항목에서는 컨텍스트 전환이 자주 발생하는 스레드를 찾는 방법을 알아봅니다. 그러면 타이틀의 성능이 저하됩니다. 컨텍스트 전환은 스레드의 상태를 저장하여 나중에 실행을 재개하도록 복원하는 프로세스입니다. 스레드 간 빠른 컨텍스트 전환은 CPU 활용률 측면에서 비용이 많이 듭니다. 각 컨텍스트 전환는 커널을 처리하는 데 약 5μs(평균)가 소요됩니다. 그러나 캐시 누락으로 인해 발생하는 실행 시간은 정량화하기 어려운 추가 실행 시간을 추가로 발생시킵니다. 컨텍스트 전환 빈도가 높을수록 CPU 사용률이 저하됩니다. 각 타이틀은 다르지만, 합리적인 목표는 코어당 초당 1,000개 미만의 컨텍스트 전환을 갖는 것도록 하는 것입니다.
PIX
PIX는 제목에서 수행 중인 초당 컨텍스트 전환 수를 제공할 수 없지만 컨텍스트 전환 속도가 너무 높은 경우 이를 통해 매우 효과적으로 파악할 수 있습니다.
컨텍스트 전환 속도가 너무 높은 시기를 확인하는 방법
타이밍 캡처를 생성합니다. 자세한 내용은 일반 단계를 참조하세요.
타임라인 보기의 CPU 코어에 주목합니다(그림 1 참조). 빨간색 눈금선은 컨텍스트 전환을 나타냅니다. 이 경우 코어 1부터 5까지는 캡처의 전체 1초 동안 빨간색 실선으로 표시됩니다. 이것은 극단적인 예이지만, 빨간색 밀도가 높은 영역은 제목에 컨텍스트 전환이 너무 많다는 것을 나타냅니다.
그림 1. PIX 타이밍 캡처 - 컨텍스트 전환 수가 매우 많은 CPU 코어를 보여 줍니다.
한 프레임을 확대하여 검사합니다(그림 2 참조). 이 예는 30ms에 불과합니다. 대부분의 타임라인은 완전히 빨간색으로 보이는데, 이는 많은 빠른 컨텍스트 전환을 나타냅니다. 이처럼 빨간색 타임라인은 컨텍스트 전환율이 너무 높다는 강력한 지표입니다.
그림 2. 많은 수의 컨텍스트 전환을 보여주는 타이밍 캡처의 30ms 섹션으로 확대합니다.
표시할 항목에서 컨텍스트 전환을 선택한 다음 범위 세부 정보 탭을 확인합니다(그림 3 참조). 여기서 선택한 시간 범위에서 발생한 컨텍스트 전환 목록을 볼 수 있습니다. 이 보기를 통해 타이밍 캡처에서 특정 컨텍스트 전환을 선택하고 조사할 수 있습니다.
그림 3. 타이밍 캡처의 컨텍스트 전환 목록을 표시하는 PIX 범위 세부 정보 탭입니다.
컨텍스트 전환을 선택한 다음 요소 세부 정보 패널을 검사하여 이러한 스레드가 컨텍스트 전환되는 이유를 확인할 수 있습니다.
WPA(Windows Performance Analyzer)
WPA를 사용하여 컨텍스트 전환의 비율을 평가하는 데 사용할 수 있는 가장 좋은 창은 프로세스, 스레드별 CPU 사용량(정밀) 컨텍스트 전환 개수입니다(그림 4 참조).
ThreadContextSwitch.wpaProfile
WPA 프로필의 일부입니다. 그림 4의 그래프는 그래프의 가시적인 부분을 기준으로 컨텍스트 전환의 비율을 보여 줍니다. 확대하면 그래프의 점을 생성하는 데 사용되는 시간 범위가 변경되기 때문에 표시되는 양이 중요합니다. 이 그래프를 사용하면 컨텍스트 전환 수가 급증하는 기간을 식별할 수 있습니다. 이 표는 해당 기간 동안 발생한 상황에 초점을 맞추어 발생한 컨텍스트 전환 수를 확인하는 데 도움이 됩니다.
WPA를 사용하여 높은 컨텍스트 전환 스레드를 찾으려면
이벤트 추적 로그(ETL) 파일을 생성합니다. 자세한 내용은 일반 단계를 참조하세요.
일반 단계에 설명된 대로
ThreadContextSwitch.wpaProfile
WPA 프로필을 적용합니다. 그림 4는 새로운 분석 탭의 모양을 보여줍니다.그림 4. 그림 4: 프로세스별 WPA CPU 사용량(정밀) 컨텍스트 전환 수, 컨텍스트 전환 수가 높은 스레드 보기
참고 항목
그림 4의 시스템에 CPU 리소스의 1.34%를 사용하는 컨텍스트 전환이 상당히 많이 있을 수도 있습니다. 이는 ETL 데이터 수집에 따른 오버헤드 때문입니다. ETL 이벤트는 간단하지만 추적은 여전히 모든 컨텍스트 전환에서 호출 스택 데이터를 수집합니다. 이 경우 30초 만에 800만 번 이상 발생, 작은 효과를 볼 수 있습니다.
컨텍스트 전환의 인스턴스가 있는 것처럼 보이는 1초 영역으로 확대합니다.
그림 5의 데이터 테이블에서 데이터 테이블의 개수 열을 보면 컨텍스트 전환 수가 가장 높은 스레드를 확인할 수 있습니다. 비슷한 수의 스레드가 있을 수 있으며, 이는 이 스레드가 서로 토글링 중임을 나타낼 수 있습니다.
그림 5. 컨텍스트 전환 속도가 높을 때 표시되는 모양을 보여주는 시간 간격입니다. 뷰에 맞게 스케일이 조정됩니다.
개수가 가장 높은 호출 스택을 확장하여 코드에서 관련 위치를 찾습니다.
테이블의 마우스 오른쪽 버튼 메뉴에서 열에서 찾기를 선택하여 동일한 기본 또는 기능을 사용하고 있을 수 있는 다른 스레드를 찾습니다(그림 6 참조).
그림 6. 검색 기능을 사용하여 컨텍스트 전환을 자주 발생시키는 AcquireLock 기능에 대한 모든 호출을 찾습니다.
컨텍스트 전환 수가 많은 일반적인 원인
다음 표에는 높은 컨텍스트 전환 비율의 일반적인 원인이 나와 있습니다.
원인 | 이유 |
---|---|
스레딩 기본 형식에 대한 경합입니다. 예를 들어 중요 섹션이 해당합니다. | 너무 많은 타이틀 스레드가 동일한 CRITICAL_SECTION 을(를) 사용하고 있습니다. |
다른 스레드가 *실행 준비가 된 상태에서 촘촘한 루프에 SwitchToThread가 있습니다. | 다른 스레드를 실행할 준비가 될 때마다 항상 컨텍스트 전환이 발생합니다. |
우선 순위가 높은 스레드를 실행 준비 상태로 빠르게 전환합니다. | OS는 높은 우선 순위 스레드의 차단이 해제될 때마다 컨텍스트 전환을 자동으로 수행합니다. |