台灣最大程式設計社群網站
線上人數
628
 
會員總數:244989
討論主題:188956
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 改善ASP效能的訣竅-4 (Nancy Cluts 著)
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
改善ASP效能的訣竅-4 (Nancy Cluts 著)
價值 : 0 QP  點閱數:2367 回應數:0

樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
訣竅 4:避免將非敏捷的元件快取在應用程式或工作階段物件中
盡管將資料快取在應用程式或工作階段物件中是一個好的做法,但快取「COM 物件」卻有嚴重的陷阱。通常,人們傾向於將經常使用的 COM 物件快取到應用程式或工作階段物件。很遺憾,許多 COM 物件 (包括所有以 Visual Basic 6.0 或舊版編寫的物件) 當存放在應用程式或工作階段物件時,會引起嚴重的瓶頸。

特別是,當任何不敏捷的元件被快取在工作階段或應用程式物件時,將引起效能瓶頸。敏捷的元件是被標記為 ThreadingModel=Both 的元件,它彙總無限制執行緒封送 (FTM),或被標記為 ThreadingModel=Neutral 的元件。(Neutral 模型是 Windows® 2000 和 COM+ 的新模型。) 下列元件不是敏捷的:

無限制執行緒的元件 (除非它們彙總 FTM)。
Apartment-threaded 元件。
單一執行緒元件。
組態的元件 (Microsoft Transaction Server (MTS)/COM+ 程式庫和伺服器套件/應用程式) 不是敏捷的,除非它們是 Neutral-threarded。Apartment-threaded 元件和其它非敏捷的元件在畫面領域內最適合 (即它們在單一 ASP 頁面上建立和終結)。

在 IIS 4.0 中,被標記為 ThreadingModel=Both 的元件被認為是敏捷的。在 IIS 5.0 中,只有這一點還不夠。元件必須不僅被標記成 Both,還必須彙總 FTM。有關敏捷性的文章描述如何使以 Active Template Library 編寫的 C++ 元件彙總 FTM。要注意如果元件快取介面指標,那麼那些指標本身必須是敏捷的,或必須存放在 COM Global Interface Table (GIT) 中。如果您不能重新編譯 Both-threaded 元件以彙總 FTM,那麼您可以將元件標記為 ThreadingModel=Neutral。或者,如果您不想讓 IIS 執行敏捷性檢查 (因此,您可以允許非敏捷的元件存放在應用程式或工作階段領域),您可以在 metabase 中將 AspTrackThreadingModel 設定為 True。不建議變更 AspTrackThreadingModel。

如果您想將以 Server.CreateObject 建立的非敏捷的元件存放在應用程式物件中,IIS 5.0 將出現一個錯誤。您可以在 Global.asa 中使用 <object runat=server scope=Application ...> 避免這個錯誤,但不建議這樣做,因為這會導致封送和序列化,關於這一點將在下面說明。

如果您快取非敏捷的元件會出現什麼問題?快取在工作階段物件中的非敏捷的元件將工作階段鎖定於 ASP 背景工作執行緒。ASP 維護服務所請求的背景工作執行緒集區。通常情況下,新請求總是由第一個可用的背景工作執行緒來處理。如果工作階段被鎖定於一個執行緒,那麼請求必須等待其相關的執行緒可用時才可以執行。以下的類比也許會有幫助:您去一家超級市場,挑選了一些商品,並在 #3 收銀台付款。其後,每當您在那家超級市場付款時,您總是必須在 #3 收銀台付款,即使其它收銀台前等候的人較少或者沒有人等候。

將非敏捷的元件存放在應用程式領域對效能的影響甚至更大。ASP 必須建立一個特殊的執行緒以執行非敏捷的、應用程式領域的元件。這會有兩個結果:所有呼叫都必須封送到此執行緒,且所有呼叫都序列化。「封送」的意思是:參數必須存放在記憶體的共用區域,設定昂貴的特殊執行緒的內容參數,執行元件的方法,結果被封送到共用區域,另一個昂貴的內容參數將控制傳回到原始的執行緒。「序列化」的意思是指每次只執行一個方法。兩個不同的 ASP 背景工作執行緒無法同時在共用元件上執行多個方法。這樣可以杜絕並行性,特別是在多處理器電腦上。更糟的是,所有非敏捷的應用程式領域的元件共用一個執行緒 (主機 STA),因此序列化的影響甚至更顯著。

糊塗了吧?下面是一些一般規則。如果您使用 Visual Basic (6.0) 或更早版本編寫物件,那麼不要將它們快取在應用程式或工作階段物件中。如果您不知道物件的執行緒模型,不要快取它。不要快取非敏捷的物件,而應在每個頁面建立和釋放它們。物件直接在 ASP 背景工作執行緒上執行,因此沒有封送或序列化。如果 COM 物件在 IIS box 上執行,且如果它們不花長時間起始化和終結,則效能尚可。注意單一執行緒物件不應該這樣使用。小心 - VB 會建立單一執行緒物件!如果您必須用這種方法使用單一執行緒物件 (如 Microsoft Excel 試算表),不要期待有很高的輸送量。

當 ADO 被標記為無限制執行緒時,ADO 記錄集可以安全地被快取處理。要將 ADO 標記為無限制執行緒,使用 Makfre15.bat 檔案,該檔案通常位於目錄 \\Program Files\Common\System\ADO 中。

警告 如果您使用 Microsoft Access 作為資料庫,不應將 ADO 標記為無限制執行緒。ADO 記錄集也必須中斷連線。一般來說,如果您不能控制網站中的 ADO 組態 (例如,您是一個獨立的軟體廠商 [ISV],向自行管理其組態的客戶銷售 Web 應用程式),最好不要快取記錄集。

字典元件也是敏捷的物件。LookupTable 從資料檔案中載入其資料,這些資料對於組合方塊資料以及組態資訊而言是有用的。Duwamish Books 中的 PageCache 物件提供字典語法,Caprock Dictionary 也提供。這些物件或其衍生物件可以構成有效快取策略的基礎。注意 Scripting.Dictionary 物件不是敏捷的,不應該存放在應用程式或工作階段領域中。

本篇文章發表於2000-09-09 00:00
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.