TechEd 2004新技術搶鮮報—提升.NET程式執行效能

學習工具的資源垂手可得,應關注更有價值的課題

當工具封裝簡化了技術的困難度,系統開發不再是一項高深的技術。在TechEd 2004所有與開發相關的課程中,筆者認為蔡學鏞主講的「提升.NET程式執行效能」是最值得參加的課程。因為學習工具的資源垂手可得,而效能提升的秘訣卻彌足珍貴,也才是決定開發人員的價值的關鍵所在。



提升效能必須掌握的重點非常廣泛,蔡學鏞列舉的僅是基本的方法,利用效能計數器找出瓶頸,是免費、完整又方便且可遠端監測的工具。隨機的觀察效能計數器並沒有效率,應先推測效能瓶頸所在,再觀察效能計數器的數據,以印證假設是否正確,才能對症下藥解決問題。


選擇適合的VM

開發人員都知道,.NET程式在VM(Virtual Machine;虛擬機器)也就是CLR上執行,卻不知其實CLR有MsCorSvr及MsCorWks兩種類型。當程式執行時會經由MsCorEE入口程式,選擇其中一種類型執行,MsCorSvr是針對伺服器程式最佳化的物件,MsCorWks則是工作平臺(Workstation)適合的類型。


選擇適合的VM種類,可以提升執行的效能,在系統登錄檔(Registry)中,可以查詢預設呼叫CLR版本的資訊,不過並不鼓勵修改系統登錄檔的內容,最好還是依循微軟的設定。自訂選擇CLR的方法有三種,第一種是寫一支程式,呼叫MsCorEE並選擇叫用的CLR,再執行應用程式。這個方法的變化最多也最完整,可以選擇使用CLR 1.1或2.0版本,及執行MsCorSvr或MsCorWks類型,不受到系統登錄檔的限制。


第二種方法利用應用程式的Configuration檔,加入Startup標籤指定CLR的版本,也可不受系統登錄檔的影響。第三種方法是在系統編譯時,寫入元資料(Metadata),但是仍會受到系統登錄檔的影響,決定執行的版本。


加速JIT的效能

.NET編譯程式的流程是先經由前端編譯器,將程式編譯成中介碼,待程式真的要執行時,才由後端編譯器編譯為執行檔。不過後端編譯器又可分為Install-Time Compiler,又可稱為AOT Compiler、Pre-JIT Compiler或NGEN;及JIT(Just In Time Compiler)簡稱Jitter兩種。一般程式是使用Jitter在執行時才編譯成執行檔,但不會儲存起來。


開發人員可以監測效能計數器,「.NET CLR Jit」效能物件中,「# of IL Bytes Jitted」、「# of Methods Jitted」、「Time in JIT」及「IL Bytes Jittted/Seconds」等計數器的數據,如果取得的值太高,表示程式應該改用Pre-JIT編譯。


Pre-JIT是在安裝時或執行前使用的編譯器,會事先把中介碼編譯儲存在硬碟中,就不用每次執行都編譯一次,缺點是必須一次編譯所有的程式碼,所以比較耗時。開發人員可利用NGEN指令編譯.NET程式,便可在GAC的資料夾中找到標示類型為「原生影像」的檔案,即原生程式。必須注意的是,NGEN並非原生編譯器,程式執行時仍需參照.NET組件的元資料,所以不可刪除組件(Assembly),否則無法執行。另一種降低系統負載的方法,是把一個龐大的程式,拆成多個組件,可依物件使用的頻率畫分,不常用的物件可以很長一段時間都不用載入記憶體,減少系統資源的浪費。此外,也可抽離互相排斥的功能,例如中文版及日文版的系統不可能同時使用,分類編譯成不同的組件,可以降低記憶體的負載量。


操控安全機制對效能的影響

安全機制對效能的影響很大,剖析.NET程式安全性檢查的流程,包括五個階段,首先在載入PE程式時檢查合法性,第二關載入模組時檢核元資料,第三關下載類別時檢查MSIL中介碼,第四關JIT編譯程式時再次驗證中介碼,最後執行時,仍要確認程式存取的安全性。層層把關可以確保程式的安全性,但也拖慢了執行的速度,因此蔡學鏞舉出跳過驗證程序及減少Stack Walk,兩種改善效能的方法。跳過驗證是指開發人員利用「gacutil」指令,把沒有問題的程式放到GAC中,或者在.NET Framework組態的Runtime安全性原則中,使用者的使用權限集合的安全性使用授權,設定「略過驗證」。


Stack Walk是指.NET CLR 會一一走訪調用的來源組件,如果呼叫層層的堆疊很多,對效能的影響很大。因此可設定快取許可(Permission),或將執行階段的檢查提前到JIT處理並設定堆疊的深度為1,就可以減少Stack Walk。


整合SQL與.NET的強項,提升解決問題的效率

綜觀SQL Server的演進,其實變化緩慢,SQL Server 6.5使用RDO、DAO技術,7.0版翻新架構推出ADO,連接資料庫的速度提升許多,SQL 2000開始支援XML,在.NET推出之後,也跟著提供ADO.NET。SQL Server 2005可說是重大變革,SQLCLR將.NET的開發方及生產力帶到SQL Server,Visual Studio 2005比傳統的資料庫開發介面更容易開發、部署及測試。


結合.NET可使用VB、C#、C++、COBOL等程支援.NET的程式語言,開發與資料庫相關的應用,例如撰寫預存程序、觸發程序等,不但功能比T-SQL強大,而且開發人員可保有既有的技術,應用在更廣大範圍。微軟資料庫講師楊志強表示:「T-SQL適合大量資料的處理;.NET則擅長處理器角色吃重的計算性應用。」兩者的結合使SQL Server成為雙面的利刃。


原來SQL Server的架構單純,SQL Server 2005內建CLR之後,將包含一個Hosting Layer可載入.NET組件,並處理資源回收的工作,安全性的控管可分為Safe、Extend Access及Unsafe三種模式。


移植.NET的開發能力到SQL Server,將延展資料庫物件建立的能力,使用者可自訂函數、定義類型、並使用彙總功能。


在常駐在記憶體的In-Process中,開發人員可使用.NET語法撰寫預存程序、函數(Function)及Table Value,以前存取文字檔的內容,必須先匯入檔案再與資料表Join,才能取得資料。.NET可使用函數直接抓值,甚至可以取得Windows事件的記錄。以.NET技術加密欄位資料,可以做得更複雜,在資料庫直接解密,就不用到用戶端執行,不但資料庫處理資料的能力增強許多,且不用耗費網路資源。


.NET與SQL Server的結合,改變以往資料計算的方式,可在資料庫執行運算功能,減少資料搬移的成本,強化資料庫的能力,除了可以處理資料也包含計算的能力。整合.NET的系統資源,資料庫可處理加密等複雜運算。對.NET組件而言,SQLCLR增加程式的可攜性,讓.NET的應用延伸到資料庫。


.NET使用列管碼(Managed Code),具物件導向的概念,且包含許多類別程式庫及Web Services的功能,適合執行處理器導向的工作;T-SQL的使用時機在大量資料處理及Set Based指令。


當SQL Server多了CLR,DBA開始擔心管理工作比以前複雜,事實上,SQL Server 2005預設是不啟動CLR機制的,管理者可利用sp_configure把clr enabled的值改成On。此外,管理的技巧必須把握的重點,包括控管新增組件、參照及執行的權限。


使用者的權限是系統管理者在新增使用者時就要設定的,系統預設的權限是Safe,可以運算及存取本機的資料,層級與使用T-SQL相同;External Access則可以存取檔案及註冊檔;Unsafe是完全信任的授權,可以呼叫非列管碼的COM元件,屬於系統管理者層級的權限。


.NET與資料庫的整合僅限SQL Server 2005,並非通用的技術,超乎預期的「利用.NET程式開發SQL Server 2005資料庫物件」這堂課,引起許多資訊人員的興趣,不但坐無虛席,而且走道及階梯也都擠滿了學員。


然不能就此斷言,微軟Visual Studio 2005及SQL Server 2005相互抬轎的策略是否會成功,不過,企業渴望提升資料庫開發功能的現象,倒是可以給其他資料庫廠商一些借鏡。

內容由 Shopping Guide採購情報 提供 文⊙李延華

posted on 2004-10-21 19:49  Jason Cheng  阅读(447)  评论(0编辑  收藏  举报