この記事では、.NET でスレッドを構成するために使用できる設定について詳しく説明します。
Windows ですべての CPU グループを使用する
- 複数の CPU グループを持つマシンでは、スレッド プールなどのコンポーネントがすべての CPU グループを使用するか、プロセスのプライマリ CPU グループのみを使用するかを構成します。 この設定は、 Environment.ProcessorCount が返す内容にも影響します。
- この設定を有効にすると、すべての CPU グループが使用され、スレッドも既定で CPU グループ間で自動的に分散されます 。
- この設定は、Windows 11 以降のバージョンでは既定で有効になり、Windows 10 以前のバージョンでは既定で無効になっています。 この設定を有効にした場合に有効にするには、すべての CPU グループを使用するように GC も構成する必要があります。詳細については、 GC CPU グループを参照してください。
| 設定の名前 | 価値観 | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| 環境変数 | DOTNET_Thread_UseAllCpuGroups |
0 - 無効1 - 有効 |
Windows で CPU グループにスレッドを割り当てる
- 複数の CPU グループがあり、 すべての CPU グループが使用されているマシンでは、スレッドを CPU グループ間で自動的に分散するかどうかを構成します。
- この設定を有効にすると、新しい CPU グループを使用する前に既に使用されている CPU グループを完全に設定しようとする方法で、新しいスレッドが CPU グループに割り当てられます。
- 既定では、この設定は有効になっています。
| 設定の名前 | 価値観 | |
|---|---|---|
| runtimeconfig.json | N/A | N/A |
| 環境変数 | DOTNET_Thread_AssignCpuGroups |
0 - 無効1 - 有効 |
最小スレッド数
- ワーカー スレッド プールのスレッドの最小数を指定します。
- ThreadPool.SetMinThreads メソッドに対応します。
| 設定の名前 | 価値観 | |
|---|---|---|
| runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
スレッドの最小数を表す整数 |
| MSBuild のプロパティ | ThreadPoolMinThreads |
スレッドの最小数を表す整数 |
| 環境変数 | N/A | N/A |
例示
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 |
スレッドの最大数を表す整数 |
| 環境変数 | N/A | N/A |
例示
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 上のネイティブ AOT で発行されたアプリケーションのみが、既定で Windows スレッド プールを使用します。この場合、構成設定を無効にすることで、代わりに .NET スレッド プールの使用を選択できます。
- Windows スレッド プールのパフォーマンスが向上する場合があります。たとえば、スレッドの最小数が高い値に構成されている場合や、Windows スレッド プールがアプリによって既に頻繁に使用されている場合などです。 大規模なマシンでの大量の I/O 処理など、.NET スレッド プールのパフォーマンスが向上する場合もあります。 この構成設定を変更するときは、パフォーマンス メトリックを確認することをお勧めします。
- ThreadPool.SetMinThreads、ThreadPool.SetMaxThreads、ThreadPool.BindHandle(SafeHandle)など、Windows スレッド プールを使用する場合、一部の API はサポートされていません。 最小スレッドと最大スレッドのスレッド プール構成設定も有効ではありません。 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 以降では、次の ランタイム構成 設定を使用して、ブロックする作業項目に応答してスレッド挿入を構成できます。 現在、これらの設定は、一般的な 同期オーバー非同期 の場合など、別のタスクの完了を待機する作業項目に対してのみ有効です。
| runtimeconfig.json 設定名 | Description | 導入されたバージョン |
|---|---|---|
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に基づくスレッド数に達した後、この値は、各新しいスレッドが作成される前に適用される、ThreadsPerDelayStepスレッドごとに追加する遅延の量を指定します。 |
.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 |
| 環境変数 | N/A | N/A | N/A |
例示
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