「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[ASP.NET]] --[[IIS config]] --[[.NET config]] * 目次 [#r25ad339] #contents *概要 [#zd5746e8] 同時実行性を向上させるためのパラメタについて纏める。 サマリすると以下の様になる。 -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 [#p4535954] IIS 6 以前、IIS 7 以降のクラシック・モードではmachine.configで以下の設定を使用できる。 -processModel 要素 (ASP.NET 設定スキーマ)~ http://msdn.microsoft.com/ja-jp/library/7w2sway1.aspx -ASP.NET アプリケーションから Web サービス要求を行うと、~ 競合、パフォーマンスの低下、およびデッドロックが発生する~ http://support.microsoft.com/kb/821268/ja **IIS 6 以前、IIS 7 以降のクラシック・モード + .NET 2.0 [#z558162d] .NET 2.0では自動構成のプロセス モデルを導入したため、~ 殆どの用途で、KB821268に推奨される変更は不要とされている。 -ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0~ - Thomas Marquardt's Blog - Site Home - MSDN Blogs~ http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx **IIS 6 以前、IIS 7 以降のクラシック・モード + .NET 1.1 [#kf8e86cf] 状況に応じて Machine.config ファイル内の以下のパラメーターを調整する。 状況に応じて [[machine.config>#p4535954]]ファイル内の以下のパラメーターを調整する。 -maxWorkerThreads -minWorkerThreads -maxIoThreads -minFreeThreads -minLocalRequestFreeThreads -maxconnection -executionTimeout ***ファイルの場所 [#u97c0158] -32ビットの場合:~ %windir%\Microsoft.NET\Framework\[.NETバージョン]\CONFIG\machine.config -64ビットの場合:~ %windir%\Microsoft.NET\Framework64\[.NETバージョン]\CONFIG\machine.config ***設定方法 [#s25f3b0d] -maxWorkerThreads、minWorkerThreads、maxIoThreads~ ワーカ・スレッド、I/O スレッドの最大数を制限する。 <processModel maxWorkerThreads="20" minWorkerThreads="10" maxIoThreads="20"> --注:実際のスレッド数は、上記値に論理CPU数が掛けられたもの。 --注:IIS 7.0 以降のバージョンの統合モードで実行されている場合は機能しない。 -minFreeThreads および minLocalRequestFreeThreads~ 維持するフリー スレッドの最小数を制御する。 <httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8"> --minFreeThreads~ スレッド プール内で維持するフリー スレッドの最小数。~ 必要な数のスレッドが使用できない場合、要求はキューに置かれたままとなる。 --minLocalRequestFreeThreads~ 新しいローカル要求を実行するために維持するフリー スレッドの最小数。 >注:IIS 7.0 以降のバージョンの統合モードで実行されている場合は機能しない。 -The maxconnection~ 特定の IP アドレスに対して確立できる接続の数を設定する。 <connectionManagement> <add address="*" maxconnection="2"> <add address="65.53.32.230" maxconnection="12"> </connectionManagement> -executionTimeout~ 要求の実行時間を制限する。 <httpRuntime executionTimeout="90"/> ***推奨設定 [#v6891e1d] -各パラメタの推奨設定値~ N:物理 CPU の数ではなく、論理 CPU の数 --maxWorkerThreads、maxIoThreads~ 値を 100 に設定(既定値は 20) --minWorkerThreads~ 値を 50 に設定(既定では存在しないため追加が必要、既定値は 1) --minLocalRequestFreeThreads~ 76*N に設定(既定値は 4) --minFreeThreads~ 値を 88*N に設定(既定値は 8) --maxconnection~ 値を 12*N に設定(既定値は ?) -競合削減のための推奨スレッド処理設定~ >第 17 章 「.NET アプリケーション パフォーマンスのチューニング」~ http://msdn.microsoft.com/ja-jp/library/ff647813.aspx |構成設定|規定値 (.NET 1.1)|推奨値|h |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 レジストリ [#q46b6d2f] **IIS 7 以降のクラシック・モード+.NET 4 以前 [#f9443394] MaxConcurrentRequestsPerCPU 設定([[下記のレジストリ設定>#t5881785]])を使用してください。 **IIS 7 以降の統合モード+.NET 3.5 以前 [#t5881785] IIS 7 以降の統合モード+.NET 3.5 以前では以下のレジストリ設定を使用できる。 -IIS 7 での ASP.NET 2.0 の互換性に影響する変更点~ http://technet.microsoft.com/ja-jp/library/ff454090 ***変更点 [#be0ea2a8] 統合モードでは、ASP.NET スレッド設定を使用して要求の同時実行性を制御できない。 -processModel 構成セクションの --maxWorkerThreads 設定 -system.web/httpRuntime 構成セクションの --minFreeThreads と minLocalRequestFreeThreads 設定、 は、ASP.NET で使用されるスレッド メカニズムを制御しなくなりました。 ***設定方法 [#db912418] その代わり、ASP.NET は IIS スレッド プールに依存し、 -HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 キー内の --MaxConcurrentRequestsPerCPU の DWORD 値 (既定値は 12) を設定することで、同時実行要求の最大数を制御できるようになりました。 この設定はグローバルなので、 -アプリケーション プールや -アプリケーションごとに 変更することはできません。 *aspnet.config [#h1f15c0a] **IIS 7 以降の統合モード+.NET 3.5 SP1 以降 [#x5e90679] IIS 7 以降の統合モード+.NET 3.5 SP1 以降ではaspnet.configで以下の設定を使用できる。~ ※ Manual上は、.NET 4 以降になっているが、実際は.NET 3.5 SP1から採用されている。 -Web 設定スキーマ~ http://msdn.microsoft.com/ja-jp/library/dd560844.aspx --system.web 要素 (Web 設定)~ http://msdn.microsoft.com/ja-jp/library/dd560839.aspx ---applicationPool 要素 (Web 設定)~ http://msdn.microsoft.com/ja-jp/library/dd560842.aspx ASP.NET アプリケーションが~ IIS 7.0 以降のバージョンの統合モードで実行されている場合に、~ プロセス全体の動作を管理するために ASP.NET で使用される構成設定を指定します。 -IIS 6 を実行する場合や、 -IIS 7.0 をクラシック モード -または ISAPI モードで実行する場合は、 これらの設定は無視されます。 ***ファイルの場所 [#bd4ab853] -32ビットの場合:~ %windir%\Microsoft.NET\Framework\[.NETバージョン]\aspnet.config -64ビットの場合:~ %windir%\Microsoft.NET\Framework64\[.NETバージョン]\aspnet.config ***設定方法 [#saafb317] -applicationPool要素の属性 --maxConcurrentRequestsPerCPU ---ASP.NET で許可する CPU あたりの同時要求数を指定する。 ---.NET 4 での既定の設定は "5000" --maxConcurrentThreadsPerCPU ---各 CPU のアプリケーション プールで実行できるスレッド数を指定する。 ---既定の設定 0 は、CPU あたりの作成可能なスレッド数を制限しない。 ---ただし、作成可能なスレッド数には、CLRのスレッド プールによる制限も適用される。 --requestQueueLimit~ ---ASP.NET のキューに配置できる要求の最大数を指定する。 ---複数の ASP.NET アプリケーションを 1 つのアプリケーション プールでホストする場合、~ そのアプリケーション プールに対する要求の累積数を制限するために使用する。 ---.NET 4 での既定の設定は "5000" ***設定例 [#r58b49bf] 既定値 <configuration> <system.web> <applicationPool maxConcurrentRequestsPerCPU="5000" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000" /> </system.web> </configuration> *applicationHost.config [#udc61300] ApplicationHost.configにも、[[machine.config>#p4535954]]と同様にprocessModelタグがあるが、~ [[machine.config>#p4535954]]のprocessModelタグとは異なり、同時実行制御に関する設定は存在しない。 -applicationPoolのリサイクリングなどの設定ができる。 -同時実行制御に関する設定(maxWorkerThreads等)は存在しない。 **ファイルの場所 [#l7b5e635] %windir%?system32?inetsrv?config\ApplcationHost.config **設定可能な値 [#kea08062] -アプリケーション プールのプロセス モデル設定 processModel~ http://technet.microsoft.com/ja-jp/library/ee431629.aspx >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> *補足 [#l1c21577] **補足1 (統合モード) [#x1c2f262] 統合モードでは ASP.NET アプリケーション キューが使用されないので、 >パフォーマンス カウンター:"ASP.NET Applications\Requests in Application Queue" の値が常に 0 になる **補足2 (IIS 7) [#k1a94dda] IIS 7 は [[Web.config>#nf687ad7]] ファイルのASP.NET 変更通知設定に関係なく、~ [[Web.config>#nf687ad7]] ファイルを監視し、これが変更されると、~ 常に ASP.NET アプリケーションを再起動するため、~ system.web/httpRuntime 構成セクションの -waitChangeNotification -maxWaitChangeNotification 属性の効果がない。 ---- Tags: [[:.NET開発]], [[:ASP.NET]]