明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

深入理解IIS的多線程工作機(jī)制

[摘要]首先讓我們來看看IIS里面的這2個(gè)數(shù)字:最大并發(fā)連接數(shù), 隊(duì)列長度。 先說這2個(gè)數(shù)字在哪里看。 最大并發(fā)連接數(shù):在IIS中選中一個(gè)網(wǎng)站, 右鍵網(wǎng)站名稱, 在右鍵菜單中找到并點(diǎn)擊【管理網(wǎng)站】-&...

首先讓我們來看看IIS里面的這2個(gè)數(shù)字:最大并發(fā)連接數(shù), 隊(duì)列長度。 先說這2個(gè)數(shù)字在哪里看。

 

最大并發(fā)連接數(shù):在IIS中選中一個(gè)網(wǎng)站, 右鍵網(wǎng)站名稱, 在右鍵菜單中找到并點(diǎn)擊【管理網(wǎng)站】->【高級設(shè)置】。 打開對話框如下圖:

深入理解IIS的多線程工作機(jī)制

 

隊(duì)列長度:在IIS中選中【應(yīng)用程序池】, 在應(yīng)用程序池列表中, 右鍵你想查看的, 在右鍵菜單中選擇【高級設(shè)置】。 打開如下對話框:

深入理解IIS的多線程工作機(jī)制

 

這兩個(gè)數(shù)字表面上看是影響我們站點(diǎn)的并發(fā)處理能力的, 但是具體是如何影響一個(gè)網(wǎng)站的并發(fā)處理能力的呢?要完全理解IIS的并發(fā)處理能力, 除了這2個(gè)數(shù)字, 實(shí)際上還有一個(gè)非常關(guān)鍵的數(shù)字:IIS最大并發(fā)工作線程數(shù)。

 

1. IIS最大并發(fā)工作線程數(shù)

在以前很長一段時(shí)間, 我一直以為IIS的【最大并發(fā)連接數(shù)】就是影響IIS最大并發(fā)工作線程數(shù)。 我以為將【最大并發(fā)連接數(shù)】設(shè)置為1萬, 那么當(dāng)1萬個(gè)請求同時(shí)到來的時(shí)候, IIS會(huì)開啟1萬個(gè)線程進(jìn)行處理, 如果同時(shí)到來2萬個(gè)請求, 由于最大并發(fā)連接數(shù)只有1萬, 那么剩余1萬個(gè)請求就會(huì)放在隊(duì)列里面, 當(dāng)前面的1萬個(gè)線程中某個(gè)完成了請求之后, 再從隊(duì)列里面取一個(gè)請求。 但, 這個(gè)理解是完全錯(cuò)誤的, 相信很多朋友也跟我有同樣的理解。

 

現(xiàn)在, 首先讓我們來理解什么是【IIS最大并發(fā)工作線程數(shù)】。 這個(gè)數(shù)字在IIS里面是沒有界面進(jìn)行設(shè)置的, 我以前根本就不知道有這個(gè)數(shù)字。 這個(gè)數(shù)字跟操作系統(tǒng)相關(guān), 我的win7系統(tǒng)的IIS的值是10, VS2012自帶的IIS Express的值是80。 對于windows服務(wù)器版本的系統(tǒng)的具體值是多少?zèng)]有測試過, 但我猜應(yīng)該也是有限制的。

 

這個(gè)數(shù)字到底是什么意思呢?回到上面舉的例子, 當(dāng)1萬個(gè)請求同時(shí)進(jìn)入IIS的時(shí)候, 由于win7系統(tǒng)的IIS只有10個(gè)工作線程, 那么這時(shí)1萬請求中只有10個(gè)請求會(huì)在第一時(shí)間被處理, 剩余9990個(gè)請求都需要排隊(duì)。 也就是說, IIS最多能夠安排10個(gè)線程同時(shí)處理請求(win7版本的IIS, 有的可能是20)。

 

所以, 如果你用自己的win7系統(tǒng)測試IIS的性能的時(shí)候, 你可能發(fā)現(xiàn), 不管你怎么設(shè)置【最大并發(fā)連接數(shù)】, 你的IIS處理能力都很有限。

 

2. 最大并發(fā)連接數(shù)

上面講的IIS最大并發(fā)工作線程數(shù), 看上去就是IIS的并發(fā)處理能力, 如果是這樣, 那么【最大并發(fā)連接數(shù)】有什么意義呢?

 

還是上面的例子, 如果1萬個(gè)請求同時(shí)到來, 而我們的win7系統(tǒng)的IIS最大并發(fā)工作線程數(shù)只有10, 這時(shí)如果將【最大并發(fā)連接數(shù)】設(shè)置為100, 會(huì)有什么效果呢?答案是:只有100個(gè)請求會(huì)收到正常響應(yīng), 剩余9900個(gè)請求直接返回503(服務(wù)不可用)的錯(cuò)誤。 這時(shí), 實(shí)際上進(jìn)入排隊(duì)等待的只有90個(gè)請求。

 

再換下測試參數(shù), 如果將【最大并發(fā)連接數(shù)】設(shè)置為5000, 又會(huì)有什么效果?答案你可能已經(jīng)知道了, 那就是一開始就有5000個(gè)請求直接返回503, 剩下5000個(gè)請求慢慢正常返回。

 

這里你看明白了吧, 【最大并發(fā)連接數(shù)】在我們的測試?yán)又校?影響到了排隊(duì)的數(shù)量。 這樣的話, 看上去【隊(duì)列長度】又不知道什么意思了?

 

3. 隊(duì)列長度

在上面的例子中, 如果1萬個(gè)請求同時(shí)到來, 【最大并發(fā)連接數(shù)】設(shè)置為100。 這時(shí)我們知道, IIS首先會(huì)安排那10個(gè)線程去處理10個(gè)請求, 剩下90個(gè)請求都需要排隊(duì)。 這時(shí)如果我們將【隊(duì)列長度】設(shè)置為50, 那會(huì)出現(xiàn)什么情況?答案是, 40個(gè)請求會(huì)直接返回503服務(wù)不可用的錯(cuò)誤(因?yàn)殛?duì)列只有50個(gè)的長度, 剩下的40個(gè)就無法排隊(duì)了), 最終只有60個(gè)請求會(huì)被正確處理。

 

讀到這里, 你明白了嗎?

 

結(jié)論

當(dāng)很多請求同時(shí)到來的時(shí)候, IIS會(huì)根據(jù)【最大并發(fā)連接數(shù)】來判斷是否有多余的請求, 多余的請求直接返回503, 然后再根據(jù)【隊(duì)列長度】來判斷是否有多余的請求排不了隊(duì), 排不了隊(duì)的也直接返回503。 所以, 如何設(shè)置【最大并發(fā)連接數(shù)】和【隊(duì)列長度】, 實(shí)際上是有公式可以計(jì)算的:

 

最大并發(fā)連接數(shù) = 隊(duì)列長度 + IIS最大并發(fā)工作線程數(shù)

 

最后再說說IIS的默認(rèn)值對我們網(wǎng)站并發(fā)處理能力的影響。 IIS默認(rèn)的【最大并發(fā)連接數(shù)】為4294967295(42億多), 而【隊(duì)列長度】默認(rèn)值為1000。 對于windows server版本的IIS, 最大并發(fā)工作線程數(shù)可能幾百(猜測, 可能沒有限制), 按照這個(gè)默認(rèn)值, 那么IIS同時(shí)處理的請求數(shù)也就1000多。 1000多這個(gè)數(shù)字才是IIS真正的并發(fā)處理能力, 而這個(gè)能力跟我們的代碼沒有關(guān)系。 那么哪些指標(biāo)是評判我們網(wǎng)站的處理能力的呢?最重要的指標(biāo)可能莫過于【每秒處理請求數(shù)】吧(在性能分析器里面可以查看), 這個(gè)數(shù)字也叫吞吐率。 如果每個(gè)請求處理速度非?, 那么那么網(wǎng)站吞吐率就大, 吞吐率大那么支持的同時(shí)在線人數(shù)就大。 如果要做秒殺, 那就看你的秒殺相關(guān)的URL支持多大的吞吐率吧。 了解了這么多指標(biāo), 還沒有涉及到CPU的計(jì)算能力。 CPU的計(jì)算能力是如何影響網(wǎng)站的處理能力的呢?還是那么多請求, 如果CPU很強(qiáng)大, 能夠縮減每個(gè)請求的處理時(shí)間, 那必然會(huì)提高吞吐率。 還有很多的請求, 如果花在網(wǎng)絡(luò)傳輸或者到數(shù)據(jù)庫的傳輸時(shí)間比較多, 這部分等待時(shí)間CPU是閑置的, 如果能夠提高CPU的利用率, 也可能提高網(wǎng)站的處理能力, 最充分的利用服務(wù)器的資源。 如果不想改代碼而想提高CPU利用率, 可以在IIS的應(yīng)用程序池中設(shè)置最大工作進(jìn)程數(shù)(默認(rèn)值為1), 可以設(shè)置為10如果當(dāng)前CPU利用率只有百分之幾的話, 調(diào)整這個(gè)數(shù)值需要特別注意每一個(gè)工作進(jìn)程是獨(dú)立的應(yīng)用程序, 全局靜態(tài)變量不共享。


網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。