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 - dinonaktifkan1 - 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 - dinonaktifkan1 - diaktifkan |
Utas minimum
- Menentukan jumlah minimum utas untuk kumpulan utas pekerja.
- ThreadPool.SetMinThreads Sesuai dengan metode .
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
- Menentukan jumlah maksimum utas untuk kumpulan utas pekerja.
- ThreadPool.SetMaxThreads Sesuai dengan metode .
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 - diaktifkanfalse - dinonaktifkan |
.NET 8 |
Properti MSBuild | UseWindowsThreadPool |
true - diaktifkanfalse - dinonaktifkan |
.NET 8 |
Variabel lingkungan | DOTNET_ThreadPool_UseWindowsThreadPool |
1 - diaktifkan0 - 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, hinggaThreadsToAddWithoutDelay
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, tambahanDelayStepMs
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>