İş parçacığı oluşturma için çalışma zamanı yapılandırma seçenekleri
Bu makalede, .NET'te iş parçacığını yapılandırmak için kullanabileceğiniz ayarlar ayrıntılı olarak anlatılır.
Dekont
.NET 6, .NET çalışma zamanı davranışını yapılandıran ortam değişkenleri yerine COMPlus_
ön eki DOTNET_
standartlaştırır. Ancak ön COMPlus_
ek çalışmaya devam eder. .NET çalışma zamanının önceki bir sürümünü kullanıyorsanız, ortam değişkenleri için ön eki kullanmaya COMPlus_
devam etmelisiniz.
Windows'ta tüm CPU gruplarını kullanma
- Birden çok CPU grubuna sahip makinelerde bu ayar, iş parçacığı havuzu gibi bileşenlerin tüm CPU gruplarını mı yoksa işlemin yalnızca birincil CPU grubunu mu kullandığını yapılandırılır. Bu ayar, döndürenleri Environment.ProcessorCount de etkiler.
- Bu ayar etkinleştirildiğinde tüm CPU grupları kullanılır ve iş parçacıkları da varsayılan olarak CPU grupları arasında otomatik olarak dağıtılır.
- Bu ayar Windows 11 ve sonraki sürümlerde varsayılan olarak etkinleştirilir ve Windows 10 ve önceki sürümlerde varsayılan olarak devre dışı bırakılır. Bu ayarın etkinleştirildiğinde etkili olması için GC'nin de tüm CPU gruplarını kullanacak şekilde yapılandırılması gerekir; daha fazla bilgi için bkz . GC CPU grupları.
Ayar adı | Değerler | |
---|---|---|
runtimeconfig.json | Geçersiz | Geçersiz |
Ortam değişkeni | COMPlus_Thread_UseAllCpuGroups veya DOTNET_Thread_UseAllCpuGroups |
0 -Devre dışı1 -Etkin |
Windows'ta CPU gruplarına iş parçacığı atama
- Birden çok CPU grubuna ve tüm CPU gruplarına sahip makinelerde bu ayar, iş parçacıklarının CPU grupları arasında otomatik olarak dağıtılıp dağıtılmayacağını yapılandırılır.
- Bu ayar etkinleştirildiğinde, yeni iş parçacıkları yeni bir CPU grubu kullanılmadan önce zaten kullanımda olan bir CPU grubunu tam olarak doldurmaya çalışacak şekilde bir CPU grubuna atanır.
- Bu ayar varsayılan olarak etkindir.
Ayar adı | Değerler | |
---|---|---|
runtimeconfig.json | Geçersiz | Geçersiz |
Ortam değişkeni | COMPlus_Thread_AssignCpuGroups veya DOTNET_Thread_AssignCpuGroups |
0 -Devre dışı1 -Etkin |
Minimum iş parçacıkları
- Çalışan iş parçacığı havuzu için en az iş parçacığı sayısını belirtir.
- yöntemine ThreadPool.SetMinThreads karşılık gelir.
Ayar adı | Değerler | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
En az iş parçacığı sayısını temsil eden bir tamsayı |
MSBuild özelliği | ThreadPoolMinThreads |
En az iş parçacığı sayısını temsil eden bir tamsayı |
Ortam değişkeni | Geçersiz | Geçersiz |
Örnekler
runtimeconfig.json dosyası:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json dosyası:
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Proje dosyası:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
En fazla iş parçacığı sayısı
- Çalışan iş parçacığı havuzu için en fazla iş parçacığı sayısını belirtir.
- yöntemine ThreadPool.SetMaxThreads karşılık gelir.
Ayar adı | Değerler | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
İş parçacığı sayısı üst sınırını temsil eden bir tamsayı |
MSBuild özelliği | ThreadPoolMaxThreads |
İş parçacığı sayısı üst sınırını temsil eden bir tamsayı |
Ortam değişkeni | Geçersiz | Geçersiz |
Örnekler
runtimeconfig.json dosyası:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json dosyası:
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Proje dosyası:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Windows iş parçacığı havuzu
- Windows'da projeler için, iş parçacığı havuzu iş parçacığı yönetiminin Windows iş parçacığı havuzuna temsilci olarak atanıp atanmayacağını yapılandırılır.
- Bu ayarı atlarsanız veya platform Windows değilse, bunun yerine .NET iş parçacığı havuzu kullanılır.
- Yalnızca Windows'da Yerel AOT ile yayımlanan uygulamalar varsayılan olarak Windows iş parçacığı havuzunu kullanır. Yapılandırma ayarını devre dışı bırakarak bunun yerine .NET iş parçacığı havuzunu kullanmayı tercih edebilirsiniz.
- Windows iş parçacığı havuzu, en az iş parçacığı sayısının yüksek bir değere yapılandırıldığı veya Windows iş parçacığı havuzunun uygulama tarafından zaten yoğun olarak kullanıldığı durumlarda daha iyi performans gösterebilir. .NET iş parçacığı havuzunun daha büyük makinelerde ağır G/Ç işleme gibi daha iyi performans gösterdiği durumlar da olabilir. Bu yapılandırma ayarını değiştirirken performans ölçümlerini denetlemesi önerilir.
- Windows iş parçacığı havuzu kullanılırken , ThreadPool.SetMaxThreadsve ThreadPool.BindHandle(SafeHandle)gibi ThreadPool.SetMinThreadsbazı API'ler desteklenmez. En düşük ve en yüksek iş parçacıkları için iş parçacığı havuzu yapılandırma ayarları da etkili değildir. bunun alternatifi ThreadPool.BindHandle(SafeHandle)ThreadPoolBoundHandle sınıfıdır.
Ayar adı | Değerler | Sürüm kullanıma sunulmuştur | |
---|---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true -Etkinfalse -Devre dışı |
.NET 8 |
MSBuild özelliği | UseWindowsThreadPool |
true -Etkinfalse -Devre dışı |
.NET 8 |
Ortam değişkeni | DOTNET_ThreadPool_UseWindowsThreadPool |
1 -Etkin0 -Devre dışı |
.NET 8 |
Örnekler
runtimeconfig.json dosyası:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json dosyası:
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Proje dosyası:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
İş öğelerini engellemeye yanıt olarak iş parçacığı ekleme
Bazı durumlarda, iş parçacığı havuzu iş parçacıklarını engelleyen iş öğelerini algılar. Telafi etmek için daha fazla iş parçacığı ekler. .NET 6+'da, iş öğelerini engellemeye yanıt olarak iş parçacığı eklemeyi yapılandırmak için aşağıdaki çalışma zamanı yapılandırma ayarlarını kullanabilirsiniz. Şu anda, bu ayarlar yalnızca başka bir görevin tamamlanmasını bekleyen iş öğeleri için (örneğin, zaman uyumsuz eşitleme durumlarında) etkili olur.
runtimeconfig.json ayar adı | Tanım | Sürüm kullanıma sunulmuştur |
---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
temel alınan MinThreads iş parçacığı sayısına ulaşıldıktan sonra bu değer (işlemci sayısıyla çarpıldıktan sonra) gecikme olmadan kaç ek iş parçacığı oluşturulabileceğini belirtir. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
temel alınan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra, bu değer (işlemci sayısıyla çarpıldıktan sonra) her yeni iş parçacığı oluşturulmadan önce gecikmeye kaç iş parçacığı DelayStepMs ekleneceğini belirtir. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
temel alan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra bu değer, her yeni iş parçacığı oluşturulmadan önce uygulanacak olan iş parçacıkları başına ThreadsPerDelayStep ne kadar ek gecikme ekleneceğini belirtir. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
temel alan ThreadsToAddWithoutDelay iş parçacığı sayısına ulaşıldıktan sonra, bu değer her yeni iş parçacığı oluşturulmadan önce kullanılacak en uzun gecikmeyi belirtir. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Varsayılan olarak, engellemeye yanıt olarak iş parçacığı ekleme hızı, kullanılabilir yeterli fiziksel bellek olup olmadığını belirleyen buluşsal yöntemlerle sınırlıdır. Bazı durumlarda, düşük bellekli durumlarda bile iş parçacıklarını daha hızlı bir şekilde eklemek tercih edilebilir. Bu anahtarı kapatarak bellek kullanımı buluşsal özelliklerini devre dışı bırakabilirsiniz. | .NET 7 |
Yapılandırma ayarları nasıl geçerlilik kazanır?
- temel alan
MinThreads
iş parçacığı sayısına ulaşıldıktan sonra, gecikme olmadan en fazlaThreadsToAddWithoutDelay
ek iş parçacığı oluşturulabilir. - Bundan sonra, her ek iş parçacığı oluşturulmadan önce ile başlayan
DelayStepMs
bir gecikme oluşur. - Gecikmeli olarak eklenen her
ThreadsPerDelayStep
iş parçacığı için gecikmeye bir ekDelayStepMs
eklenir. - Gecikme aşılamayabilir
MaxDelayMs
. - Gecikmeler yalnızca iş parçacıkları oluşturulmadan önce oluşturulur. İş parçacıkları zaten kullanılabilir durumdaysa, iş öğelerini engellemeyi telafi etmek için gecikme olmadan serbest bırakılırlar.
- Fiziksel bellek kullanımı ve sınırları da kullanılır ve bir eşiğin ötesinde sistem daha yavaş iş parçacığı eklemeye geçer.
Örnekler
runtimeconfig.json dosyası:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json dosyası:
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool
yönetilen iş parçacıkları için
Bu seçenek, desteklenen bir macOS platformunda çalıştırılırken her yönetilen iş parçacığının örtük bir NSAutoreleasePool alıp almayacağını yapılandırıyor.
Ayar adı | Değerler | Sürüm kullanıma sunulmuştur | |
---|---|---|---|
runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true veya false |
.NET 6 |
MSBuild özelliği | AutoreleasePoolSupport |
true veya false |
.NET 6 |
Ortam değişkeni | Geçersiz | Yok | Geçersiz |
Örnekler
runtimeconfig.json dosyası:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json dosyası:
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Proje dosyası:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>