KB-Watch Out For The SPVirtualPathProvider
公司的Sharepoint Portal(現在應該叫MOSS,但我老覺得會跟摩斯漢堡搞混)上線後,效能一直不太理想。
在Portal中,我們有另外開發了一些Web Application程式,有ASP也有ASPX,掛在SPS的網站下建成Virtual Directory。結果一到尖峰時間,偶爾會發生所有的ASP/ASPX網頁就會傳回"Out of Memory"錯誤的狀況,但實際上w3wp.exe的記憶體用量大約在800M左右,整台機器的記憶體也還有剩,不像是記憶體真的耗盡,這些錯誤會在IISRESET後恢復正常,然後又可以再撐個一兩天。
由於沒有明確的Capacity數據可以參照,我們不確定是機器不夠力還是系統沒調好,只好且戰且走... 直到有一天在Event Log中看到一個怪異的ASP.NET 2.0 Error。
Event code: 3008
Event message: A configuration error has occurred.
Event time: 8/23/2007 12:53:03 PM
Event time (UTC): 8/23/2007 4:53:03 AM
Event ID: 19a6172d33a84ca299e93af831c8fe0b
Event sequence: 240346
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/1481090595/ROOT/NEWOA-1-128322900009164404
Trust level: Full
Application Virtual Path: /Blah
Application Path: D:\WWW\Blah\Boo\
Machine name: MOSSWEB1
Process information:
Process ID: 6000
Process name: w3wp.exe
Account name: MyDomain\SPSAccount
Exception information:
Exception type: ConfigurationErrorsException
Exception message: Could not create Windows user token from the credentials specified in the config file. Error from the operating system 'The parameter is incorrect.
' (c:\spsweb\protal\web.config line 122)
Request information:
Request URL: http : //mossweb1.corp.com.tw/Blah/Images/Brown80.jpg
Request path: /Blah/Images/Brown80.jpg
User host address: 192.168.1.160
User:
Is authenticated: False
Authentication Type:
Thread account name: MyDomain\SPSAccount
Thread information:
Thread ID: 67
Thread account name: MyDomain\SPSAccount
Is impersonating: False
Stack trace: at System.Web.Configuration.IdentitySection.InitializeToken()
at System.Web.Configuration.IdentitySection.get_ImpersonateToken()
at System.Web.HttpContext.get_ImpersonationToken()
at System.Web.ClientImpersonationContext.Start(HttpContext context, Boolean throwOnError)
at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean isThreadStateInitialized, Boolean setImpersonationContext)
at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error)
Custom event details:
啥? 只不過是JPG檔,怎麼也跟ASP.NET 2.0扯上關係?
後來,同事小熊子找到一個關鍵設定,原來WSS 3.0有個新設計,叫做SPVirtualPathProvider,它可以由WSS資料庫讀出檔案,有點URLRewrite的味道。但是他做了一個討厭的設定:
如上圖,所有掛在Sharepoint網站下的Virtual Dirctory都會繼承這個設定,Wildcard Application Maps意味著對任何檔案(包含htm, jpg, png, zip, ...)都要先透過ASP.NET檢查,這似乎就解釋了上面看到的那筆詭異JPG + ASP.NET 2.0 Error Event。
連jpg, css都需要經過ASP.NET來跑,會不會比較耗效能呢? 於是我用ACT(Application Center Test)做了多Thread連續讀取同一JPG檔的壓力測試,其中藍線為設定Wildcard Application Maps的情況,紫線是移除後的結果。實驗證明,關閉Wildcard Application Mapping後速度上升了約兩倍。
這個Wildcard Application Maps的效能殺傷力真有這麼恐怖? 我沒有足夠的證據/理論可以做此判決,至少,在關閉Sharepoint下這些自訂Web Application的該設定後,已經好久沒有看到Out of Memory Error囉!