狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]IIS處理并發請求時出現的問題及解決

admin
2018年9月8日 18:5 本文熱度 4169

原文鏈接:http://www.cnblogs.com/hgamezoom/p/3082538.html

一個ASP.NET項目在部署到生產環境時,當用戶并發量達到200左右時,IIS出現了明顯的請求排隊現象,發送的請求都進入等待,無法及時響應,系統基本處于不可用狀態。因經驗不足,花了很多時間精力解決這個問題,本文記錄了我查找問題的過程和最后解決方案,供大家參考。

 

軟硬件環境:

IBM刀片服務器,Intel至強處理器,4物理核,16個邏輯核心,內存32G

Windows Server2008 Enterprise R2, ASP.NET 4.0 Webform  IIS7.5  集成模式

 

當發現請求明顯延遲,沒有被即時處理的現象,首先就要查看Windows自帶的性能日志Performance Monitor。

由于我注意到只有對于.aspx或.ashx的請求才會延遲,而.htm或.jpg文件都是即時響應的,所以很明顯問題出在ASP.NET上,于是我選擇了性能監視器中的ASP.NET 4.0中的2個主要計數器:Requests Current(當前請求數), Requests Queued(被排隊的請求數)進行觀察。通過觀察發現,當前請求數達到200左右時,被排隊的請求數就從0開始上升,一直到50左右,如果請求數繼續上升,則被排隊數也隨之上升。當被排隊的請求數>0時,就意味著這個時候去訪問任何.aspx頁面,頁面都會處于長時間等待中,沒有任何響應,直到IIS處理完了其他請求,才會開始處理隊列中的請求。也就是說,當排隊數長期>0時,系統基本處于不可用的狀態。

由于這個系統的頁面布局比較復雜,采用了大量的Ajax+.ashx的方式,將內容分批展示在頁面上,所以對服務器的請求總數會比傳統aspx模式來的多一些,一個頁面全部加載完畢可能需要5-10秒,但我想這不應該是造成問題的主要原因,就算系統性能較差,IIS也應該足以承受這么小的并發量的。

為探究到底是系統寫的有問題,還是IIS本身的問題,我拋開我們的系統,寫了一個簡單的頁面,就一個aspx文件,page_load里sleep 10秒。假設這就是一個性能比較差的網站,每個頁面都要10秒才能展現,我將其部署在IIS上測試其性能,我使用的是Microsoft Web Application Stress Tool,模擬發起80個線程,每個連接有4個Socket,總共相當于320個并發請求。

測試開始后,可以從下圖中看到,當前請求數立刻攀升到300左右(圖中紅線),然后隊列中的請求數也上升到300左右(圖中綠線),就是說在300個并發請求下,幾乎所有的請求都被排隊了,系統基本不可用,通過簡單的測試,這個問題已經得以重現了。

 

隨著時間推移,發現綠線慢慢減少,從300下降到100多,就是系統可用性漸漸提高,有一部分用戶可以正常使用,但大部分還在排隊。

 

過了6,7分鐘,隊列中的請求數下降到0左右,并有一些小幅波動。這個時候大部分請求可以被正常處理了。 按照這個現象分析的話,應該是IIS發現有大量請求在隊列中,就會試圖增加處理線程數以滿足要求,但是增長速度有些緩慢。

 

那是不是系統經過了6,7分鐘的適應期之后,以后就一直可以在這個并發量下穩定運作了呢?事實并非如此。我將壓力測試停了幾秒,當服務器的請求數降為0以后,再重新開啟320個請求的測試,IIS如何表現?從下圖可以看到,只要請求數有明顯上升,則等待隊列又開始達到最高值,然后緩慢下降,重復上面的過程。總結下來就是,當出現較大并發時,IIS的處理請求能力完全跟不上,需要很長時間才能開出足夠的線程。

 

 

然后我做了一個測試,看看IIS默認情況到底能承受多少請求而不排隊?似乎是在100個并發左右,表現尚可,未出現排隊。

 

當200個左右就不行了。

 

然后我將測試程序從sleep10秒改成3秒,對于一個應用系統來說,頁面平均3秒處理時間的性能該還算比較正常了。但可惜的是,排隊現象與處理時間并無太大關系,排隊仍然很嚴重。

 

針對以上問題,查閱了相關資料,是否出現排隊是和應用程序池的可用線程有關,通過2個方法可以查看系統總線程數和當前可用線程數。

ThreadPool.GetAvailableThreads( out availableWorker, out availableIO);

ThreadPool.GetMaxThreads(out maxWorker, out maxIO);

在隊列請求數達到120左右時,通過此方法,得到maxWorker=1600,而availableWorker=1472

因為服務器是16核的,ASP.NET4.0默認每核可以使用100個線程,所以maxWorker是1600,1600-120=1480,大致相等。

就是說當前有120個線程被用來處理請求,還有1400多個處于空閑。關鍵問題就是為什么這些空閑線程沒有被及時啟用?

 

ASP.NET提供的線程配置參數中,有一個參數是非常重要,但是可能被大家忽略的,就是minWorkerThreads。

意指最小工作線程,根據我們以上的測試結果,IIS托管線程啟動非常慢,微軟也認識到了這個問題,所以提供此參數用于設置正常情況下的最小工作線程數。比如我們系統白天的并發在200-300之間,則可以設置最小線程為300,這樣系統響應速度可以大幅提高。

據此,我對配置文件(machine.config)進行了如下修改。注意都是針對單個CPU的,系統會自動乘以邏輯CPU的數量。

<system.web>
<processModel autoConfig="false" maxWorkerThreads="200" minWorkerThreads="50" />

 相當于最小工作線程設置成了50*16=800。

 

重啟IIS后進行測試,我們得到了以下結果:

 

 

可以看到,由于設置了合理的最小工作線程數,使得IIS無需不斷創建新線程來處理請求,系統的響應能力已可以滿足并發要求。

 

除此之外,在IIS6之后引入了一個新功能叫Web Garden,其設計目的是為了在CPU占用較低,但是并發請求數比較多的情況下,提升服務器性能。這正符合我當前的情況,于是我啟用了Web Garden,將工作進程數從1調整到5,在任務管理器中可以看到w3wp進程從原來的1增加到了5,然后重新測試。

 

同樣的320個請求下,可以看到除了一開始的幾秒出現了一些排隊,后面基本上表現良好,沒有請求進入隊列。

 

通過以上兩種方式,都可以有效解決本文開頭提出的問題。但Web Garden是工作在多進程模式下,如果應用中用到了依賴進程的Session和Cache等對象都必須另想辦法,不能保存在服務器內存中,而且Web Garden的多個進程切換時會有上下文復制,其資源消耗相對單進程要大,這些是需要考慮的因素。


該文章在 2018/9/8 18:06:03 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved