深入理解IIS的多线程工作机制
首先讓我們來看看IIS里面的這2個(gè)數(shù)字:最大并發(fā)連接數(shù),隊(duì)列長度。先說這2個(gè)數(shù)字在哪里看。
最大并發(fā)連接數(shù):在IIS中選中一個(gè)網(wǎng)站,右鍵網(wǎng)站名稱,在右鍵菜單中找到并點(diǎn)擊【管理網(wǎng)站】->【高級設(shè)置】。打開對話框如下圖:
隊(duì)列長度:在IIS中選中【應(yīng)用程序池】,在應(yīng)用程序池列表中,右鍵你想查看的,在右鍵菜單中選擇【高級設(shè)置】。打開如下對話框:
這兩個(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)又?#xff0c;影響到了排隊(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è)請求處理速度非???#xff0c;那么那么網(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)變量不共享。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的深入理解IIS的多线程工作机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谁能知道这路易十三的酒怎么看年份的?
- 下一篇: 安装SandcastleInstalle