深入理解IIS的多執行緒工作機制

2022-04-17 02:37:20 字數 1760 閱讀 2575

首先讓我們來看看iis裡面的這2個數字:最大併發連線數,佇列長度。先說這2個數字在**看。

佇列長度:在iis中選中【應用程式池】,在應用程式池列表中,右鍵你想檢視的,在右鍵選單中選擇【高階設定】。開啟如下對話方塊:

這兩個數字表面上看是影響我們站點的併發處理能力的,但是具體是如何影響乙個**的併發處理能力的呢?要完全理解iis的併發處理能力,除了這2個數字,實際上還有乙個非常關鍵的數字:iis最大併發工作執行緒數。

在以前很長一段時間,我一直以為iis的【最大併發連線數】就是影響iis最大併發工作執行緒數。我以為將【最大併發連線數】設定為1萬,那麼當1萬個請求同時到來的時候,iis會開啟1萬個執行緒進行處理,如果同時到來2萬個請求,由於最大併發連線數只有1萬,那麼剩餘1萬個請求就會放在佇列裡面,當前面的1萬個執行緒中某個完成了請求之後,再從佇列裡面取乙個請求。但,這個理解是完全錯誤的,相信很多朋友也跟我有同樣的理解。

現在,首先讓我們來理解什麼是【iis最大併發工作執行緒數】。這個數字在iis裡面是沒有介面進行設定的,我以前根本就不知道有這個數字。這個數字跟作業系統相關,我的win7系統的iis的值是10,vs2012自帶的iis express的值是80。對於windows伺服器版本的系統的具體值是多少沒有測試過,但我猜應該也是有限制的。

這個數字到底是什麼意思呢?回到上面舉的例子,當1萬個請求同時進入iis的時候,由於win7系統的iis只有10個工作執行緒,那麼這時1萬請求中只有10個請求會在第一時間被處理,剩餘9990個請求都需要排隊。也就是說,iis最多能夠安排10個執行緒同時處理請求(win7版本的iis,有的可能是20)。

所以,如果你用自己的win7系統測試iis的效能的時候,你可能發現,不管你怎麼設定【最大併發連線數】,你的iis處理能力都很有限。

上面講的iis最大併發工作執行緒數,看上去就是iis的併發處理能力,如果是這樣,那麼【最大併發連線數】有什麼意義呢?

還是上面的例子,如果1萬個請求同時到來,而我們的win7系統的iis最大併發工作執行緒數只有10,這時如果將【最大併發連線數】設定為100,會有什麼效果呢?答案是:只有100個請求會收到正常響應,剩餘9900個請求直接返回503(服務不可用)的錯誤。這時,實際上進入排隊等待的只有90個請求。

再換下測試引數,如果將【最大併發連線數】設定為5000,又會有什麼效果?答案你可能已經知道了,那就是一開始就有5000個請求直接返回503,剩下5000個請求慢慢正常返回。

這裡你看明白了吧,【最大併發連線數】在我們的測試例子中,影響到了排隊的數量。這樣的話,看上去【佇列長度】又不知道什麼意思了?

在上面的例子中,如果1萬個請求同時到來,【最大併發連線數】設定為100。這時我們知道,iis首先會安排那10個執行緒去處理10個請求,剩下90個請求都需要排隊。這時如果我們將【佇列長度】設定為50,那會出現什麼情況?答案是,40個請求會直接返回503服務不可用的錯誤(因為佇列只有50個的長度,剩下的40個就無法排隊了),最終只有60個請求會被正確處理。

讀到這裡,你明白了嗎?

當很多請求同時到來的時候,iis會根據【最大併發連線數】來判斷是否有多餘的請求,多餘的請求直接返回503,然後再根據【佇列長度】來判斷是否有多餘的請求排不了隊,排不了隊的也直接返回503。所以,如何設定【最大併發連線數】和【佇列長度】,實際上是有公式可以計算的:

最大併發連線數 = 佇列長度 + iis最大併發工作執行緒數

多執行緒的深入理解

通過單執行緒程式的小例子來深入理解執行緒 程式 執行流程 通過程式執行結果可以看出,主線程建立兩個物件,然後呼叫d1.show 方法,主線程把show方法進棧,執行show方法中的 執行完show方法出棧,此時 d2.show 沒有被執行,緊接著呼叫d2.show 方法。程式執行簡圖 1 多執行緒例...

多執行緒2,執行緒池深入理解

如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!1.1 建構函式public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,bloc...

多執行緒2,執行緒池深入理解

public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueueworkqueue 1.2 引數解析 1.3 遵循的規則 1.4 使用執行緒池管理...