「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
同時実行性を向上させるためのパラメタについて纏める。
サマリすると以下の様になる。
- IIS 6 以前、IIS 7 以降のクラシック・モード
machine.configに設定を行う。
- IIS 7 以降のクラシック・モード+.NET 4 以前
MaxConcurrentRequestsPerCPU レジストリに設定を行う。
- IIS 7 以降の統合モード
- .NET 3.5 以前
MaxConcurrentRequestsPerCPU レジストリに設定を行う。
- .NET 3.5 SP1以降
aspnet.configに設定を行う。
machine.config †
IIS 6 以前、IIS 7 以降のクラシック・モードではmachine.configで以下の設定を使用できる。
IIS 6 以前、IIS 7 以降のクラシック・モード + .NET 2.0 †
.NET 2.0では自動構成のプロセス モデルを導入したため、
殆どの用途で、KB821268に推奨される変更は不要とされている。
IIS 6 以前、IIS 7 以降のクラシック・モード + .NET 1.1 †
状況に応じて machine.configファイル内の以下のパラメーターを調整する。
- maxWorkerThreads?
- minWorkerThreads?
- maxIoThreads?
- minFreeThreads?
- minLocalRequestFreeThreads?
- maxconnection
- executionTimeout
ファイルの場所 †
- 32ビットの場合:
%windir%\Microsoft.NET\Framework\[.NETバージョン]\CONFIG\machine.config
- 64ビットの場合:
%windir%\Microsoft.NET\Framework64\[.NETバージョン]\CONFIG\machine.config
設定方法 †
- 注:実際のスレッド数は、上記値に論理CPU数が掛けられたもの。
- 注:IIS 7.0 以降のバージョンの統合モードで実行されている場合は機能しない。
- minFreeThreads?
スレッド プール内で維持するフリー スレッドの最小数。
必要な数のスレッドが使用できない場合、要求はキューに置かれたままとなる。
- minLocalRequestFreeThreads?
新しいローカル要求を実行するために維持するフリー スレッドの最小数。
注:IIS 7.0 以降のバージョンの統合モードで実行されている場合は機能しない。
推奨設定 †
- 各パラメタの推奨設定値
N:物理 CPU の数ではなく、論理 CPU の数
- maxWorkerThreads?、maxIoThreads?
値を 100 に設定(既定値は 20)
- minWorkerThreads?
値を 50 に設定(既定では存在しないため追加が必要、既定値は 1)
- minLocalRequestFreeThreads?
76*N に設定(既定値は 4)
- minFreeThreads?
値を 88*N に設定(既定値は 8)
- maxconnection
値を 12*N に設定(既定値は ?)
構成設定 | 規定値 (.NET 1.1) | 推奨値 |
maxIoThreads? | 20 | 100 |
maxWorkerThreads? | 20 | 100 |
minFreeThreads? | 8 | 88*N |
minLocalRequestFreeThreads? | 4 | 76*N |
maxconnection | 2 | 12*N |
- 設定例
CPU×4でハイパー スレッディングが有効になっている場合(N=8)。
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>
MaxConcurrentRequestsPerCPU レジストリ †
IIS 7 以降のクラシック・モード+.NET 4 以前 †
MaxConcurrentRequestsPerCPU 設定(下記のレジストリ設定)を使用してください。
IIS 7 以降の統合モード+.NET 3.5 以前 †
IIS 7 以降の統合モード+.NET 3.5 以前では以下のレジストリ設定を使用できる。
変更点 †
統合モードでは、ASP.NET スレッド設定を使用して要求の同時実行性を制御できない。
- processModel 構成セクションの
- system.web/httpRuntime 構成セクションの
- minFreeThreads? と minLocalRequestFreeThreads? 設定、
は、ASP.NET で使用されるスレッド メカニズムを制御しなくなりました。
設定方法 †
その代わり、ASP.NET は IIS スレッド プールに依存し、
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 キー内の
- MaxConcurrentRequestsPerCPU の DWORD 値 (既定値は 12)
を設定することで、同時実行要求の最大数を制御できるようになりました。
この設定はグローバルなので、
- アプリケーション プールや
- アプリケーションごとに
変更することはできません。
aspnet.config †
IIS 7 以降の統合モード+.NET 3.5 SP1 以降 †
IIS 7 以降の統合モード+.NET 3.5 SP1 以降ではaspnet.configで以下の設定を使用できる。
※ Manual上は、.NET 4 以降になっているが、実際は.NET 3.5 SP1から採用されている。
ASP.NET アプリケーションが
IIS 7.0 以降のバージョンの統合モードで実行されている場合に、
プロセス全体の動作を管理するために ASP.NET で使用される構成設定を指定します。
- IIS 6 を実行する場合や、
- IIS 7.0 をクラシック モード
- または ISAPI モードで実行する場合は、
これらの設定は無視されます。
ファイルの場所 †
- 32ビットの場合:
%windir%\Microsoft.NET\Framework\[.NETバージョン]\aspnet.config
- 64ビットの場合:
%windir%\Microsoft.NET\Framework64\[.NETバージョン]\aspnet.config
設定方法 †
- applicationPool要素の属性
- maxConcurrentRequestsPerCPU
- ASP.NET で許可する CPU あたりの同時要求数を指定する。
- .NET 4 での既定の設定は "5000"
- maxConcurrentThreadsPerCPU
- 各 CPU のアプリケーション プールで実行できるスレッド数を指定する。
- 既定の設定 0 は、CPU あたりの作成可能なスレッド数を制限しない。
- ただし、作成可能なスレッド数には、CLRのスレッド プールによる制限も適用される。
- requestQueueLimit?
- ASP.NET のキューに配置できる要求の最大数を指定する。
- 複数の ASP.NET アプリケーションを 1 つのアプリケーション プールでホストする場合、
そのアプリケーション プールに対する要求の累積数を制限するために使用する。
- .NET 4 での既定の設定は "5000"
設定例 †
既定値
<configuration>
<system.web>
<applicationPool
maxConcurrentRequestsPerCPU="5000"
maxConcurrentThreadsPerCPU="0"
requestQueueLimit="5000" />
</system.web>
</configuration>
applicationHost.config †
ApplicationHost?.configにも、machine.configと同様にprocessModelタグがあるが、
machine.configのprocessModelタグとは異なり、同時実行制御に関する設定は存在しない。
- applicationPoolのリサイクリングなどの設定ができる。
- 同時実行制御に関する設定(maxWorkerThreads?等)は存在しない。
ファイルの場所 †
%windir%?system32?inetsrv?config\ApplcationHost?.config
設定可能な値 †
applicationPoolのリサイクリングなどの設定ができる。
<applicationPools>
<add name="DefaultAppPool" autoStart="true" />
<add name="Classic .NET AppPool" managedPipelineMode="Classic" />
<add name="MyAppPool" autoStart="true" managedPipelineMode="Integrated" />
<applicationPoolDefaults>
<processModel identityType="ApplicationPoolIdentity" />
</applicationPoolDefaults>
</applicationPools>
補足 †
補足1 (統合モード) †
統合モードでは ASP.NET アプリケーション キューが使用されないので、
パフォーマンス カウンター:"ASP.NET Applications\Requests in Application Queue"
の値が常に 0 になる
補足2 (IIS 7) †
IIS 7 は Web.config ファイルのASP.NET 変更通知設定に関係なく、
Web.config ファイルを監視し、これが変更されると、
常に ASP.NET アプリケーションを再起動するため、
system.web/httpRuntime 構成セクションの
- waitChangeNotification?
- maxWaitChangeNotification?
属性の効果がない。
Tags: :.NET開発, :ASP.NET