ãã€ã¯ããµãŒãã¹ã®äžçã§ã¯ãæ°ããæ©èœãè¿œå ããã«ã¯ãæ°ãããµãŒãã¹ãäœæããŸãã åæã«ãæ°ãããŠããããè¿œå ããã³ã¹ãã¯å°ãªããšã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]ã¯ãããã¡ã€ã³ãã¥ãŒãã©ã«ã¢ã»ã³ããªãã®æ¬¡ã®å®çŸ©ãæäŸããŸãã
- åäžã®ã€ã³ã¹ã¿ã³ã¹ã«ååšãã1ã€ã®ããã»ã¹ã®appDomainséã§å ±æãããã¢ã»ã³ããª
- äžåºŠJittããä»ã®appDomainå ±éããŒã¿æ§é ãšå ±æããã¢ã»ã³ããªïŒMethodTablesãMethodDescs
- ã¢ã»ã³ããªãšãã®ãã¹ãŠã®äŸåé¢ä¿ãGACã«é 眮ãããŠããå Žåãã¢ã»ã³ããªã¯ãã¡ã€ã³ãã¥ãŒãã©ã«ã«ãªããŸãïŒGACã«é 眮ã§ããã®ã¯çœ²åæžã¿ã®ã¢ã»ã³ããªã®ã¿ã§ãïŒ
ã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]ã䜿çšããŸãã
ãã€ãã£ãã€ã¡ãŒãžã䜿çšããå©ç¹ããªã¹ãããŸãã
- ããã»ã¹éã§å ±æã§ããŸã
- åäžããã»ã¹ã§ãã¡ã€ã³éã§å ±æã§ããŸã
- JITã³ã³ãã€ã«ãå¿ èŠãšããªãããã䜿çšããRAMãå°ãªã
- JITã³ã³ãã€ã«ãšåå®å šæ§æ€èšŒãå¿ èŠãšããªããããèªã¿èŸŒã¿ãéããªããŸã
眲åæžã¿ã¢ã»ã³ããªãšæªçœ²åã¢ã»ã³ããªã®äž¡æ¹ã§ãã€ãã£ãã€ã¡ãŒãžãäœæã§ããŸãã ãã ãã埮åŠãªéãããããŸããã¢ã»ã³ããªã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ã€å®è¡ããå¿ èŠããããŸãã
- 眲åæžã¿ã¢ã»ã³ããªãGACã«ã¢ããããŒãããŸã
- applicationPoolsã§ã®ãµã€ãçµ±å
- GACã«èªã¿èŸŒãŸããã¢ã»ã³ããªã®ãã€ãã£ãã€ã¡ãŒãžã®äœæ
ãã®çµæã次ã®å³ã衚瀺ãããŸãã
- ç·ãŠã©ãŒã ã¢ããæé2å12ç§
- åèšäœ¿çšã¡ã¢ãª2.2 GB
- 1ã€ã®ãã€ã¯ããµãŒãã¹ã®å¹³åãµã€ãº1.2 GB / 47 = 26.1 Mb
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ã¯ãã€ãã£ãã€ã¡ãŒãžãã£ãã·ã¥ã䜿çšããŸã |
åç §è³æ
- Windows Sysinternals管çè ãªãã¡ã¬ã³ã¹ã 216-218ããŒãž
- http://blogs.microsoft.co.il/sasha/2016/01/05/windows-process-memory-usage-demystified/
- https://blogs.msdn.microsoft.com/junfeng/2004/08/05/domain-neutral-assemblies/
- Pro .NETããã©ãŒãã³ã¹ïŒCïŒã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã ããŒãž289
- ã¯ããã«.NET 4.5 Alex MackeyãWilliam Stewart TullochãMahesh Krishnanã ããŒãž149
- https://technet.microsoft.com/en-us/library/ee790599.aspx
- http://www.microsoftpro.nl/2011/01/27/exporting-and-importing-sites-and-app-pools-from-iis-7-and-7-5/
- https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4
- https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator