ASP.NET中狀態對象使用性能優化

以前的ASP允許開發人員訪問會話狀態信息,並且允許他們將有關用戶的信息存儲在這個會話對象的內部。這些信息可以從站點的任何一個其它的頁面上進行訪問。但是,ASP會將這些信息保存在Web服務器的內存之中。因此,如果使用多臺Web服務器,用戶的請求可能就會被髮送到一個與發起會話的服務器不同的其它服務器上,有關會話的信息將無法獲得。如果某個Web服務器重新進行了啓動,它保存的所有會話信息都將丟失,這對站點的正常運轉會造成不可估量的影響。

而目前的ASP.NET初了提供傳統的單服務器會話信息,還爲會話信息的集中提供了兩個方法,這使得用戶可以從很多不同服務器上獲得這些會話數據。具體使用兩種方法中的哪一種完全由系統管理員來決定 —— 它並沒有以代碼形式固定在程序之中。所以,對於那些不是針對Web商務模型進行設計的ASP .NET Web程序或Web服務,系統管理員可以對其進行衡量和分等。

ASP.NET可以使用三種方法存儲會話狀態信息:存儲在進程中;存儲在一臺中央狀態服務器上;或者存儲在SQL Server數據庫中。將會話信息保存在進程中這種方法與傳統的ASP會話類似,因爲會話狀態信息也保存在Web服務器的內存之中,不和其它系統進行共享。這種配置方法具有最佳的執行性能,因爲ASP.NET不需要同網絡中的其它系統通信以取得會話信息。但是,這種做法限制了系統的伸縮性 —— 會話不能跨越多臺服務器,而且如果用戶從一臺Web服務器移動到了另一臺服務器上,他們的會話信息將被丟失。

狀態服務器是運行一種特殊服務的中央服務器,該服務內置在.NET Framework之中。狀態服務器存儲狀態信息供Web應用程序中的多臺服務器使用。用戶可以從一臺Web服務器移動到另一臺,而不會丟失狀態信息。狀態服務器引入了一些額外的工作負載,因爲在每次用戶請求一個頁面的時候,會話信息必須能夠通過從Web服務器發送到狀態服務器的網絡請求被檢索和被更新。雖然需要花費一些額外工作來處理用戶請求,但是系統的伸縮性和可靠性卻因此得到了極大的提高,因爲Web應用程序可以伸縮到多個多臺服務器上。

存儲會話狀態信息的第三種方法是使用一個SQL Server數據庫。這種方法具有與使用中央狀態服務器相同的好處 —— 會話可以跨越多臺Web服務器進行跟蹤。但是,同使用中央狀態服務器相比,使用SQL Server服務器跟蹤會話產生的工作負載更大。SQL Server服務器能夠配置成羣集的形式,從而提供最大限度的冗餘。此外,SQL Server可以伸縮到配備4顆處理器的高端硬件上,從而實現更多會話的併發存儲。

要對狀態對象的使用進行優化,就必須首先了解“超時”,“超時”設置定義了會話狀態在用戶進行上一次請求後能夠存留的時間。默認情況下,該時間被設置爲20分鐘。所以,如果用戶等上20分鐘後再向服務器發送一個請求,服務器將創建一個新的會話。該設置不會影響系統,特別是在使用存儲在進程中的會話的時候。超時時間定義的越長,在用戶不主動訪問您的站點期間會話中所存儲信息的存活時間也就越長。但是,會話狀態在進程中進行維護會佔用Web服務器的內存。

如果你的站點用戶較少,但是他們的停留時間比較長,或者他們每天都定期多次訪問你的站點,那麼你可以定義一個較長時間的超時設置。如果你的站點有成千上萬的用戶,而且這些用戶一般僅僅瀏覽一兩個頁面就離開,那麼你可以設置一個較短時間的超時設置。然後,請仔細監視Web服務器的運行情況,以確定對會話狀態的維護是否會對系統性能造成不良影響。

 

爲了調整超時設置,請監視“ASP.NET應用程序”對象中的“活動會話”計數器。該計數器指出了當前活動會話的數目,一般來說,該數目會隨着超時時間的增加而增多。Web服務器所能夠處理的最大會話數量隨存儲在會話中的信息應用程序數量不同而發生變化。但是,保有過多的併發會話將消耗大量的服務器內存。因此,你還應該監視服務器的內存使用情況。如果在提高了會話的超時時間設置之後,內存的分頁操作也隨之增加了,那麼你應該減少會話的超時時間,或者在服務器上增加更多的內存。

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