吳小欣
(91550部隊 遼寧 大連 116023)
ASP.NET技術經過不斷的發展,逐漸趨于成熟,在微軟.NET平臺上使用Visual Studio工具開發的ASP.NET,門戶網站為越來越多的企業使用,能夠獲得比較完善的功能和美觀的網頁,但是最重要的還是能夠對大量用戶的請求快速響應,尤其是大型企業的門戶網站點擊量非常高,對網站的運維工作帶來了很大的困難,網站想要獲得較高的相應速度,就需要對網站的系統架構和性能進行優化,才能提高滿足用戶對訪問速度的要求。
系統架構是系統在獨立邏輯層中對功能部分的垂直分解,邏輯層能夠和相鄰的邏輯層進行數據通訊,對于ASP.NET網站來說,三層結構是最常見的結構形式:
1)表示層 負責實現用戶和網站直接的交互,動態Web頁面是最常見的形式。
2)業務層 采集表示層獲得的用戶輸入數據,進行處理并調用數據層,將業務結果反饋給表示層[2]。
3)數據層 主要用于進行數據保存和系統維護。
三層結構是一種最常見的網絡系統架構形式,有著較高的性能和靈活性,維護方便,可拓展性強,其數據請求過程如圖1所示。

圖1 ASP.NET數據請求流程Fig.1 ASP.NET data request process
網站的性能優化主要目標是把程序瀏覽器以及服務器的數據處理優勢充分開發出來,降低客戶端和服務器端口之間的數據量,降低連接次數和時間,將客戶端和Web服務器的處理任務合理的分配,提高ASP.NET應用程序的性能。對于企業應用的門戶網站,多采用分布式多層架構,通過分布結構形成集群服務,實現載荷的均衡分布,提高網站的整體運行性能,并保證運行穩定性。所以ASP.NET網站的系統架構和性能優化應該從系統架構、網頁頁面優化、業務邏輯調整、數據訪問和緩存技術等方面著手開展[3]。
互聯網規模不斷增加,用戶群數量迅速膨脹,Web2.0逐漸推廣,對網站性能和擴展性的要求更高,網站高度并發性能也越來越得到重視,需要采用必要的措施進行網站系統架構優化。
圖9為相位平均過程中參與每個相位角平均的流場個數。從圖9中可看出,在8 000個瞬態場中,參與這8個相位角平均的流場的數量基本接近,為80~100個。
Web與DB服務器會產生較大的處理器和磁盤I/O占用,分離兩個服務器能夠降低單一服務器的荷載壓力,而且后期系統拓展也比較方便。
網站在運行過程中會產生很多數據量非常大的表格,歷史數據量很高的表格在調用時會產生較大的帶寬占用,為此,可將數據量大的表格進行適當拆分,通過索引表或者分組進行關聯,能夠顯著提高數據查詢速度,獲得更高的網站整體性能,同時減少了數據處理對現有運行數據庫的影響[4]。
在Web服務器中,圖片是最消耗資源的數據形式,無論是為了方便管理還是為了提高網站性能,都應該對圖片服務器進行分離處理,通過布置獨立服務器,實現網絡頁面和圖片之間的分離。通過這種分離結構,可以減少圖片加載對整個頁面性能的影響,并且降低了服務器的載荷,系統因為圖片問題產生的崩潰風險也大大下降,同時對頁面服務器和圖片服務器進行分別優化,采用針對性的配置方案,能夠進一步提高系統的執行效率。
對數據進行同時讀寫是比較困難的,效率很低,影響頁面的響應速度,為此,需要進行相應的調整。根據讀寫壓力實際情況,通過分別建立兩套服務器,分別負責數據的讀和寫,負責寫操作的服務器可定時將服務器數據傳輸給讀操作服務器,通過這種形式能夠實現服務器任務量的均衡,并為讀服務器提供更豐富的資源,而且對短時間過載的適應性更強,不會在短時間突發事件影響下直接崩潰,但是可能會出現系統整體運行效率下降[5]。
業務層集中完成業務邏輯,是性能優化比較關鍵的位置,常見的優化措施主要有數據緩存、SQL混存依賴和用戶自定義控件等措施。
1)數據緩存和SQL緩存依賴 合理利用緩存能夠顯著提高網站性能。通過ASP.NET配合SQL Server 2005,借助數據緩存技術和緩存依賴技術結合,添加在緩存中的任何項目都能夠直接被其他頁面或者控件訪問,數據的共享性更強。一些數據讀寫十分頻繁,將其存放在數據緩存中,不同頁面實現數據共享,能夠有效降低和數據庫之間的連接次數,顯著降低系統響應時間,減少對服務器資源的消耗,頁面穩定性更高。如果緩存數據需要數據庫數據提供,可以使用SQL數據緩存依賴技術數據庫中數據出現變化,可自動將新數據加載到數據緩存中。
2)自定義控件使用用戶系定義控件可以明顯提高軟件組件的重復利用效率,軟件開發和生產效率更高,而且能夠進一步提升系統性能。對于一些有多個局部需要更新的大頁面,定義大頁面單獨刷新或者更新的部分為用戶自定義控件,需要更新則由服務器通過更新控件數據就能夠完成,進一步降低服務器資源消耗和帶寬占用[6]。典型自定義控件結構如圖2所示。

圖2 自定義控件結構Fig.2 Custom control structure
3)分辨回傳事件 通過Page類IsPostBack屬性判斷是否為回傳事件,確定為回傳事件之后,就無需對頁面控件以及數據進行重新加載,能夠進一步降低網絡帶寬的占用和服務器資源消耗。
4)減少數據庫調用和服務器資源消耗
①頁面輸出緩存 頁面輸出緩存和數據緩存有著明顯的不同,頁面緩存直接緩存整個頁面的內容,當用戶下一次請求頁面內容時直接從緩存中調用,無需再次進行加載,除了緩存整個頁面之外,還有帶參數頁面緩存和部分頁面緩存等更深層優化。
②使用靜態頁面 使用頁面緩存可以減少頁面加載工作量,除了使用頁面緩存之外,通過動態Web頁面生成靜態HTML頁面同樣能夠加快頁面的相應速度,特別是訪問量巨大的網站首頁,很多部分需要進行數據庫數據讀取,并且需要進行一定的邏輯運算,使用HTML靜態頁面代替動態頁面能夠減少數據庫數據讀取量和邏輯運算工作量,頁面生成速度更快。
ASP.NET網頁有窗體文件和隱藏代碼兩部分,前者使用HTML代碼生成,為用戶提供交互界面,隱藏代碼主要是C語言等代碼,負責事件邏輯處理,頁面表示層的優化需要從HTML頁面優化和C#語言代碼兩部分同時進行。
1)HTML頁面優化 為了提高頁面的性能,需要盡量減少HTTP的請求數,可以合并JS、CSS文件,合并框架圖片或者變動量小的圖片,切割CSS背景用于渲染,優化本地Cache緩存JS/CSS/Image。在盡量控制對服務器的請求次數的同時還應當減少請求的文件數據量大小,減少對網絡帶寬過大的占用,刪除JS文件中的空白換行以及注釋,對于采用(X)HTML+CSS方式構建的網站,通過借助服務端的GZIP工具進行JS/CSS文件壓縮,也能夠實現頁面的優化。
一些實用頁面技巧同樣能夠起到明顯的作用,如保持同一URL大小一致,標識明確,盡量使用文字友情鏈接減少圖片數量或者降低圖片質量,都能夠顯著提高頁面性能。
2)提高C#編碼效率 使用foreach代替for,foreach的執行效率遠高于for,減少Arraylist的使用量,使用自定義集合類型或者泛型代替,減少拆箱或者封箱,減少運算量,如果需要存儲的數據量就較少時可以使用Hash Table代替String Dictionary、Nam Vale Collection等字典集合類型,避免將字符封裝在雙引號中,能夠有效節省資源,提高頁面性能。避免循環體內初始變量,不使用Exception控制程序流程,防止濫用反射這種浪費性能的操作[7]。
業務邏輯層是數據處理最高層,主要負責進行上下交互數據邏輯處理,完成系統業務。
業務邏輯層是類文件的集合,為表示層提供數據調用接口,同時方位數據層,對業務邏輯層的優化主要通過業務邏輯控制策略優化來開展。
1)盡量使用靜態HTML頁面 ASP.NET頁面程序可以進行頁面信息溝通,非常便捷,便于進行數據庫內容的存取和高鞥改,對于論壇和留言墻頁面非常適用,但是頁面程序需要服務器端執行數據處理或者數據查詢操作,并生成HTML頁面并發送給表示層,占用較多的服務器資源,如果頁面程序過多,會占用較多的服務器資源,尤其是在一些并發量很大的網頁上過多使用頁面程序會怎加服務器載荷,可能會造成服務器奔潰。,所以,盡量使用效率最高、消耗最小的HTML頁面,減少對數據庫的大量訪問,降低服務器荷載,提高網站性能。
2)減少不必要回送操作積極使用Page_Load事件和Page.IsPostBack屬性。HTTP靜態連接在數據傳輸完畢之后會直接斷開瀏覽器和服務器,在用戶有新動作時再重新連接,執行新的操作,重新連接頁面之后響應Page_Load事件通過檢查Page.IsPostBack屬性,可降低頁面重新加載次數,加快加載速度。
3)減少服務器控件使用量ASP.NET中有著標準的完整的Server Control控件和HTML控件,相比之下,服務器控件明顯有著比HTML控件更高的靈活性,但是同樣會造成更多的服務器資源消耗,所以在設計過程中在保證網頁功能的同時應該盡量控制服務器控件的使用數量,減少對服務器資源的消耗。
4)及時關閉不必要的Session狀態 ASP.NET使用Session在客戶端上保存用戶授權相關信息,提供了Sessinon之后調用頁面之前會首先調查頁面的Session狀態,會對頁面的執行性能產生影響。所以如果是和客戶授權無關的頁面,可以關閉Session狀態,在HTML代碼中添加語句就可以實現。
1)選擇適用.NET數據庫提供程序 SQLClient的驅動程序在不經過OLEDB層協議轉換的情況下就能夠提供數據庫支持,當前針對特定數據庫都有著相應的.NET數據庫,如Oracle.NET等,使用合適的數據庫提供程序,能夠提高數據調用的效率。
2)正確使用連接池 對數據庫進行訪問需要不斷創建、打開、關閉數據連接,會消耗很多服務器資源,使用連接池技術能夠對數據庫數據連接進行優化,提高數據庫打開和關閉性能,使用連接池應該本著盡量晚打開,盡早關閉的原則進行設置,關閉時要能夠關閉全部連接期對象,保證數據連接正常,防止出現無用連接。
3)合理使用數據庫存儲過程 存儲過程是服務器上存儲的一組預編譯SQL語句,將其編譯為可執行計劃緩存在數據庫中,防止重復解析,節約服務器加載時間。在服務器上存儲過程能夠降低對網絡帶寬的占用,節省了執行時間,在服務器上運行的存儲過程獨立于ASP.NET,方便日后的拓展和更新,并且避免了SQL的注入攻擊。
4)SQL命令優化 SQL語句的解析工作量很大,如果提高SQL語句質量不高,或者有邏輯錯誤,會產生額外的資源和時間浪費,為此,需要對SQL語句進行適當的優化,提高SQL的運行效率[8]。
字段提取應該盡量避免使用select語句,使用exists代替,并注意Where子句的語句順序,編寫SQL時應該減小查詢范圍,減少服務器端Order By語句使用量,使用客戶端的Dataset中的順序操作代替。
傳統緩存把重復率高的數據防治在Application或者Session中,頁面輸出緩存則保存ASP.NET頁面內容在服務器內存中,在緩存數據過期之前,系統內存輸出數據,緩存內容直接發送給用戶,無需進行再次頁面處理。頁面輸出緩存對于一些更新頻率不高,但是編譯工作量較大的網頁來說能夠保持較高的性能,而且編譯語句很短。頁面局部緩存將頁面的局部緩存在內存中,便于快速響應。頁面其他位置則為動態內容,有控件緩存和替換后緩存兩種方式,分別通過User Control控件和Substitution控件實現。數據緩存通過編程緩存任何對象,使用System.Web.Cacheing命名中間Cache實現。
從結構架構優化、頁面優化、邏輯層優化、數據層優化、系統緩存優化等方面入手對ASP.NET網站系統架構以及性能優化進行了討論,通過大量細節層面的優化措施,顯著提高了網站性能和承受能力,ASP.NET網站的優化是長期細致的工程,需要工作人員在實際工作中不斷摸索。
[1]張英剛.ASP.NET平臺網站架構調優實踐[J].程序員,2012(l):12.ZHANG Ying-gang.ASP.NET platform website structure optimization practice[J].Journal of programmers,2012(l):12.
[2]曾誠.ASP.NET應用程序的探討與研究[J].湖北大學學報,2013(2):22.ZENGCheng.ASP.NETapplication to explore and research[J].Journal of Hubei University,2013(2):22.
[3]萬榮澤.基于ASP.NET管理信息系統性能優化的研究與實踐[J].廣西輕工業,2012(12):91-92.WAN Rong-ze.Management information system based on ASP.NET, the research and practice of performance optimization[J].Journal of Guangxi Light Industry,2012(12):91-92.
[4]俞華鋒.基于ASP.NET的電子商務網站的性能優化研究[J].科技創新導報,2012(31):200-201.YU Hua-feng.Based on the performance of the ASP.NET ecommerce site optimization study[J].Science and Technology Innovation Herald,2012(31):200-201.
[5]王茹.基于ASP.NET應用程序的性能優化 [J].黑龍江科技信息,2010(10):72-73.WANG Ru.Based on the ASP.NET application performance optimization[J].Journal of Heilongjiang Science and Technology Information,2010(10):72-73.
[6]桂友武,桂友超.基于ASP.NET企業網站的性能優化探討[J].企業技術開發,2011(4):121-122.GUI You-wu,GUI You-chao.Based on the performance of the ASP.NET website optimization study[J].Journal of Technology Development of the Enterprise,2011(4):121-122.
[7]厲毅.優化ASP.NET應用程序性能的研究與探討 [J].福建電腦,2012(9):67-68.LI Yi.Optimize the ASP.NET application performance research and discussion[J].Journal of Fujian Computer,2012(9):67-68.
[8]李天平.NET深入體驗與實戰精要[M].北京:電子工業出版社,2012.