真正解決ASP.NET每一個頁面首次訪問超級慢的問題

原文:http://www.afuhao.com/article_articleId-219.shtml

摘要:ASP.NET頁面首次打開很慢,但別的頁面如果沒有訪問過,去訪問也會慢。你也許認爲它是在編譯ASPX,或者加載一些東西。不過我發現不是這樣的。

用過ASP.NET的人都知道吧,頁面首次打開很慢。

本來網站第一次啓動就慢,但別的頁面如果沒有訪問過,去訪問也會慢。


好吧,你也許認爲它是在編譯ASPX,或者加載一些東西。

我也這樣認爲過。


不過我發現不是這樣的。

1.bin目錄裏面你放多少它加載多少,如果放一些無效的DLL,比如在32位下面放一些純64位的DLL,就會直接報錯;

2.aspx頁面解析非常快,那麼轉成CS也是一瞬間,編譯更不用說,不應該是卡上2-5秒,1秒是可以接受的;



今天搜索了一下,原來是這樣的:


.net程序第一次運行速度慢的問題原因是第一次運行需要驗證數字簽名。

    當程序裏面需要調用到一些 Authenticode Signed的.NET Assembly的時候,它需要連接到外網來驗證數字證書。當服務器是無法連接到外網時,這個校驗證書的過程需要等到timeout之後纔會結束




那麼要做的就是不讓它幹這些壞事,總之我從來都不覺得它會老老實實的給你服務。


禁止證書的驗證過程:
1、在下面aspnet.config文件中加入下面內容: 
    32位系統:C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet.config
    64位系統:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet.config

   有4.0,甚至4.5的自己多改幾個地方,如果是64位的系統,可能需要以管理員身份打開編輯器,再打開這個文件,否則無法保存的。



[xhtml] 查看源代碼複製打印

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <configuration>   

  3.     <runtime>  

  4.         <generatePublisherEvidence enabled="false"/>  

  5.     </runtime>  

  6. </configuration>  


對"Network Service"帳號下運行的所有程序禁止證書檢查

    不會的話就忽略吧。

    導入以***冊表內容,自己先另存爲*.reg文件吧,如果會手工操作的話,就手工來吧。


[txt] 查看源代碼複製打印

  1. Windows Registry Editor Version 5.00  

  2.   

  3. [HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing]  

  4.   

  5. "State"=dword:00023e00  


然後記得重啓一下應用程序池(實在不知道,就重啓IIS服務),再去看看你的網站,首次加載快嗎?其它頁面訪問快嗎?



忍受不了時,就再也不用忍受!





下面是專業的分析記錄,看不懂就當沒見過吧。。。


[txt] 查看源代碼複製打印

  1. 詳細分析  

  2.   

  3. ==========  

  4.   

  5. 這個時候如果我們抓取一個hang dump的話,頁面所對應的managed callstack往往如下,很明顯它正在加載一個Assembly  

  6.   

  7. 0:022> !CLRStack  

  8.   

  9. OS Thread Id: 0xeb4 (22)  

  10.   

  11. Child-SP RetAddr Call Site  

  12.   

  13. 000000001af1c900 000007fef91747c3 System.Reflection.Assembly.InternalLoad(System.Reflection.AssemblyName, System.Security.Policy.Evidence,  

  14.   

  15. System.Threading.StackCrawlMark ByRef, Boolean)  

  16.   

  17. 000000001af1c990 000007ff0141f0f9 System.Reflection.Assembly.Load(System.Reflection.AssemblyName)  

  18.   

  19. 000000001af1c9d0 000007fef9fdd502 Microsoft.SharePoint.Portal.WebControls.StringResourceManager..cctor()  

  20.   

  21. 000000001af1db50 000007ff014135e2 Microsoft.SharePoint.Portal.WebControls.MySiteLinkUserControl.SetControl()  

  22.   

  23. 000000001af1dce0 000007fef398e04f Microsoft.SharePoint.Portal.WebControls.MySiteLinkUserControl.OnInit(System.EventArgs)  

  24.   

  25. 000000001af1de80 000007fef398f3af System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  26.   

  27. 000000001af1dee0 000007ff014133c8 System.Web.UI.Control.AddedControl(System.Web.UI.Control, Int32)  

  28.   

  29. 000000001af1df50 000007ff0134115e Microsoft.SharePoint.WebControls.DelegateControl.AddControlResilient(System.Web.UI.Control)  

  30.   

  31. 000000001af1dff0 000007fef398fb22 Microsoft.SharePoint.WebControls.DelegateControl.CreateChildControls()  

  32.   

  33. 000000001af1e170 000007ff01341024 System.Web.UI.Control.EnsureChildControls()  

  34.   

  35. 000000001af1e1d0 000007fef398e04f Microsoft.SharePoint.WebControls.DelegateControl.OnInit(System.EventArgs)  

  36.   

  37. 000000001af1e210 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  38.   

  39. 000000001af1e270 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  40.   

  41. 000000001af1e2d0 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  42.   

  43. 000000001af1e330 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  44.   

  45. 000000001af1e390 000007fef398e147 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  46.   

  47. 000000001af1e3f0 000007fef398a935 System.Web.UI.Control.InitRecursive(System.Web.UI.Control)  

  48.   

  49. 000000001af1e450 000007fef398a1f0 System.Web.UI.Page.Proce***equestMain(Boolean, Boolean)  

  50.   

  51. 000000001af1e520 000007fef398a11b System.Web.UI.Page.Proce***equest(Boolean, Boolean)  

  52.   

  53. 000000001af1e580 000007fef398a0b0 System.Web.UI.Page.Proce***equest()  

  54.   

  55. 000000001af1e5e0 000007fef3991557 System.Web.UI.Page.Proce***equest(System.Web.HttpContext)  

  56.   

  57. 000000001af1e640 000007fef395567b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  

  58.   

  59. 000000001af1e6f0 000007fef39634b5 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)  

  60.   

  61. 000000001af1e790 000007fef3954733 System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception)  

  62.   

  63. 000000001af1e840 000007fef3958a54 System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProce***equest(System.Web.HttpContext, System.AsyncCallback,  

  64.   

  65. System.Object)  

  66.   

  67. 000000001af1e8a0 000007fef395863c System.Web.HttpRuntime.Proce***equestInternal(System.Web.HttpWorkerRequest)  

  68.   

  69. 000000001af1e930 000007fef395726c System.Web.HttpRuntime.Proce***equestNoDemand(System.Web.HttpWorkerRequest)  

  70.   

  71. 000000001af1e970 000007fef9fdd502 System.Web.Hosting.ISAPIRuntime.Proce***equest(IntPtr, Int32)  

  72.   

  73. 其實它所要加載的Assembly名字如下  

  74.   

  75. Microsoft.SharePoint.Portal.intl  

  76.   

  77. 此線程所對應的native callstack如下  

  78.   

  79. 0:022> k20  

  80.   

  81. Child-SP RetAddr Call Site  

  82.   

  83. 00000000'1af1a208 000007fe'fdc610ac ntdll!ZwWaitForSingleObject+0xa  

  84.   

  85. 00000000'1af1a210 000007fe'f5dfa2fa KERNELBASE!WaitForSingleObjectEx+0x79 00000000'1af1a2b0 000007fe'f5df76fa cryptnet!CryptRetrieveObjectByUrlWithTimeout+0x263  

  86.   

  87. 00000000'1af1a5b0 000007fe'f5df4646 cryptnet!CryptRetrieveObjectByUrlW+0x20f 00000000'1af1a7a0 000007fe'f5df9c34 cryptnet!RetrieveObjectByUrlValidForSubject+0x162 00000000'1af1a8d0 000007fe'f5df4243 cryptnet!RetrieveTimeValidObjectByUrl+0x2de 00000000'1af1a9c0 000007fe'f5df3c72 cryptnet!CTVOAgent::GetTimeValidObjectByUrl+0x2e3 00000000'1af1ab20 000007fe'f5df38ad cryptnet!CTVOAgent::GetTimeValidObject+0x7cf  

  88.   

  89. 00000000'1af1ad00 000007fe'f5df3810 cryptnet!FreshestCrlFromCrlGetTimeValidObject+0x61  

  90.   

  91. 00000000'1af1ad70 000007fe'f5df99fc cryptnet!CryptGetTimeValidObject+0xb0 00000000'1af1adf0 000007fe'f5df345d cryptnet!GetTimeValidCrl+0x4b7  

  92.   

  93. 00000000'1af1af30 000007fe'f5df3f82 cryptnet!GetBaseCrl+0x7d 00000000'1af1afc0 000007fe'f5df3d58 cryptnet!MicrosoftCertDllVerifyRevocation+0x238  

  94.   

  95. 00000000'1af1b110 000007fe'fdb157c7 cryptnet!CertDllVerifyRevocation+0x28  

  96.   

  97. 00000000'1af1b160 000007fe'fdb1552e crypt32!VerifyDefaultRevocation+0x398 00000000'1af1b250 000007fe'fdb15c09 crypt32!CertVerifyRevocation+0x144  

  98.   

  99. ...  

  100.   

  101. 00000000'1af1bcc0 000007fe'f9e46c27 mscorwks!PEFile::CheckSecurity+0x39b924  

  102.   

  103. 00000000'1af1bd50 000007fe'f9e5eb5d mscorwks!PEAssembly::DoLoadSignatureChecks+0x37  

  104.   

  105. 00000000'1af1bd90 000007fe'f9e52ff8 mscorwks!PEAssembly::PEAssembly+0x12d 00000000'1af1be00 000007fe'f9e40b9d mscorwks!PEAssembly::DoOpen+0x11c 00000000'1af1c130 000007fe'f9f24a3e mscorwks!PEAssembly::Open+0x71  

  106.   

  107. 從這些函數名我們知道它正在做一些證書檢查之類的事情。而實際上它正在等待下面的這個線程。  

  108.   

  109. 0:036> kn  

  110.   

  111. # Child-SP RetAddr Call Site  

  112.   

  113. 00 00000000'2409e1c8 000007fe'fdc610ac ntdll!ZwWaitForSingleObject+0xa  

  114.   

  115. 01 00000000'2409e1d0 000007fe'f5d7f38e KERNELBASE!WaitForSingleObjectEx+0x79  

  116.   

  117. 02 00000000'2409e270 000007fe'f5d80a27 winhttp!IsWpadEnabledForConnectedNetworks+0x1f2  

  118.   

  119. 03 00000000'2409e340 000007fe'f5d806dc winhttp!ReadWinInetProxySettings+0x1c3  

  120.   

  121. 04 00000000'2409e3c0 000007fe'f5dfae42 winhttp!WinHttpGetIEProxyConfigForCurrentUser+0x28a  

  122.   

  123. 05 00000000'2409e510 000007fe'f5df9237 cryptnet!InetGetProxy+0x11e  

  124.   

  125. 06 00000000'2409e600 000007fe'f5df983d cryptnet!InetSendAuthenticatedRequestAndReceiveResponse+0x190  

  126.   

  127. 07 00000000'2409f770 000007fe'f5df9d9c cryptnet!InetSendReceiveUrlRequest+0x57e  

  128.   

  129. .....  

  130.   

  131. 0:036> .frame 7  

  132.   

  133. 07 00000000'2409f770 000007fe'f5df9d9c cryptnet!InetSendReceiveUrlRequest+0x57e [d:\w7rtm\ds\security\cryptoapi\pki\rpor\inetsp.cpp @ 2603]  

  134.   

  135. 0:036> dv  

  136.   

  137. hInetSession = 0x00000000'218211f0  

  138.   

  139. pwszUrl = 0x00000000'1f8abe50 "http://crl.microsoft.com/pki/crl/products/CSPCA.crl"  

  140.   

  141. dwRetrievalFlags = 1  

  142.   

  143. pCredentials = 0x00000000'00000000  

  144.   

  145. pcba = 0x00000000'2409fab0  

  146.   

  147. ppfnFreeObject = 0x00000000'2409fb38  

  148.   

  149. ppvFreeContext = 0x00000000'2409fb30  

  150.   

  151. pAuxInfo = 0x00000000'1f8abd78  

  152.   

  153. phInetRequest = 0x00000000'00000000  

  154.   

  155. 我們可以看到,當時我們抓取dump的時候它正在嘗試連接http://crl.microsoft.com/pki/crl/products/CSPCA.crl 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章