다음을 통해 공유


Intel Skylake 프로세서를 사용하여 VM의 .NET Framework에서 높은 CPU 또는 메모리 사용량 및 증가된 스핀 대기 루프

이 문서는 Intel Skylake 프로세서에서 구동되는 Azure VM(가상 머신)의 Microsoft .NET Framework 애플리케이션에서 높은 CPU 또는 메모리 사용량이 발생하는 문제를 해결하는 데 도움이 됩니다.

원래 제품 버전: .NET Framework
원래 KB 번호: 4527212

증상

Intel Skylake 프로세서에서 구동되는 컴퓨터에 최근에 배포된 Azure VM에서 예상보다 높은 CPU 또는 메모리 사용량이 발생합니다. Intel에 따르면 이 변경 내용은 VM 성능 및 전체 워크로드 또는 애플리케이션 실행에 영향을 줍니다.

이 문제는 Intel Skylake 프로세서의 일시 중지 명령 지연이 증가하여 발생합니다. 이 문제는 특히 .NET Framework 애플리케이션에서 확인할 수 있습니다. 이는 일시 중지 대기 시간 변경이 .NET Framework에서 일반적인 긴 스핀 대기 루프에 영향을 미치기 때문입니다.

원인

가장 최근의 Skylake 마이크로아키텍처에서 Intel은 일시 중지 대기 시간 값을 최대 140주기까지 증가했습니다. 이전 세대 마이크로아키텍처에서 일시 중지 대기 시간 값은 약 10주기입니다. Intel에 따르면 리소스 공유를 개선하기 위해 이러한 변경이 이루어졌습니다. 변경 내용 및 그 효과에 대한 자세한 내용은 다음 Intel PDF 문서 인 Intel 64 및 IA-32 아키텍처 최적화 참조 설명서의 섹션 2.6.4(Skylake 클라이언트 Microarchitecture에서 대기 시간 일시 중지)를 참조하세요.

해결 방법

중요합니다

이 섹션의 단계를 신중하게 따릅니다. 레지스트리를 잘못 수정할 경우 심각한 문제가 발생할 수 있습니다. 수정하기 전에, 문제가 발생할 경우를 대비하여 복원을 위해 레지스트리를 백업해 두세요.

이 문제에 대한 수정

이 문제를 해결하려면 .NET Framework 2018년 10월 보안 및 품질 롤업을 설치 합니다.

비고

.NET Framework 4.8에서는 기본적으로 수정이 사용하도록 설정됩니다. .NET Framework 4.6.x 및 4.7.x에서 수정은 기본적으로 사용하지 않도록 설정되며 수동으로 사용하도록 설정할 수 있습니다.

Skylake 프로세서에서 일시 중지 지연에 대한 수정을 사용하도록 설정하려면 레지스트리 편집기를 시작하고 키를 다음 하위 키에 DWORD 값으로 추가 Thread_NormalizeSpinWait 합니다.

  • 위치: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
  • 값 이름: Thread_NormalizeSpinWait
  • 값 데이터: 1

비고

.NET Framework 버전에서는 이 설정이 기본적으로 사용하도록 설정되지 않더라도 다른 고객 애플리케이션은 타이머 구성의 영향을 받을 수 있습니다. 일시 중지 대기 시간 변경 후에도 워크로드 성능이 여전히 영향을 받는 경우 타이머가 잠금 경합의 중요한 원인인지 여부를 고려합니다. 이것이 참이라고 판단되면 타이머에 대한 수정 섹션으로 이동합니다.

타이머에 대한 수정

수동으로 수정을 사용하도록 설정하려면 다음 하위 키에 Switch.System.Threading.UseNetCoreTimer 키를 문자열 값으로 추가합니다.

  • 위치: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext
  • 값 이름: Switch.System.Threading.UseNetCoreTimer
  • 값 데이터: true

타이머에 대한 자세한 내용은 AppContext 클래스의 라이브러리 소비자 용 AppContext 섹션 을 참조하세요.

자주 묻는 질문

  • 모든 종류의 하드웨어에서 UseNetCoreTimer를 사용하도록 설정한 경우 이 변경으로 인해 피해가 발생하나요?

    타이머 수정은 현재 모든 버전의 .NET Framework에서 기본적으로 사용하도록 설정되지 않습니다. 로컬 수준에서 기본 설정을 변경하지 않는 것이 좋습니다.

  • Skylake의 일시 중지 대기 시간 변경으로 인해 다른 알려진 문제가 있나요?

    또한 새로운 일시 중지 대기 시간 측정은 시작 중에 추가 CPU 시간을 사용합니다. 일반적으로 값은 CPU 시간의 약 10ms입니다. 기간 증가는 보다 안정적인 측정을 얻고 문제를 해결하는 기능을 향상시키는 데 필요한 것으로 간주됩니다. 그러나 .NET Framework 애플리케이션은 짧은 실행 도구일 수도 있습니다. 이러한 도구를 자주 사용하면 수정 사항이 적용되기 전보다 CPU 사용량이 더 커질 수 있습니다. 이는 더 큰 문제를 해결하고 .NET Framework 4.8에서 기본적으로 수정을 사용하도록 설정하기 위해 허용되는 절충안으로 간주되었습니다.

  • Skylake 일시 중지 대기 시간 수정이 내 문제를 해결하도록 보장하나요?

    아니요, 수정이 보장되지는 않습니다. 이 문제 외부에는 특정 워크로드 성능에 영향을 주는 다른 관련 없는 요소가 있을 수 있습니다. 수정의 효과는 측정 품질에 제어됩니다. .NET Framework에서 스핀 수를 오버스케일하지 않도록 하기 위해 사용 중인 범위가 있습니다. 그러나 VM이 많이 로드될 때 잘못된 측정이 발생할 수 있습니다. 이렇게 하면 수정이 유효하지 않게 될 수 있습니다. 최악의 경우(A2에 언급된 절충 제외) 이 상황은 적용되지 않는 수정 사항과 유사합니다.

  • 이러한 변경으로 인해 인식된 성능 문제가 발생하는 것을 감지하는 방법에 대한 지원 엔지니어에 대한 지침이 있나요?

    사용되는 애플리케이션을 프로파일링하여 이를 확인할 수 있습니다. 이전 Skylake 기반 VM과 Skylake 기반 VM 간에 부하가 비슷한 프로필을 비교하면 Skylake VM에 상대적으로 소요된 clr!AwareLock::Contention 시간이 훨씬 더 많아질 수 있습니다. 이는 VM이 Skylake 프로세서에서 실행되는 경우 일시 중지 지연 수정이 유용함을 나타냅니다.

타이머 수정의 경우 호출 스택에 의해 clr!AwareLock::Contention호출된 호출 스택이 mscorlib.ni!System.Threading.TimerQueueTimer.Fire() 표시됩니다. Fire() 메서드 또는 다른 메서드 TimerQueueTimer 가 경합의 기본 소스인 경우 타이머 수정이 도움이 되었음을 나타냅니다.

성능 모니터 사용하여 잠금 경합 속도를 모니터링할 수도 있습니다. 자세한 내용은 .NET Framework의 성능 카운터에 있는 잠금 및 스레드 성능 카운터 섹션에서 .NET CLR LocksAndThreads대한 경합 비율/초 및 총 경합 항목을 참조하세요.

타사 정보 고지 사항

이 문서에서 설명하는 타사 제품은 Microsoft와 독립적인 회사에서 제조합니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.