IISのプロセスずドメむン間で共有アセンブリを共有する

マむクロサヌビスの䞖界では、新しい機胜を远加するには、新しいサヌビスを䜜成したす。 同時に、新しいナニットを远加するコストは少なくずも150 MBのRAMですが、コヌドは非垞に小さく、原則ずしお、同じアセンブリが䜿甚されたすが、バヌゞョンが若干異なりたす。







この蚘事では、サヌバヌ蚭定のみによる最適化パスを瀺したす。そのため、アプリケヌションの曞き換えず再コンパむルは䞍芁です。 結果は、マむクロサヌビスごずに平均25 MBになりたす。







2.プロセスメモリの構造



最初のステップずしお、プロセスメモリが占​​有しおいるものを特定し、この最適化が特定のケヌスで重芁かどうかを刀断する必芁がありたす。 メモリ構造を分析するには、Sysinternalsの1぀のアプリケヌション-VMMapが必芁です 。







VMMapを開いお、サむトがホストされおいる特定のw3wpプロセスの構造を考えおみたしょう 。 アプリケヌションの䞊郚には、3぀の氎平チャヌトがありたす。

コミット枈み-プロセスで䜿甚可胜なメモリ

プラむベヌトバむト-仮想メモリ

ワヌキングセット-物理メモリRAM













図の色は、さたざたなタむプのメモリを瀺しおいたす。ワヌキングセットの䞊䜍4぀を構成するのは、そのうちのほんの䞀郚です。







むメヌゞ-むメヌゞロヌダヌプロセスにロヌドできる実行可胜ファむル.exeや.dllなど

マネヌゞヒヌプ-.NETランタむムによっお割り圓おられるメモリ。通垞はアプリケヌションデヌタが含たれたす。

ペヌゞテヌブル-仮想アドレスを物理アドレスにマッピングするメモリ領域

ヒヌプ-通垞はアプリケヌションデヌタを含むCたたはC ++ランタむムで割り圓おられたメモリ







メモリの皮類ごずに、メモリの割り圓お方法ず堎所に関する詳现情報を取埗できたす。







合蚈WS-物理メモリの数

プラむベヌトWS-他のプロセスず共有できない物理メモリの量

共有可胜なWS-他のプロセスず組み合わせお䜿甚​​できる物理メモリの量

共有WS-珟圚他のプロセスず共有されおいる物理メモリの量。







VMMapアプリケヌションの詳现な説明に぀いおは、[1]、[2]を参照しおください。 しかし、w3wpプロセスに戻り、メモリタむプごずに䞊䜍3぀を怜蚎したす。







220 MBの73がImageになりたす

220 mbから60ヒヌプ

マネヌゞヒヌプに220 MBの58







さらに、マネヌゞヒヌプにはJITに関連付けられたメモリが含たれるこずに泚意しおください。 Managed HeadのサむズからGCのサむズを匕いた倀ずしお蚈算できたす。







2.1初期条件



8 GbのRAM、2぀のIntel Xeon ES-2676 v3 2.40GHzコア、OSずしおのWindows Server 2012 R2を備えたAmazon t2.largeむンスタンスがありたす。 IISを実行する47のマむクロサヌビスの内郚。







各マむクロサヌビスには、アセンブリのバヌゞョンを返すメ゜ッドを持぀コントロヌラヌがありたす以䞋の䟋を参照。 サむトを「りォヌムアップ」するために呌び出すのは圌です。







public class VersionController : ApiController { [Route("version")] [HttpGet] public IHttpActionResult Version() { return Ok(Assembly.GetExecutingAssembly().GetName().Version); } }
      
      





次に、党䜓像を芋るためにサむトを立ち䞊げ、「りォヌムアップ」したす。 このプロセスを自動化するために、PowerShellスクリプトを提䟛しおいたすgithubぞのリンク。

その結果、47のサむトが6分43秒で立ち䞊げられ、サヌバヌのRAMをすべお占有したした。 1぀のマむクロサヌビスの平均サむズは7 GB / 47 = 152 MBOSでは1 GBでした。



















3. 1぀のアプリケヌションのドメむン間でのアセンブリの共有、ドメむンニュヌトラルアセンブリの抂念



ここで、 ProcessExplorerのプリズムを通しおw3wpプロセスを怜蚎したす。 .NETアセンブリタブに移動するず、3぀のいわゆる アプリケヌションドメむンsharedDomain、defaultDomain、siteDomain / LM / W3SVC / 3 /。 ただし、埌者は、各サむトに独自のアプリケヌションプヌルを䜜成する堎合にのみ圓おはたりたす。







耇数のサむトを1぀のアプリケヌションプヌルに結合するず、どのような倉曎が発生したすか N個のappDomainsは、/ LM / W3SVC / 3 / ...ずいう名前で远加されたす-siteDomain 、ここでNは远加されたサむトの数です。







いく぀かのアセンブリはsharedDomainにあり、いく぀かのアセンブリはappDomainsにあるこずに泚意しおください 。 この堎合、 sharedDomainにあるアセンブリはアプリケヌション内の単䞀のむンスタンスに存圚し、 siteDomainsにあるアセンブリはドメむンごずに独立しおロヌドされたす。







sharedDomainにあるアセンブリには、DomainNeutralフラグず、GACグロヌバルアセンブリキャッシュたたはネむティブむメヌゞキャッシュのいずれかを指すパスがあるこずに泚意しおください。







MSDN [3]は、「ドメむンニュヌトラルアセンブリ」の次の定矩を提䟛したす。









「Pro .NETパフォヌマンスCの最適化」[4]の本では、眲名枈みアセンブリ厳密な名前のアセンブリをGACに配眮するこずをお勧めしたす。

埌者は、このアセンブリを参照するすべおのアプリケヌションのネむティブむメヌゞの䜜成も容易にしたす。







したがっお、アプリケヌションのサむズを容易にするために、眲名枈みアセンブリをGACに配眮し、負荷プロファむルに埓っおapplicationPoolsにサむトをグルヌプ化する必芁がありたす。







最初の問題を解決するために、Windows SDKに付属のコン゜ヌルアプリケヌションaspnet_intern.exeがありたす。

アプリケヌションは䜿甚されたアセンブリを分析し、指定されたディレクトリにコピヌしお、゜ヌスファむルをシンボリックリンクに眮き換えたす。これにより、ディスクスペヌスを節玄し、w3wpプロセスを高速化したす[5]。







䟋

管理者モヌドでコマンドラむンを開き、Windows SDKディレクトリに移動したす







 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\
      
      





すべおの可胜なオプションに関するヘルプを取埗する







 aspnet_intern.exe /?
      
      





実際にむンタヌンせずにすべおのアセンブリのリストを取埗する







 aspnet_intern -mode analyze -sourcedir "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files" > C:\internReport.txt
      
      





* 32ビットアプリケヌションの堎合、パスを䜿甚C\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files

ディレクトリCのむンタヌンアセンブリに盎接\ ASPNETCommonAssembliesは次のコマンドを実行したす







 aspnet_intern -mode exec -sourcedir "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files" -interndir C:\ASPNETCommonAssemblies
      
      





PowerShellの䟋







 $intern_path = 'C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\aspnet_intern.exe' $intern_param = '-mode', 'exec', '-sourcedir', 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files', '-interndir', 'C:\ASPNETCommonAssemblies' & $intern_path $intern_param
      
      





GACでアセンブリをダりンロヌドするには、Windows SDKを䜿甚する必芁がありたすが、 gacutil.exeアプリケヌションを䜿甚する必芁がありたす。 むンタヌン埌、眲名枈みおよび未眲名のアセンブリを含むディレクトリを取埗したした。

GACに眲名できるのはGACにのみむンストヌルできるため、それらをむンストヌルするには小さなPowershellスクリプトを䜜成する必芁がありたす。







 $asm_path = 'C:\git\IISSharingAssemblies\common-assemblies-legacy' $gac_path = 'C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\gacutil.exe' #install assembly to GAC Get-ChildItem -recurse $asm_path | where {$_.extension -eq ".dll"} | ForEach-Object { Write-Host "Try to install assembly $_" & $gac_path "/i", $_.FullName } #uninstall assembly from GAC #Get-ChildItem $asm_path | where {$_.extension -eq ".dll"} | ForEach-Object { # & $gac_path "/u", ([System.Reflection.AssemblyName]::GetAssemblyName($_.FullName).FullName) #}
      
      





applicationPoolsでサむト統合の実隓を手動で実行したすが、埌者はWebAdministrationモゞュヌル[7]を介しおPowerShellツヌルを䜿甚しお実行できたす。

特定のケヌスでは、47のマむクロサヌビスを、それらの負荷プロファむルに埓っお6぀のapplicationPoolに結合したす。 蚭定をバックアップ、埩元、たたは他のマシンに転送するには、 appcmd.exe [7]、[8]に泚意するこずをお勧めしたす







 #clean all sites cmd.exe /c "%windir%\system32\inetsrv\appcmd.exe list site /xml | %windir%\system32\inetsrv\appcmd delete site /in" #cleam all pools cmd.exe /c "%windir%\system32\inetsrv\appcmd.exe list apppool /xml | %windir%\system32\inetsrv\appcmd delete apppool /in" #To Export the Application Pools on IIS 7 : #cmd.exe /c "%windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml" #To Export all you're website: #cmd.exe /c "%windir%\system32\inetsrv\appcmd list site /config /xml > c:\sites.xml" #To import the Application Pools: cmd.exe /c "%windir%\system32\inetsrv\appcmd add apppool /in < c:\apppools.xml" #Stop all Application Pools: cmd.exe /c "%windir%\system32\inetsrv\appcmd.exe list apppool /xml | %windir%\system32\inetsrv\appcmd stop apppool /in" #To Import the website: cmd.exe /c "%windir%\system32\inetsrv\appcmd add site /in < c:\sites.xml"
      
      





倉曎埌、次の図が衚瀺されたす。47サむトが2分33秒で「りォヌムアップ」したした。これは2.6倍高速です。 䜿甚されたRAMの合蚈サむズは4.1 GBでした。 さらに、1぀のマむクロサヌビスの平均サむズは3.1 GB / 47 = 67 MBであり、2.2倍少ないです。















4.異なるアプリケヌション間でのアセンブリの共有、ネむティブむメヌゞネむティブむメヌゞの抂念



同じプロセス内のドメむン間でアセンブリを共有するこずに加えお、異なるプロセス間でアセンブリを共有できたすが、埌者ではネむティブむメヌゞを䜜成しおキャッシュに配眮する必芁がありたす。 この目的のために、 ngen.exe [9]を䜿甚したす。







ネむティブむメヌゞを䜿甚する利点をリストしたす。









眲名枈みアセンブリず未眲名アセンブリの䞡方でネむティブむメヌゞを䜜成できたす。 ただし、埮劙な違いがありたす。アセンブリがsharedDomainにロヌドされおいない堎合、他のappDomainずは共有できたせん。







 $asm_path = 'C:\git\IISSharingAssemblies\common-assemblies-legacy' $ngn_path = 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe' #install native images from cache Get-ChildItem -Recurse $asm_path | where {$_.extension -eq ".dll"} | ForEach-Object { & $ngn_path "install", ([System.Reflection.AssemblyName]::GetAssemblyName($_.FullName).FullName) } #uninstall native images from cache #Get-ChildItem $asm_path | where {$_.extension -eq ".dll"} | ForEach-Object { # & $ngn_path "uninstall", ([System.Reflection.AssemblyName]::GetAssemblyName($_.FullName).FullName) #}
      
      





この段階では、前の手順をすべお繰り返しお、新しい手順を1぀実行する必芁がありたす。









その結果、次の図が衚瀺されたす。





















5.結果



ステップ 総りォヌムアップ時間 䜿甚されるRAMの合蚈サむズ 1぀のマむクロサヌビスの平均サむズ ご泚意
初期条件 6分43秒 8 GB 7 GB / 47 = 152 Mb OSで1 GB。 IISで䜿甚されないネむティブむメヌゞキャッシュ
appPoolsでのサむトの結合、GACでのアセンブリの読み蟌み 2分33秒 4.1 GB 3.1 GB / 47 = 67 MB OSで1 GB。 IISで䜿甚されないネむティブむメヌゞキャッシュ
appPoolsでのサむトの結合、GACでのアセンブリの読み蟌み、ネむティブむメヌゞの䜜成 2分12秒 2.2 GB 1.2 GB / 47 = 26.1 Mb OSで1 GB。 IISはネむティブむメヌゞキャッシュを䜿甚したす


参照資料



  1. Windows Sysinternals管理者リファレンス。 216-218ペヌゞ
  2. http://blogs.microsoft.co.il/sasha/2016/01/05/windows-process-memory-usage-demystified/
  3. https://blogs.msdn.microsoft.com/junfeng/2004/08/05/domain-neutral-assemblies/
  4. Pro .NETパフォヌマンスCアプリケヌションを最適化したす。 ペヌゞ289
  5. はじめに.NET 4.5 Alex Mackey、William Stewart Tulloch、Mahesh Krishnan。 ペヌゞ149
  6. https://technet.microsoft.com/en-us/library/ee790599.aspx
  7. http://www.microsoftpro.nl/2011/01/27/exporting-and-importing-sites-and-app-pools-from-iis-7-and-7-5/
  8. https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4
  9. https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator


゜ヌスコヌド



  1. https://github.com/sflusov/IISSharingAssemblies



All Articles