並發處理
關於並發你真的了解嗎?(二)
本文僅代表帶個人觀點及理解,本人只是一個編程小菜鳥,如果有不對的地方。請大佬輕噴!
前言:對於一些公司來說可能會遇到一些並發處理的問題,本文有可能會對您有所幫助。
對於一臺服務器的公司來說如果您有提升並發處理的需求但是又不想增加服務器數量的話,以下方法有可能對您有所幫助:
1.如果web服務器cpu使用率很低但是又需要更高效的處理並發連接請求,您可以嘗試設置最大工作進程數。
IIS作為Windows平臺下Asp.Net網站發布的默認WEB服務器,在性能上是提供了比較大的彈性和可伸縮性,通過應用程序池工作進程數的設置,可以支持從幾十到上萬並發數量的訪問。
在主流的主機上,每個應用程序池的單一工作進程,能夠大約承受30-50個左右的並發,如果超出此並發數量,可能會出現IIS無法響應、或響應時間明顯變長的問題。通過合理設置應用程序池的最大工作進程數,可顯著提高IIS應對高並發的能力,減少網站響應時間。(具體設置方式可詳見上一篇文章《關於並發你真的了解嗎?(一)》博客園地址:http://www.cnblogs.com/xinwuhen/p/7049093.html)
2.建議使用 InProc 的Session保存機制
3.合理的資源回收機制:大多數應用系統都存在工作時間使用量高、非工作時間使用量低的情況,針對這種現象,在系統非忙時應合理的釋放操作系統資源,因此,應合理設置應用程序池的【限制超時】和【回收時間間隔】屬性。
4.程序優化(詳見《關於並發你真的了解嗎?(三)》)
5.數據庫操作優化(詳見《關於並發你真的了解嗎?(三)》)
多服務器,對於多服務器的公司來說。以下方式可能對您有所幫助:
1.對於多臺服務器來說,首先也要滿足單獨服務器優化配置。上面有講述,這裏需要註意對於多服務器Session的保存機制可以使用其他的方式下文有重點介紹。
2.您可能會遇到,某一臺或者多臺服務器已經超過了並發處理量。而其他服務器卻還有很富余的並發處理能力的情況。
此種情況您可能需要分流操作,我知道的有三種分流:
2.1,集群 - 將並發請求分配到不同的服務器上,可以是業務服務器,也可以是數據庫服務器。集群技術:多臺服務器應看作為一個服務集群而不是單一的個體服務器。群集技術是使單個服務器實現物理和程序上的連接,並對服務器之間的通訊進行協調,以使它們能夠執行共同的任務。即便某一臺服務器停止運行,一個由進程臺調用的故障應急程序會自動將該服務器的工作負荷轉移至另一臺服務器,以保證提供持續不斷的服務。除故障應急程序外,某些形似的群集也使用負載平衡功能,該功能可使計算負載在聯網的計算機間得以分配。
2.2,分布式 - 分布式是把單次請求的多項業務邏輯分配到多個服務器上,這樣可以同步處理很多邏輯,一般使用與特別復雜的業務請求。分布式系統(distributed system)是建立在網絡之上的軟件系統。正是因為軟件的特性,所以分布式系統具有高度的內聚性和透明性。因此,網絡和分布式系統之間的區別更多的在於高層軟件(特別是操作系統),而不是硬件。內聚性是指每一個數據庫分布節點高度自治,有本地的數據庫管理系統。透明性是指每一個數據庫分布節點對用戶的應用來說都是透明的,看不出是本地還是遠程。在分布式數據庫系統中,用戶感覺不到數據是分布的,即用戶不須知道關系是否分割、有無副本、數據存於哪個站點以及事務在哪個站點上執行等。
2.3,CDN - 在域名解析層面的分流,例如將華南地區的用戶請求分配到華南的服務器,華中地區的用戶請求分配到華中的服務器。
3.負載均衡設備(網上很多文章,不過多介紹)
4.使用消息隊列。隊列的使用除去了接收和發送應用程序同時執行的要求。減少並發處理數量的占用
5.緩存機制:將需要頻繁訪問的資源存放在緩存中不僅可以降低數據庫壓力而且還可以提高訪問速度進而提高用戶體驗。適程度而定必要時可以考慮緩存服務器的搭建。
6.數據庫分庫分離活躍數據 :可以自定義規則來判定哪些訪問頻繁的數據或者重要訪問來訪問單獨庫,即“重要數據特殊對待”。從而減輕主庫壓力。並且可以提高用戶體驗。
7.降低響應時間(詳見《關於並發你真的了解嗎?(三)》),總體分為降低程序執行時間,降低數據庫操作時間。要知道即使是毫秒級的程序執行速度差異,在足夠大的並發訪問量下。差距也是異常驚人的。
8.Asp.Net的Session共享
Asp.Net提供了五種Session保存機制:
(1)Off 設置為不使用Session功能 性能 無
(2)InProc 置為將Session存儲在進程內,就是ASP中的存儲方式 性能 最好
(3)StateServer 設置為將Session存儲在獨立的狀態服務中。 性能損失10-15% 一般用於服務器集群使用
(4)SQLServer 設置將Session存儲在SQL Server中。性能損失10-20%
(5)Custom 自定制的存儲方案 性能 由實現方式決定(一般自定義方式編寫不難,但是好的性能方案很難)
在Asp.Net程序的web.config配置文件中對Session的保存方式進行設置。如果不顯示指定Session的保存方式,默認使用InProc的方式保存,即Session由提供服務的工作進程保存。
為了提高IIS對高並發的支持,可以增加應用程序池的工作進程數,IIS會根據內置的調度算法,將用戶的請求在多個工作進程間動態分配,如果搭建了服務器集群和負載均衡,則用戶請求會在多臺機器的多個工作進程間進行動態分配。在上述情況下,如果Session的保存方式依然為InProc,則用戶請求在多個工作進程間切換時可能出現Session丟失的情況,導致請求失敗或出錯。
為解決上述為,需要將Session的保存方式設置為共享即StateServer”、“SQLServer”或“Custom”方式。這三種方法中,“SQLServer”方式需要安裝獨立的SQLServer數據庫,“Custom”方式需要自行實現相應的Session存儲與檢索過程,部署起來相對復雜,相對上述兩種方式,“StateServer”方式在功能性和可實施性上最好,因此重點介紹此種Session共享機制。
設置步驟
1、 確定StateServer服務器。如果只有一臺WEB服務器,可指定當前服務器為StateServer服務器。如果存在多臺服務器集群,可指定集群中的一臺符合較輕的服務器作為StateServer服務器。
2、 修改註冊表,允許遠程訪問StateServer服務。
端口默認為42424,可根據需要進行修改,下文均以42424為例。
3、 打開【管理工具】-【服務】,找到“Asp.Net State Service”,點擊右鍵,選擇【屬性】
在彈出的【屬性】窗口中,將【啟動方式】改為“自動”,然後點擊【啟動】按紐啟動服務
4、 打開待修改網站主目錄下的web.config配置文件,搜索找到“<sessionstate>”配置節點,如果不存在配置節點,則在“<system.web>”節點下新建“<sessionstate>”配置節點,並將節點屬性修改為:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" />
其中“tcpip=*”後的主機IP地址和端口可根據實際情況修改。修改完後保存配置文件即可。
註意事項
1、 Session中保存的自定義對象必須顯示標記為可序列化“[serializable]”。如果未顯示標記為可序列化,則在訪問頁面時會報錯。
2、 StateServer服務器必須為Windows Server操作系統,如Windows Server 2003或Windows Server 2008。
標簽: 並發, IIS, 503, 應用程序池, 並發連接數, 線程, 進程, 資源
並發處理