Open棟梁Project - マイクロソフト系技術情報 Wiki

-[[戻る>ASP.NET]]

* 目次 [#r25ad339]
#contents

*概要 [#zd5746e8]
同時実行性を向上させるためのパラメタについて纏める。

サマリすると以下の様になる。

-IIS 6 以前、IIS 7 以降のクラシック・モード~
machine.configに設定を行う。

-IIS 7 以降の統合モード
--.NET 3.5 SP1以降~
aspnet.configに設定を行う。

--.NET 3.5 以前~
レジストリに設定を行う。

以下に、Windowsのチューニングの基本的な考え方と纏めておく。

-[[Windows 自動パラメタとチューニング]]

*設定箇所 [#ja63d2b4]
**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

>状況に応じて Machine.config ファイル内の以下のパラメーターを調整する。

--maxWorkerThreads
--minWorkerThreads
--maxIoThreads
--minFreeThreads
--minLocalRequestFreeThreads
--maxconnection
--executionTimeout

-ただし、.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

***ファイルの場所 [#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>

**aspnet.config [#h1f15c0a]
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]
アプリケーション プールのプロセス モデル設定 processModel~
http://technet.microsoft.com/ja-jp/library/ee431629.aspx

***ファイルの場所 [#l7b5e635]
%windir%?system32?inetsrv?config\ApplcationHost.config

***設定方法 [#kea08062]
ApplicationHost.configにも、Machine.configと同様に~
processModelタグがあるが、Machine.configのprocessModelタグとは異なる。
-applicationPoolのリサイクリングなどの設定ができる。
-同時実行制御に関する設定(maxWorkerThreads等)は存在しない。

 <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>

*統合モード(クラシック・モードからの変更点 [#v37ebed8]
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 で使用されるスレッド メカニズムを制御しなくなりました。

その代わり、ASP.NET は IIS スレッド プールに依存し、
-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 キー内の
--MaxConcurrentRequestsPerCPU の DWORD 値 (既定値は 12)

を設定することで、同時実行要求の最大数を制御できるようになりました。

この設定はグローバルなので、
-アプリケーション プールや
-アプリケーションごとに

変更することはできません。

**同時実行性の制御方法 [#h00d0178]
クラシック・モード+.NET 4 以前でアプリケーションの同時実行性を制御するには、

>MaxConcurrentRequestsPerCPU 設定

(上記のレジストリ設定)を使用してください。

***補足1 [#x1c2f262]
統合モードでは ASP.NET アプリケーション キューが使用されないので、

>パフォーマンス カウンター:"ASP.NET Applications\Requests in Application Queue"

の値が常に 0 になる

***補足2 [#k1a94dda]
IIS 7 は web.config ファイルのASP.NET 変更通知設定に関係なく、~
web.config ファイルを監視し、これが変更されると、~
常に ASP.NET アプリケーションを再起動するため、~

system.web/httpRuntime 構成セクションの 
-waitChangeNotification
-maxWaitChangeNotification

属性の効果がない。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS