스레딩을 위한 런타임 구성 옵션

이 문서에서는 .NET에서 스레딩을 구성하는 데 사용할 수 있는 설정을 자세히 설명합니다.

참고 항목

.NET 6은 .NET 런타임 동작을 구성하는 환경 변수에 대해 COMPlus_ 대신 접두사 DOTNET_을 표준화합니다. 그러나 COMPlus_ 접두사도 계속 작동합니다. 이전 버전의 .NET 런타임을 사용하는 경우에도 환경 변수에 COMPlus_ 접두사를 사용해야 합니다.

Windows에서 모든 CPU 그룹 사용

  • CPU 그룹이 여러 개 있는 컴퓨터에서 이 설정은 스레드 풀과 같은 구성 요소가 모든 CPU 그룹을 사용하는지 아니면 프로세스의 기본 CPU 그룹만 사용하는지 여부를 구성합니다. 이 설정은 Environment.ProcessorCount에서 반환하는 항목에도 영향을 줍니다.
  • 이 설정을 사용하도록 설정하면 모든 CPU 그룹이 사용되고 스레드도 기본적으로 CPU 그룹에 자동으로 배포됩니다.
  • 이 설정은 기본적으로 Windows 11 이상 버전에서 사용하도록 설정되며 Windows 10 및 이전 버전에서는 기본적으로 사용하지 않도록 설정됩니다. 사용하도록 설정된 경우 이 설정을 적용하려면 GC도 모든 CPU 그룹을 사용하도록 구성해야 합니다. 자세한 내용은 GC CPU 그룹을 참조하세요.
설정 이름
runtimeconfig.json 해당 없음 해당 없음
환경 변수 COMPlus_Thread_UseAllCpuGroups 또는 DOTNET_Thread_UseAllCpuGroups 0 - 사용 안 함
1 - 사용

Windows의 CPU 그룹에 스레드 할당

  • 여러 CPU 그룹이 있고 모든 CPU 그룹이 사용되는 컴퓨터에서 이 설정은 스레드가 CPU 그룹에 자동으로 배포되는지 여부를 구성합니다.
  • 이 설정을 사용하도록 설정하면 새 CPU 그룹을 활용하기 전에 이미 사용 중인 CPU 그룹을 완전히 채우는 방식으로 새 스레드가 CPU 그룹에 할당됩니다.
  • 이 설정은 기본적으로 사용하도록 설정되어 있습니다.
설정 이름
runtimeconfig.json 해당 없음 해당 없음
환경 변수 COMPlus_Thread_AssignCpuGroups 또는 DOTNET_Thread_AssignCpuGroups 0 - 사용 안 함
1 - 사용

최소 스레드

  • 작업자 스레드 풀의 최소 스레드 개수를 지정합니다.
  • ThreadPool.SetMinThreads 메서드에 대응됩니다.
설정 이름
runtimeconfig.json System.Threading.ThreadPool.MinThreads 최소 스레드 개수를 나타내는 정수
MSBuild 속성 ThreadPoolMinThreads 최소 스레드 개수를 나타내는 정수
환경 변수 해당 없음 해당 없음

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MinThreads": 4
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Threading.ThreadPool.MinThreads": 4
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMinThreads>4</ThreadPoolMinThreads>
  </PropertyGroup>

</Project>

최대 스레드

  • 작업자 스레드 풀의 최대 스레드 개수를 지정합니다.
  • ThreadPool.SetMaxThreads 메서드에 대응됩니다.
설정 이름
runtimeconfig.json System.Threading.ThreadPool.MaxThreads 최대 스레드 개수를 나타내는 정수
MSBuild 속성 ThreadPoolMaxThreads 최대 스레드 개수를 나타내는 정수
환경 변수 해당 없음 해당 없음

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MaxThreads": 20
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Threading.ThreadPool.MaxThreads": 20
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
  </PropertyGroup>

</Project>

Windows 스레드 풀

  • Windows 프로젝트의 경우 스레드 풀 스레드 관리가 Windows 스레드 풀에 위임되는지 여부를 구성합니다.
  • 이 설정을 생략하거나 플랫폼이 Windows가 아닌 경우 .NET 스레드 풀이 대신 사용됩니다.
  • Windows에서 Native AOT를 사용하여 게시된 애플리케이션만 기본적으로 Windows 스레드 풀을 사용하며, 이 경우 구성 설정을 사용하지 않도록 설정하여 대신 .NET 스레드 풀을 사용하도록 선택할 수 있습니다.
  • Windows 스레드 풀은 최소 스레드 수가 높은 값으로 구성된 경우 또는 Windows 스레드 풀이 이미 앱에서 과도하게 사용되고 있는 경우와 같은 경우에 더 나은 성능을 발휘할 수 있습니다. 더 큰 컴퓨터에서 I/O 처리가 많은 경우와 같이 .NET 스레드 풀이 더 잘 수행되는 경우도 있을 수 있습니다. 이 구성 설정을 변경할 때 성능 메트릭을 검사 것이 좋습니다.
  • 일부 API는 Windows 스레드 풀(예: ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsThreadPool.BindHandle(SafeHandle))을 사용할 때 지원되지 않습니다. 최소 및 최대 스레드에 대한 스레드 풀 구성 설정도 효과적이지 않습니다. ThreadPool.BindHandle(SafeHandle)에 대한 대안은 ThreadPoolBoundHandle 클래스입니다.
설정 이름 도입된 버전
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true - 사용
false - 사용 안 함
.NET 8
MSBuild 속성 UseWindowsThreadPool true - 사용
false - 사용 안 함
.NET 8
환경 변수 DOTNET_ThreadPool_UseWindowsThreadPool 1 - 사용
0 - 사용 안 함
.NET 8

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.UseWindowsThreadPool": true
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Threading.ThreadPool.UseWindowsThreadPool": true
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <UseWindowsThreadPool>true</UseWindowsThreadPool>
  </PropertyGroup>

</Project>

차단 작업 항목에 대한 응답으로 스레드 삽입

경우에 따라 스레드 풀은 스레드를 차단하는 작업 항목을 검색합니다. 보정하기 위해 더 많은 스레드가 삽입됩니다. .NET 6+에서 다음 런타임 구성 설정을 사용하여 블록 작업 항목에 대한 응답으로 스레드 삽입을 구성할 수 있습니다. 현재 이러한 설정은 일반적인 sync-over-async 사례와 같이 다른 작업이 완료되기를 기다리는 작업 항목에만 유효합니다.

runtimeconfig.json 설정 이름 설명 도입된 버전
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor MinThreads에 기반한 스레드 수에 도달한 후 이 값에 프로세서 수를 곱한 결과는 지연 없이 만들 수 있는 추가 스레드 수를 지정합니다. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor ThreadsToAddWithoutDelay에 기반한 스레드 수에 도달한 후 이 값에 프로세서 수를 곱한 결과는 각 새 스레드를 만들기 전에 추가 DelayStepMs를 지연에 추가하려면 발생해야 하는 스레드 수를 지정합니다. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs ThreadsToAddWithoutDelay에 기반한 스레드 수에 도달한 후 이 값은 각 새 스레드가 생성되기 전에 적용되는 스레드당 추가 지연을 지정합니다. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs ThreadsToAddWithoutDelay에 기반한 스레드 수에 도달한 후 이 값은 각 새 스레드가 생성되기 전에 사용할 최대 지연을 지정합니다. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage 기본적으로 차단에 대한 응답으로 스레드 주입 속도는 사용 가능한 실제 메모리가 충분한지 여부를 결정하는 추론에 의해 제한됩니다. 경우에 따라 메모리가 낮은 상황에서도 스레드를 더 빨리 주입하는 것이 좋습니다. 이 스위치를 끄면 메모리 사용 추론을 사용하지 않도록 설정할 수 있습니다. .NET 7

구성 설정이 적용되는 방식

  • MinThreads에 기반한 스레드 수에 도달한 후에는 ThreadsToAddWithoutDelay까지 지연 없이 최대 추가 스레드를 만들 수 있습니다.
  • 그런 다음 각 추가 스레드를 만들기 전에 DelayStepMs부터 지연이 적용됩니다.
  • 지연으로 추가되는 모든 ThreadsPerDelayStep 스레드에 대해 지연에 DelayStepMs가 더 추가됩니다.
  • 지연은 MaxDelayMs를 초과할 수 없습니다.
  • 지연은 스레드를 만들기 전에만 적용됩니다. 스레드를 이미 사용할 수 있는 경우 차단 작업 항목을 보정하기 위해 지연 없이 릴리스됩니다.
  • 실제 메모리 사용량 및 제한도 사용되며, 임계값을 초과하면 시스템이 더 느린 스레드 주입으로 전환됩니다.

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
   }
}

관리형 스레드에 대한 AutoreleasePool

지원되는 macOS 플랫폼에서 실행할 때 각 관리형 스레드가 암시적 NSAutoreleasePool을 수신하는지 여부를 구성합니다.

설정 이름 도입된 버전
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true 또는 false .NET 6
MSBuild 속성 AutoreleasePoolSupport true 또는 false .NET 6
환경 변수 해당 없음 해당 없음 해당 없음

예제

runtimeconfig.json 파일:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.Thread.EnableAutoreleasePool": true
      }
   }
}

runtimeconfig.template.json 파일:

{
   "configProperties": {
      "System.Threading.Thread.EnableAutoreleasePool": true
   }
}

프로젝트 파일:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <AutoreleasePoolSupport>true</AutoreleasePoolSupport>
  </PropertyGroup>

</Project>