스레딩을 위한 런타임 구성 옵션
이 문서에서는 .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.SetMaxThreads 및 ThreadPool.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>
.NET