背景:
目前項目中在單個進程的應用程序經常會遇到w3c.exe崩潰的情況,於是就設想是否可以通過IIS多進程的方案來避免出現該問題。
打開iis管理器,找到"asp.net應用程"使用的“線程池”,右鍵在“屬性”中找到“高級”,修改"最大工作進程數"(默認值為1),修改為32.
這樣,就可以實現最大該asp.net應用程序可以同時啟用32個並行進程。
注意事項:
1、最大並行進程數的值,需要設置一個合理范圍的值。不能過大,可能會造成服務器資源耗盡;需要評估單個進程占用的最大資源數,之後合理的去設置該值;
2、設置了並行多進程後,asp.net應用程序的session在多個進程之間默認是不能實現共享的;
3、合理的去設置資源自動回收時間:合理設置【限制超時】和【回收時間間隔】屬性值。
Asp.Net提供了以下幾種Session保存機制,如表 1所示:
表 1 Session保存方式
方式名稱
存儲方式
性能
Off
設置為不使用Session功能
無
InProc
設置為將Session存儲在進程內,就是ASP中的存儲方式,這是默認值
最高
StateServer
設置為將Session存儲在獨立的狀態服務中。通常是aspnet_state.exe進程
性能損失10-15%
SQLServer
設置將Session存儲在SQL Server中。
性能損失10-20%
Custom
自定制的存儲方案
由實現方式確定
在Asp.Net程序的web.config配置文件中對Session的保存方式進行設置。如果不顯示指定Session的保存方式,默認使用InProc的方式保存,即Session由提供服務的工作進程保存。
為了提高IIS對高並發的支持,可以增加應用程序池的工作進程數,IIS會根據內置的調度算法,將用戶的請求在多個工作進程間動態分配,如果搭建了服務器集群和負載均衡,則用戶請求會在多台機器的多個工作進程間進行動態分配。在上述情況下,如果Session的保存方式依然為InProc,則用戶請求在多個工作進程間切換時可能出現Session丟失的情況,導致請求失敗或出錯。
為解決上述為,需要將Session的保存方式設置為共享,即表 1中的“StateServer”、“SQLServer”或“Custom”方式。這幾種方法中,“SQLServer”方式需要安裝獨立的SQLServer數據庫,“Custom”方式需要自行實現相應的Session存儲與檢索過程,部署起來相對復雜,相對上述兩種方式,“StateServer”方式在功能性和可實施性上最好,因此下文重點介紹此種Session共享機制。
設置步驟:
1、cmd下運行services.msc打開“服務”窗口,找到“ASP.NET狀態服務”服務項,修改屬性為自動啟動。
2、修改注冊表: [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/aspnet_state/Parameters]
設置 AllowRemoteConnection = 1 , 設置 Port = 42424 (十進制,默認即為42424)
AllowRemoteConnection ,0僅能本機使用,1可以供其他機器使用.
Port是服務的端口號3、打開待修改網站主目錄下的web.config配置文件,搜索找到“<sessionstate>”配置節點,如果不存在配置節點,則在“<system.web>”節點下新建“<sessionstate>”配置節點,並將節點屬性修改為:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="60"/>
其中“tcpip=*”後的主機IP地址和端口可根據實際情況修改。修改完後保存配置文件即可。
1、 Session中保存的自定義對象必須顯示標記為可序列化“[serializable]”。如果未顯示標記為可序列化,則在訪問頁面時會報錯。
2、 StateServer服務器必須為Windows Server操作系統,如Windows Server 2003或Windows Server 2008。