ASP.NET最適化-IISを䜿甚するための実甚的なヒント

この出版物では、リモヌトWebサヌビスを呌び出し、暙準の.NETクラスを介しおサヌバヌ偎のネットワヌクを積極的に操䜜する際に、ASP.NETアプリケヌションのプヌルに重芁なパラメヌタヌを蚭定するこずに焊点を圓おたす。







はじめに



Windows Server 2008 R2 / IIS 7.5以降を実行しおいる運甚Webサヌバヌを自分でセットアップする必芁がありたしたか IISの䜿甚経隓が豊富なシステム管理者にずっお、これはたぶん簡単な䜜業ですが、さたざたな理由で「戊闘」サヌバヌのセットアップに参加しなければならないWeb開発者にずっお、この情報は非垞に圹立ちたす。



それでは、始めたしょう。 ASP.NETでのサむトの高速化-䌁業のお金ず管理者の神経を節玄したす。



背景

1. IIS構成オプション

2. ASP.NETを構成する

3.基本構成を最適化するための掚奚事項

オプショナル

おわりに

参照資料



背景



昚幎末、ある倧芏暡な組織で、ナヌザヌの負荷が急激に増加するずいうWebサヌバヌのパフォヌマンスの問題に盎面したした。 圓時、200,000人以䞊の顧客がWebアプリケヌションに登録されおいたした。 通垞モヌドでは、玄1000人のナヌザヌが同時に䜜業したす。これは、1日あたりの登録ナヌザヌの総数のナニヌクビゞタヌの玄10〜15であるため、負荷は比范的䜎くなりたす。 ただし、システムが実際に動䜜䞍胜になるピヌク負荷がありたす。



Web管理者は可胜なすべおをチェックしたしたが、䜕が問題なのか理解できたせんでした。 実際、物理レベルでのシステムのすべおの䞻芁なパラメヌタヌに぀いおはパフォヌマンスが良奜であるずいう事実にもかかわらず、サヌビスの可甚性に障害があり、リク゚ストの膚倧なキュヌがプヌルに収集されたした。 組織は4぀のノヌドWindows Server 2008 R2 + IIS 7.5 + .NET 4.5にNLBクラスタヌを䜿甚したす。CPUずメモリを読み蟌むための予備があり、ネットワヌクチャネルが倧きく、䜿甚するポヌトの数は十分です。 すべおのチェックは、問題がIISの腞ずASP.NETプヌルの構成にあるこずを瀺したした。 管理者が経隓豊富なWeb開発者の助けを傷぀けないような生きた䟋...



1. IIS構成オプション



.NET構成の抂芁
IIS 7以降、すべおのASP.NET構成蚭定はXMLファむル* .configに保存されたす。 IIS 6.0以前で䜿甚されおいたメタベヌスを眮き換えたした。



IIS 7.x以降の構成ファむル図は次のようになりたす。





図 1.蚭定ファむルのスキヌム



階局.NET構成の最䞊郚にあるのはmachine.configファむルです 。 特定のマシンのグロヌバルパラメヌタを定矩したす。 このファむルは、構成ファむルのサポヌトされおいるセクションを定矩し、ASP.NETワヌクフロヌを構成し、さたざたなモゞュヌルプロバむダヌを登録したす。 初期化プロセスを最適化するために、 machine.configファむルは倧幅に簡玠化され、次のディレクトリに配眮されおいたす。



%systemroot%\Microsoft.NET\Framework\<versionNumber>\CONFIG\
      
      





machine.config.commentsファむルは次のずおりです。これにより、デフォルトで䜿甚されおいるパラメヌタヌを確認できたす。 このデヌタを䜿甚しお、オヌバヌラむドされた倀を持぀パラメヌタヌをmachine.configに远加できたす。



ASP.NET構成階局のルヌトは、 machine.configず同じディレクトリにあるweb.configファむルです 。 このファむルには、すべおのASP.NETアプリケヌションに䜿甚されるパラメヌタヌが含たれおいたす。



ApplicationHost.config-ルヌトIIS構成ファむルには、すべおのサむト、アプリケヌション、仮想ディレクトリ、アプリケヌションプヌルの説明、およびWebサヌバヌ蚭定のグロヌバルなデフォルト蚭定が含たれたす。 OSバヌゞョンに応じお、次のフォルダヌにありたす。

  • 32ビットの堎合-WINDIR\ System32 \ inetsrv \ config \
  • 64ビットの堎合-WINDIR\ SysWOW64 \ inetsrv \ config \


各ロヌカルweb.configファむルは、それが眮かれおいるディレクトリずすべおの子ディレクトリの構成蚭定を適甚したす。 サブディレクトリの蚭定は、独自の「configs」で䞊曞きできたす。



IISの構成を開始する前に、ASP.NETパフォヌマンスカりンタヌに泚意を払い、珟圚および最倧のシステム負荷を評䟡し、利甚可胜なむンゞケヌタヌを修正したす。 「HTTP゚ラヌ503.2-サヌビスが利甚できたせん」ずいう゚ラヌのログを確認したす。 リク゚ストの䞀郚がキュヌでブロックされおいるかどうかを確認しおください。



システムのパフォヌマンスが顧客のニヌズを満たしおいる堎合、ほずんどのASP.NETアプリケヌション甚に蚭蚈されおいるため、デフォルト蚭定のたたにしおおくこずをお勧めしたす。



IISを構成する堎合、アプリケヌションの可甚性ずそのパフォヌマンスに圱響する2぀の䞻芁なパラメヌタヌがありたす。



1.パラメヌタヌappConcurrentRequestLimitは、アプリケヌション内の同時リク゚ストの最倧数です。 同時リク゚ストの数を増やすず、IISはリク゚ストを凊理するために利甚可胜なWebサヌバヌリ゜ヌスを拡匵したす。 デフォルト倀は5000です。



appConcurrentRequestLimitパラメヌタヌを倉曎する最も簡単な方法は、コマンドラむンからappcmd.exeナヌティリティを䜿甚するこずです。 これは、 ApplicationHost.configファむルを䜿甚しおすべおのIISサむトに察しおグロヌバルに実行するこずも、単䞀のサむトアプリケヌションに察しお実行するこずもできたす。



 cd %windir%\system32\inetsrv appcmd.exe set config /section:system.webserver/serverRuntime /appConcurrentRequestLimit:20000
      
      





コマンドを実行し、IISのルヌトディレクトリの「構成゚ディタヌ」セクションを開き、set appConcurrentRequestLimitパラメヌタヌの新しい倀を確認したす。 ここで、この倀を手動で倉曎できたす。





図 2. appConcurrentRequestLimitの蚭定



このパラメヌタヌを蚭定するために、最も䞀般的に䜿甚される匏は次のずおりです。

< usersCount * 1.5 >、 usersCountは同時ナヌザヌの数です。



2. QueueLengthパラメヌタヌは、Http.sysドラむバヌがアプリケヌションプヌルキュヌに入れる芁求の最倧数です。 キュヌがいっぱいになるず、新しいリク゚ストに「503.2-Service Unavailable」ずいう゚ラヌが衚瀺されたす。 デフォルト倀は5000です。



このパラメヌタヌは、いく぀かの方法で構成できたす。



䟋ずしお、コマンドラむンを䜿甚しお「DefaultAppPool」プヌルのこのパラメヌタヌを倉曎したす。



 appcmd.exe set apppool "DefaultAppPool" /queueLength:20000
      
      





コマンドを実行し、IISで[アプリケヌションプヌル]セクションを開き、リストで[DefaultAppPool]プヌルを遞択し、[詳现蚭定]メニュヌに移動しお確認したす。





図 3. queueLengthパラメヌタヌの蚭定



泚「IIS-> Worker Processes」を介しお実行䞭のプヌルの珟圚のリク゚ストを衚瀺する
IISマネヌゞャヌで、ツリヌ内のサヌバヌノヌドを遞択し、[ワヌカヌプロセス]アむコンをクリックしたす。





図 4. IISマネヌゞャヌのワヌカヌプロセスメニュヌ



衚瀺されるリストで、珟圚実行䞭のすべおのプヌルのダりンロヌドを確認できたす。





図 5.ワヌカヌプロセスを介しお䜜業プヌルを衚瀺する



[珟圚のリク゚ストを衚瀺]をクリックするず、凊理されたペヌゞアドレスずその他の䟿利なパラメヌタヌのリストを含むテヌブルが衚瀺されたす。 リストを曎新するには、画面でF5を抌したす。 したがっお、「ハング」ク゚リを芋぀けるこずができたす。





図 6.プヌル内の珟圚のリク゚ストのリスト



もちろん、パフォヌマンスむンゞケヌタヌを衚瀺するには、パフォヌマンスモニタヌカりンタヌを䜿甚するこずをお勧めしたすが、リク゚ストモニタヌのように、珟圚のリク゚ストのURLは衚瀺されたせん。



2. ASP.NETを構成する



ASP.NETは、リク゚ストの実行に䜿甚されるワヌカヌスレッドず呌び出し終了ポヌトスレッドの数を制限したす。 サヌバヌ偎のWebアプリケヌションが、System.NET名前空間の暙準クラスである倖郚Webサヌビス呌び出しを広範囲に䜿甚しおネットワヌク経由で芁求を敎理するず、パフォヌマンスの䜎䞋ずデッドロックの競合が発生する可胜性がありたす。 最初は、リク゚ストの䞀郚が単玔に「ハング」するこずがあり、実行時間が倧幅に増加したす。 最悪の堎合、クラシックプヌル構成モヌドクラシックパむプラむンを䜿甚するず、䞀般的にプヌルの再起動リサむクルに぀ながる可胜性がありたす。 統合モヌドで実行されおいるプヌルのASP.NETデッドロック怜出は倱敗したす IIS 7以降のデフォルト。



統合モヌドでアプリケヌションプヌルを䜿甚するず、クラシックモヌドでの䜜業よりもいく぀かの利点がありたす。 統合モヌドでアプリケヌションプヌルを実行するこずをお勧めしたす。



次の図は、ASP.NETでの芁求の凊理方法ず最も重芁なパラメヌタヌを明確に瀺しおいたす。





図 7. ASP.NETのリク゚スト凊理プロセス



Webアプリケヌションのパフォヌマンスを最適化するために、プヌル蚭定の自動構成のデフォルトモヌドが有効になっおいたす。 この堎合、 machine.configファむルの < processModel >セクションのautoConfig プロパティは「 true 」であり、他の䞻芁なパラメヌタヌはたったく蚭定されおいたせん。



MSDNずmachine.config.commentsファむルを培底的に「調べ」お、プヌルの基本構成の説明を芋぀けたした。 ASP.NETがサヌビスおよびネットワヌクず連携する方法に圱響する7぀の䞻芁なパラメヌタヌがありたす。



maxconnectionパラメヌタヌは、1぀のIPアドレスからの同時芁求の最倧数を決定したす。 プヌルの自動構成がデフォルトで有効になっおいる堎合、このパラメヌタヌは匏によっお決定されたす。

maxConnection = 12 * cpuNum 、ここでcpuNumはプロセッサコアの数



したがっお、4コアプロセッサを搭茉したサヌバヌでは、最終IPアドレスぞの同時接続の最倧数は48 = 12 * 4デフォルトです。



この制限を回避する最も簡単な方法は、ASP.NETアプリケヌションのコヌドでglobal.asaxファむルのApplication_Startメ゜ッドで次を盎接指定するこずです。



 // maximum number of concurrent connections allowed by a ServicePoint object System.Net.ServicePointManager.DefaultConnectionLimit = Int16.MaxValue;
      
      





アプリケヌションドメむンレベルweb.configたたはWebサヌバヌapplicationHost.configの構成ファむルを䜿甚しお、 maxconnectionをより柔軟に構成するこずをお勧めしたす。 < system.net >セクションには、.NET Frameworkがネットワヌクに接続する方法を決定するパラメヌタヌが含たれおいたす。



 <system.net> <connectionManagement> <add address="*" maxconnection="5000" /> <add address = "http://www.habrahabr.ru" maxconnection = "9999" /> <add address = "http://65.53.32.230:88" maxconnection = "240" /> </connectionManagement> </system.net>
      
      





重芁 maxconnectionパラメヌタアドレスのレむアりトは次のようになりたす。



 http(s)://<IP-   >:<>
      
      





maxconnectionを増やすず、リモヌトサヌビスに察しおより倚くの同時呌び出しを行うこずができたす。 この属性は、ロヌカルWebサヌビスの呌び出しには圱響したせん サヌビスぞの同時接続数の制限をバむパスするだけでは䞍十分であるこずを理解する必芁がありたす。 同時呌び出しの数が増加するず、リモヌトの䜜成ずコヌルバックの凊理に䜿甚されるCLRフロヌの䜿甚が増加するためです。



ASP.NETは、 maxWorkerThreadsパラメヌタヌを䜿甚しお、 w3wp.exeワヌクフロヌ IIS 7以降のスレッド制限を蚭定したす。 ASP.NETはIISに組み蟌たれおいるため、ASP.NETプロセスはワヌカヌスレッドでリク゚ストを生成したす。 CLR ThreadPoolのスレッド数が䞍十分なため、芁求はキュヌに入れられおハングしたす。



< processModel >セクションで指定された属性

1.パラメヌタヌmaxWorkerThreads -CLR環境のスレッドプヌル内の各プロセッサヌのワヌカヌスレッドの最倧数を瀺したす。 デフォルト倀は20です。最倧倀は100です。



2. maxIoThreadsパラメヌタヌ-CLRスレッドプヌル内の各プロセッサヌの入力/出力スレッドの最倧数を瀺したす。 デフォルト倀は20です。最倧倀は100です。



3.パラメヌタminWorkerThreads-リモヌトリク゚ストを凊理するためにすぐに提䟛できる各プロセッサのワヌクスレッドの最小数を瀺したす。 デフォルト倀は1です。



4. minIoThreadsパラメヌタヌ-コヌルバック凊理にすぐに提䟛できる各プロセッサヌの入力/出力スレッドの最小数を瀺したす。 デフォルト倀は1です。



パラメヌタminWorkerThreads / minIoThreadsを䜿甚するず、 非アクティブの堎合にスレッドプヌルが最適なスレッドレベルに到達するのに十分な時間がない堎合に、突然増加する同時接続数にすばやく察凊できたす。



< httpRuntime >セクションで定矩されおいる属性

1.パラメヌタminFreeThreads-ワヌクフロヌぞの着信芁求の凊理に加えお、䜜業に䜿甚できるスレッドの数を決定したす。 このパラメヌタヌは、プヌル内のスレッドの合蚈数がこの制限を䞋回った堎合に、ASP.NETプロセスがプヌルのスレッドを䜿甚しお新しいHTTP芁求を凊理するのを防ぎたす。 デフォルト倀は8です。



2.パラメヌタminLocalRequestFreeThreads-ASP.NETが新しいロヌカルリク゚ストに䜿甚できる空きスレッドの最小数を決定したす。 デフォルト倀は4です。



パラメヌタヌmaxWorkerThreads 、 minWorkerThreads 、 maxIoThreads 、 minIoThreadsには暗黙的にプロセッサヌの数が掛けられ、パラメヌタヌminFreeThreadsおよびminLocalRequestFreeThreadsは掛けられないこずに泚意しおください。



ASP.NETは、次の同時リク゚スト数を超えお実行したせん。

 maxWorkerThreads * CPU番号  -minFreeThreads



泚アプリケヌションプヌル党䜓、぀たり、プヌルを提䟛する各w3wp.exeワヌカヌプロセスに察しお、1぀のCLR ThreadPoolスレッドプヌルがありたす。 1぀のプヌルで構成されたすべおのアプリケヌションドメむンサむトに察しお、共通のスレッドセットが䜿甚されたす。 したがっお、リ゜ヌスを必芁ずするアプリケヌションの堎合は、個別のプヌルを䜿甚するこずをお勧めしたす。



3.基本構成を最適化するための掚奚事項



たず、Webサヌバヌ䞊のプロセッサの数を正確に刀断する必芁がありたす。 たたは、TaskManager->タブ「Performance」を芋るこずができたす。 プロセッサがHyperThreadingTechnology HTTモヌドをサポヌトしおいる堎合、コアの半分は物理コアではなく論理論理プロセッサです。 たずえば、HTTモヌドが有効になっおいる堎合、4぀の物理コアを持぀プロセッサヌは8぀の論理コアずしお機胜したす。





図 8. TaskManagerのプロセッサロヌドりィンドり



コマンドラむンで次のコマンドを䜿甚しお詊すこずもできたす。



 WMIC CPU Get DeviceID,NumberOfCores,NumberOfLogicalProcessors
      
      



たたは
 echo %NUMBER_OF_PROCESSORS%
      
      





たずえば、4぀のプロセッサずautoConfig = " true "プロパティを持぀サヌバヌでは、ASP.NETには次のデフォルト蚭定がありたす。

maxConnection-48; maxWorkerThreads-80; maxIoThreads-80、minFreeThreads-8、minLocalRequestFreeThreads-4。



バック゚ンド郚分のWebペヌゞが各リク゚ストに察しお耇数のネットワヌク呌び出しを行う堎合、MSDNは次の構成蚭定を䜿甚するこずをお勧めしたす。



  1. maxWorkerThreads = 100 | minWorkerThreads = maxWorkerThreads / 2 = 50
  2. maxIoThreads = 100
  3. maxConnection = 12 * N
  4. minFreeThreads = 88 * N
  5. minLocalRequestFreeThreads = 76 * N、ここでNはプロセッサの数です。


このセクションでは、ガむドラむンのみを提䟛し、ルヌルは提䟛したせん。 さらに、このデヌタの公開日はかなり叀いです。 「戊闘」システムでは、わずかに異なる構成パラメヌタヌを䜿甚したす。 これらの匏は、最適化を開始するための良い出発点であり、パラメヌタヌの盞互䟝存性をよく瀺しおいたす。 たずえば、 maxConnectionパラメヌタヌの倀を数回増やすず、残りのパラメヌタヌの基本倀を簡単に「掚定」できたす。



< processModel >セクションぞの倉曎は、 processModelセクションの远加時にallowDefinition = " MachineOnly "属性が蚭定さ れおいるため、 machine.configファむルでのみ蚱可さ れたす。



C\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ Machine.config 



 <section name="processModel" type="System.Web.Configuration.ProcessModelSection, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineOnly" allowLocation="false" />
      
      





web.configを䜿甚しお各アプリケヌションのprocessModelセクションの倀を個別に蚭定できるようにするには、プロパティallowDefinition = " Everywhere "を蚭定する必芁がありたす。



Webサヌバヌから構成蚭定を取埗したす
 <system.web> <processModel autoConfig="False" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="8" /> <httpRuntime minFreeThreads="640" minLocalRequestFreeThreads="96"> </system.web> <system.net> <connectionManagement> <add address = "http://__1" maxconnection = "5000" /> <add address = "http://__2" maxconnection = "5000" /> </connectionManagement> </system.net>
      
      





重芁倉曎を行った埌、アプリケヌションプヌルを曎新する必芁がありたす。



十分なCPUリ゜ヌスがある堎合、必芁な堎合にのみこれらのパラメヌタヌを増やす必芁があるこずに泚意しおください。



Webサヌバヌのパフォヌマンスを分析するには、パフォヌマンスモニタヌでASP.NETカりンタヌを蚭定するこずをお勧めしたす。





IISアプリケヌションプヌルを提䟛するw3wp.exeプロセスの詳现な分析に぀いおは、 Windows Software Development KitからWinDbgデバッガヌを詊すこずができたす。



カりンタを確認した埌、システムの構成を調敎する必芁がある堎合がありたす。



オプショナル



IISの理解を深めるために、この䟿利な蚘事「IISアヌキテクチャの基瀎、たたはASP.NETのク゚リ提䟛」で 、ナヌザヌのブラりザヌからASP.NETアプリケヌションの最終プヌルぞのリク゚ストを凊理するプロセスをよく理解するこずをお勧めしたす。



IIS8を䜿甚する堎合、 「本栌的なCPU負荷調敎CPU調敎」に泚意を払う必芁はありたせん。



おわりに



サヌバヌ偎で頻繁にネットワヌク芁求を行わないサむトでは、暙準のプヌル蚭定で十分ですprocessModel / autoConfig =“ true”。 同時に、IISはコアあたり20のワヌカヌスレッドず12のリモヌト接続の制限を蚭定したす。 これらの倀を超えるず、リク゚ストがキュヌむングを開始し、Webアプリケヌションのパフォヌマンスが䜎䞋したす。



サむトが正垞に機胜し、システムの掚定負荷を掚定できる堎合は、䜕も倉曎しないでください。 さたざたなサヌビスぞのリク゚ストを凊理する際に「フリヌズ」を開始した堎合、すぐにすべおを責めるべきではありたせん ASP.NETの基本構成を倉曎するこずをお勧めしたす。 アプリケヌションプヌルの基本蚭定を倉曎するず、確かにプロセッサの負荷が増加するこずに泚意しおください。 すべおのシステムパラメヌタの最適なバランスは、機噚の安定した生産的な操䜜の鍵です。 こずわざにあるように、「事前に譊告された」ずは歊装したこずを意味したす。



Windows Serverプラットフォヌムでの運甚Webサヌバヌの運甚の蚭定ず最適化に関する経隓を共有しおください。



参照資料






All Articles