MS_ASPNETConfig - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

ASP.NET config

抂芁

同時実行性を向䞊させるためのパラメタに぀いお纏める。

サマリするず以䞋の様になる。

  • IIS 6 以前、IIS 7 以降のクラシック・モヌド
    machine.config に蚭定を行う。

  • IIS 7 以降のクラシック・モヌド.NET 4 以前
    MaxConcurrentRequestsPerCPU レゞストリに蚭定を行う。

  • IIS 7 以降の統合モヌド

    • .NET 3.5 以前
      MaxConcurrentRequestsPerCPU レゞストリに蚭定を行う。

    • .NET 3.5 SP1 以降
      aspnet.config に蚭定を行う。

補足この衚が本ペヌゞの芁: 「どこに蚭定するか」が
IIS のバヌゞョン × パむプラむン モヌド × .NET のバヌゞョンで
倉わる、ずいうのが本ペヌゞの䞻題である。䞀芧にするず次の通り。

IIS モヌド .NET 蚭定堎所
IIS 6 以前  1.1 machine.configprocessModel
IIS 6 以前  2.0+ 自動構成通垞は倉曎䞍芁
IIS 7+ クラシック 〜4 以前 レゞストリMaxConcurrentRequestsPerCPU
IIS 7+ 統合 〜3.5 レゞストリ
IIS 7+ 統合 3.5 SP1 以降 aspnet.configapplicationPool

「昔の蚘事を芋お machine.config をいじったが効かない」
ずいう事故が起きやすいのは、この分岐が理由である。
統合モヌドでは maxWorkerThreads 等が無効になる
埌述の倉曎点。

補足珟圚は、そもそも調敎䞍芁なこずが倚い: 本ペヌゞの調敎は
.NET Framework の同期凊理を前提ずしおいる。

【同期凊理】
   1 リク゚スト  1 スレッドを占有
     → DB や倖郚 API を埅぀間もスレッドが塞がる
     → 同時実行数を䞊げるにはスレッド数を増やすしかない
     → 本ペヌゞのようなチュヌニングが必芁になる

【非同期凊理async/await】
   埅っおいる間はスレッドを解攟する
     → 少ないスレッドで倚数のリク゚ストを捌ける
     → スレッド数の調敎自䜓が䞍芁になる

async/await を䜿うこずが、
スレッド数を増やすより本質的な解決である。
ASP.NET Core では非同期が前提で、
本ペヌゞに盞圓する蚭定項目自䜓がほが存圚しない。

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

蚭定方法

  • 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 以降のバヌゞョンの統合モヌドで実行されおいる堎合は機胜しない。

  • maxconnection
    特定の IP アドレスに察しお確立できる接続の数を蚭定する。
<connectionManagement>
  <add address="*" maxconnection="2">
  <add address="65.53.32.230" maxconnection="12">
</connectionManagement>
  • executionTimeout
    芁求の実行時間を制限する。
<httpRuntime executionTimeout="90"/>

補足maxconnection は珟圚も効く最重芁: 䞊蚘のうち、
maxconnection だけは統合モヌドでも .NET 4.x でも有効であり、
珟圚も実務でハマる蚭定である。

既定倀は「2」HTTP/1.1 の RFC 由来
  → 同䞀ホストぞの同時接続が 2 本に制限される
  → Web API を倧量に呌ぶず、そこがボトルネックになる
  → [async/await](MS_AsyncAwait) にしおも速くならない、ずいう珟象
<system.net>
  <connectionManagement>
    <add address="*" maxconnection="100" />
  </connectionManagement>
</system.net>
// コヌドからも蚭定できる起動時に 1 床だけ
ServicePointManager.DefaultConnectionLimit = 100;

.NET Core / .NET では既定倀が事実䞊撀廃されおおり
SocketsHttpHandler.MaxConnectionsPerServer の既定が int.MaxValue、
この問題は起きない。
.NET Framework から移行する動機の䞀぀でもある。

なお、HttpClient を䜿う堎合は
HttpClient を䜿い回すIHttpClientFactoryこずも重芁である
毎回 new するず゜ケット枯枇を起こす。
詳现は HttpClientの類の䜿い方 を参照。

掚奚蚭定

  • 各パラメタの掚奚蚭定倀
    N物理 CPU の数ではなく、論理 CPU の数

    • maxWorkerThreads、maxIoThreads
      倀を 100 に蚭定既定倀は 20
    • minWorkerThreads
      倀を 50 に蚭定既定では存圚しないため远加が必芁、既定倀は 1
    • minLocalRequestFreeThreads
      76*N に蚭定既定倀は 4
    • minFreeThreads
      倀を 88*N に蚭定既定倀は 8
    • maxconnection
      倀を 12*N に蚭定既定倀は ?
  • 競合削枛のための掚奚スレッド凊理蚭定

第 17 ç«  「.NET アプリケヌション パフォヌマンスのチュヌニング」
https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff647813(v=pandp.10)

構成蚭定 芏定倀 (.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>

補足この掚奚倀は .NET 1.1 時代のもの: 衚の芋出しが瀺す通り、
.NET 1.1 の既定倀に察する掚奚であり、
珟圚の環境にそのたた適甚しおはならない。

・.NET 2.0 以降は自動構成が入り、既定倀自䜓が倉わっおいる
・IIS 7 統合モヌドでは maxWorkerThreads / minFreeThreads が無効
・minFreeThreads を倧きくしすぎるず、
  「空きを確保するために芁求をキュヌに溜める」動䜜により
  かえっおスルヌプットが萜ちる

珟圚の指針は、

  1. たず蚈枬する䞋蚘のパフォヌマンス カりンタヌ
  2. 同期凊理を非同期化するasync/await
  3. それでも足りなければ maxConcurrentRequestsPerCPU を調敎

ずいう順序になる。

カりンタヌ 芋るもの
ASP.NET\Requests Current 凊理䞭 + キュヌ
ASP.NET\Requests Queued キュヌに溜たっおいるか
ASP.NET Apps\Requests/Sec スルヌプット
.NET CLR LocksAndThreads\Contention Rate ロック競合
Process\Thread Count スレッド数

MaxConcurrentRequestsPerCPU レゞストリ

IIS 7 以降のクラシック・モヌド.NET 4 以前

MaxConcurrentRequestsPerCPU 蚭定䞋蚘のレゞストリ蚭定を
䜿甚しおください。

IIS 7 以降の統合モヌド.NET 3.5 以前

IIS 7 以降の統合モヌド.NET 3.5 以前では以䞋のレゞストリ蚭定を䜿甚できる。

倉曎点

統合モヌドでは、ASP.NET スレッド蚭定を䜿甚しお芁求の同時実行性を制埡できない。

  • processModel 構成セクションの
    • maxWorkerThreads 蚭定
  • system.web/httpRuntime 構成セクションの
    • minFreeThreads ず minLocalRequestFreeThreads 蚭定、

は、ASP.NET で䜿甚されるスレッド メカニズムを制埡しなくなりたした。

補足なぜ効かなくなったのか: 統合モヌドでは
ASP.NET が独自のスレッド プヌルを持たなくなったためである。

【クラシック モヌド】
   IIS(w3wp) ──ISAPI──> aspnet_isapi.dll
                            └ ASP.NET 独自のスレッド プヌル
                               ここを machine.config で制埡しおいた

【統合モヌド】
   IIS(w3wp) のパむプラむンに ASP.NET が組み蟌たれる
     → IIS のスレッド プヌルをそのたた䜿う
     → ASP.NET 偎の蚭定は意味を持たない

これは ASP.NET CoreのWebサヌバ で述べた
むンプロセス ホスティングの先祖にあたる構造倉曎
である。
「ASP.NET を IIS のパむプラむンに溶かし蟌む」ずいう方向は、
ASP.NET Core のむンプロセス ホスティングたで䞀貫しおいる。

蚭定方法

その代わり、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>

補足.NET 4 で既定倀が倧幅に緩和された: 既定倀の倉遷が
重芁なので補っおおく。

.NET 3.5 以前 .NET 4 以降
maxConcurrentRequestsPerCPU 12レゞストリ 5000
想定 同期凊理が䞭心 非同期凊理を想定

12 から 5000 ぞの倉曎は、
「.NET 4 で非同期凊理TAPが敎い、
スレッドを占有しない前提に切り替わった」こずを反映しおいる。

このため、.NET 4 以降では通垞この倀を觊る必芁が無い。
觊るずすれば、

  • 同期的にブロックする凊理が倚く、意図的に絞りたい過負荷保護
  • スレッド プヌルの飢逓が起きおおり、キュヌを制限したい

ずいった堎合に限られる。

ASP.NET Core での察応物は次の通り。

目的 ASP.NET Core
同時接続数の制限 KestrelServerLimits.MaxConcurrentConnections
同時実行の制埡 ConcurrencyLimiter ミドルりェア / レヌト制限.NET 7+
キュヌの制限 同䞊QueueLimit
// .NET 7 以降のレヌト制限
builder.Services.AddRateLimiter(o => o.AddConcurrencyLimiter("api", opt =>
{
    opt.PermitLimit = 100;
    opt.QueueLimit  = 50;
}));

applicationHost.config

ApplicationHost.config にも、machine.configず同様に
processModel タグがあるが、
machine.configの processModel タグずは異なり、
同時実行制埡に関する蚭定は存圚しない。

  • applicationPool のリサむクリングなどの蚭定ができる。
  • 同時実行制埡に関する蚭定maxWorkerThreads 等は存圚しない。

ファむルの堎所

%windir%\system32\inetsrv\config\ApplicationHost.config

移行メモ衚蚘: 原文のパスは党角疑問笊?で区切られ、
ファむル名も「ApplcationHost.config」ず綎りが誀っおいたため、
%windir%\system32\inetsrv\config\ApplicationHost.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>

補足性胜に効くのはむしろこちら: 同時実行数より、
アプリケヌション プヌルのリサむクル蚭定の方が
実務では問題になりやすい。

蚭定 既定 泚意点
idleTimeout 20 分 アクセスが無いずプロセスが萜ち、次回が遅い
定期リサむクルperiodicRestart/time 29 時間 毎日ずれた時刻に再起動する意図しない断
startMode OnDemand AlwaysRunning で垞駐させられる
identityType ApplicationPoolIdentity DB ぞ統合認蚌するなら芁怜蚎

**「たたに初回アクセスが極端に遅い」**ずいう症状は、
ほが idleTimeout によるプロセス終了が原因である。

<add name="MyAppPool" startMode="AlwaysRunning">
  <processModel idleTimeout="00:00:00" />        <!-- 無効化 -->
  <recycling>
    <periodicRestart time="00:00:00">            <!-- 時間での再起動を無効化 -->
      <schedule><clear /><add value="03:00:00" /></schedule>  <!-- 深倜に固定 -->
    </periodicRestart>
  </recycling>
</add>

䜵せお Application Initialization事前りォヌムアップを
有効にするず、再起動埌の初回アクセスも速くできる。

補足

補足 統合モヌド

統合モヌドでは ASP.NET アプリケヌション キュヌが䜿甚されないので、

パフォヌマンス カりンタヌ"ASP.NET Applications\Requests in Application Queue"

の倀が垞に 0 になる

補足: 統合モヌドで芋るべきカりンタヌは
ASP.NET\Requests Queuedアプリケヌション単䜍ではなく党䜓である。
「キュヌが 0 だから問題ない」ず誀読しないよう泚意する。

補足 IIS 7

IIS 7 は Web.config ファむルの ASP.NET 倉曎通知蚭定に関係なく、
Web.config ファむルを監芖し、これが倉曎されるず、
垞に ASP.NET アプリケヌションを再起動するため、

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

  • waitChangeNotification
  • maxWaitChangeNotification

属性の効果がない。

補足再起動を匕き起こすもの: web.config 以倖にも、
アプリケヌション ドメむンの再起動を匕き起こす操䜜は倚い。

操䜜 再起動
web.config の倉曎 する本節
bin 内の DLL の倉曎 する
App_Code / Global.asax の倉曎 する
サブフォルダの削陀 する意倖な萜ずし穎
App_Data 内のファむル倉曎 しない

再起動されるず、InProc セッションが党消倱するため、
「本番で web.config を 1 行盎したらログむン䞭のナヌザヌが党郚萜ちた」
ずいう事故に぀ながる。

察策は、

  • セッションを StateServer / SQL Server に倖す
    ASP.NET Coreの分散キャッシュ の
    ASP.NET 版にあたる
  • 蚭定倉曎をリリヌス手順に組み蟌む本番で盎接線集しない

ずいう運甚面の敎備になる。

参考

Microsoft Learn


Tags: 移行, .NET開発, ASP.NET

⚠ **GitHub.com Fallback** ⚠