Opsi konfigurasi runtime untuk threading

Artikel ini merinci pengaturan yang dapat Anda gunakan untuk mengonfigurasi utas di .NET.

Catatan

.NET 6 menstandarkan pada prefiks DOTNET_ daripada COMPlus_ untuk variabel lingkungan yang mengonfigurasi perilaku run-time .NET. Namun, prefiks COMPlus_ akan terus berfungsi. Jika Anda menggunakan versi runtime .NET sebelumnya, Anda masih harus menggunakan prefiks COMPlus_ untuk variabel lingkungan.

Menggunakan semua grup CPU di Windows

  • Pada komputer yang memiliki beberapa grup CPU, pengaturan ini mengonfigurasi apakah komponen seperti kumpulan utas menggunakan semua grup CPU atau hanya grup CPU utama proses. Pengaturan juga memengaruhi apa yang Environment.ProcessorCount kembali.
  • Ketika pengaturan ini diaktifkan, semua grup CPU digunakan dan utas juga didistribusikan secara otomatis di seluruh grup CPU secara default.
  • Pengaturan ini diaktifkan secara default pada Windows 11 dan versi yang lebih baru, dan dinonaktifkan secara default pada Windows 10 dan versi yang lebih lama. Agar pengaturan ini berlaku saat diaktifkan, GC juga harus dikonfigurasi untuk menggunakan semua grup CPU; untuk informasi selengkapnya, lihat grup CPU GC.
Nama pengaturan Nilai
runtimeconfig.json T/A T/A
Variabel lingkungan COMPlus_Thread_UseAllCpuGroups atau DOTNET_Thread_UseAllCpuGroups 0 - dinonaktifkan
1 - diaktifkan

Menetapkan utas ke grup CPU di Windows

  • Pada komputer yang memiliki beberapa grup CPU dan semua grup CPU sedang digunakan, pengaturan ini mengonfigurasi apakah utas didistribusikan secara otomatis di seluruh grup CPU.
  • Ketika pengaturan ini diaktifkan, utas baru ditetapkan ke grup CPU dengan cara yang mencoba mengisi sepenuhnya grup CPU yang sudah digunakan sebelum menggunakan grup CPU baru.
  • Setelan ini diaktifkan secara asali.
Nama pengaturan Nilai
runtimeconfig.json T/A T/A
Variabel lingkungan COMPlus_Thread_AssignCpuGroups atau DOTNET_Thread_AssignCpuGroups 0 - dinonaktifkan
1 - diaktifkan

Utas minimum

Nama pengaturan Nilai
runtimeconfig.json System.Threading.ThreadPool.MinThreads Bilangan bulat yang menunjukkan jumlah minimum utas
Properti MSBuild ThreadPoolMinThreads Bilangan bulat yang menunjukkan jumlah minimum utas
Variabel lingkungan T/A T/A

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json :

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

File proyek:

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

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

</Project>

Utas maksimum

Nama pengaturan Nilai
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Bilangan bulat yang menunjukkan jumlah maksimum utas
Properti MSBuild ThreadPoolMaxThreads Bilangan bulat yang menunjukkan jumlah maksimum utas
Variabel lingkungan T/A T/A

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json :

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

File proyek:

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

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

</Project>

Kumpulan utas Windows

  • Untuk proyek di Windows, mengonfigurasi apakah manajemen utas kumpulan utas didelegasikan ke kumpulan utas Windows.
  • Jika Anda menghilangkan pengaturan ini atau platform bukan Windows, kumpulan utas .NET digunakan sebagai gantinya.
  • Hanya aplikasi yang diterbitkan dengan AOT Asli di Windows yang menggunakan kumpulan utas Windows secara default, yang anda dapat memilih untuk menggunakan kumpulan utas .NET sebagai gantinya dengan menonaktifkan pengaturan konfigurasi.
  • Kumpulan utas Windows mungkin berkinerja lebih baik dalam beberapa kasus, seperti dalam kasus di mana jumlah minimum utas dikonfigurasi ke nilai tinggi, atau ketika kumpulan utas Windows sudah banyak digunakan oleh aplikasi. Mungkin juga ada kasus di mana kumpulan utas .NET berkinerja lebih baik, seperti dalam penanganan I/O berat pada komputer yang lebih besar. Disarankan untuk memeriksa metrik performa saat mengubah pengaturan konfigurasi ini.
  • Beberapa API tidak didukung saat menggunakan kumpulan utas Windows, seperti ThreadPool.SetMinThreads, , ThreadPool.SetMaxThreadsdan ThreadPool.BindHandle(SafeHandle). Pengaturan konfigurasi kumpulan utas untuk utas minimum dan maksimum juga tidak efektif. Alternatif untuk ThreadPool.BindHandle(SafeHandle) adalah ThreadPoolBoundHandle kelas .
Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true - diaktifkan
false - dinonaktifkan
.NET 8
Properti MSBuild UseWindowsThreadPool true - diaktifkan
false - dinonaktifkan
.NET 8
Variabel lingkungan DOTNET_ThreadPool_UseWindowsThreadPool 1 - diaktifkan
0 - dinonaktifkan
.NET 8

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json :

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

File proyek:

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

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

</Project>

Injeksi utas sebagai respons terhadap pemblokiran item kerja

Dalam beberapa kasus, kumpulan utas mendeteksi item kerja yang memblokir utasnya. Untuk mengimbangi, ia menyuntikkan lebih banyak utas. Di .NET 6+, Anda dapat menggunakan pengaturan konfigurasi runtime berikut untuk mengonfigurasi injeksi utas sebagai respons terhadap pemblokiran item kerja. Saat ini, pengaturan ini hanya berlaku untuk item kerja yang menunggu tugas lain selesai, seperti dalam kasus sinkronisasi berlebihan umum.

nama pengaturan runtimeconfig.json Deskripsi Versi yang diperkenalkan
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Setelah jumlah utas berdasarkan MinThreads tercapai, nilai ini (setelah dikalikan dengan jumlah prosesor) menentukan berapa banyak utas tambahan yang dapat dibuat tanpa penundaan. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Setelah jumlah utas berdasarkan ThreadsToAddWithoutDelay tercapai, nilai ini (setelah dikalikan dengan jumlah prosesor) ditentukan setelah berapa banyak utas tambahan DelayStepMs yang akan ditambahkan ke penundaan sebelum setiap utas baru dibuat. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Setelah jumlah utas berdasarkan ThreadsToAddWithoutDelay tercapai, nilai ini menentukan berapa banyak penundaan tambahan untuk ditambahkan per ThreadsPerDelayStep utas, yang akan diterapkan sebelum setiap utas baru dibuat. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Setelah jumlah utas berdasarkan ThreadsToAddWithoutDelay tercapai, nilai ini menentukan penundaan maks untuk digunakan sebelum setiap utas baru dibuat. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Secara default, tingkat injeksi utas sebagai respons terhadap pemblokiran dibatasi oleh heuristik yang menentukan apakah ada cukup memori fisik yang tersedia. Dalam beberapa situasi, mungkin lebih baik untuk menyuntikkan utas lebih cepat bahkan dalam situasi memori rendah. Anda dapat menonaktifkan heuristik penggunaan memori dengan mematikan sakelar ini. .NET 7

Bagaimana pengaturan konfigurasi berlaku

  • Setelah jumlah utas berdasarkan MinThreads tercapai, hingga ThreadsToAddWithoutDelay utas tambahan dapat dibuat tanpa penundaan.
  • Setelah itu, sebelum setiap utas tambahan dibuat, penundaan diinduksi, dimulai dengan DelayStepMs.
  • Untuk setiap ThreadsPerDelayStep utas yang ditambahkan dengan penundaan, tambahan DelayStepMs ditambahkan ke penundaan.
  • Penundaan mungkin tidak melebihi MaxDelayMs.
  • Penundaan hanya diinduksi sebelum membuat utas. Jika utas sudah tersedia, utas akan dirilis tanpa penundaan untuk mengkompensasi pemblokiran item kerja.
  • Penggunaan dan batas memori fisik juga digunakan dan, di luar ambang batas, sistem beralih ke injeksi utas yang lebih lambat.

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json :

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

AutoreleasePool untuk utas terkelola

Opsi ini mengonfigurasi apakah setiap utas terkelola menerima NSAutoreleasePool implisit saat berjalan pada platform macOS yang didukung.

Nama pengaturan Nilai Versi yang diperkenalkan
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true atau false .NET 6
Properti MSBuild AutoreleasePoolSupport true atau false .NET 6
Variabel lingkungan T/A T/A T/A

Contoh

File runtimeconfig.json:

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

file runtimeconfig.template.json :

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

File proyek:

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

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

</Project>