天天看點

關于并發你真的了解嗎?(二)

本文僅代表帶個人觀點及了解,本人隻是一個程式設計小菜鳥,如果有不對的地方。請大佬輕噴!

 前言:對于一些公司來說可能會遇到一些并發處理的問題,本文有可能會對您有所幫助。

對于一台伺服器的公司來說如果您有提升并發處理的需求但是又不想增加伺服器數量的話,以下方法有可能對您有所幫助:

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, 應用程式池, 并發連接配接數, 線程, 程序, 資源

繼續閱讀