在這里了解當(dāng)今互聯(lián)網(wǎng)的最新動態(tài)
在這里了解當(dāng)今
一般購買過虛擬主機(jī)的朋友都熟悉購買時,會限制IIS連接數(shù),顧名思義即為IIS服務(wù)器可以同時容納客戶請求的最高連接數(shù),準(zhǔn)確的說應(yīng)該叫“IIS限制連接數(shù)”。
客戶請求的連接內(nèi)容包括:
[1] 網(wǎng)站html請求,html中的圖片資源,html中的腳本資源,其他需要連接下載的資源等等,任何一個資源的請求即一次連接(雖然有的資源請求連接響應(yīng)很快)
[2] 如果網(wǎng)頁采用框架(框架內(nèi)部嵌套網(wǎng)頁請求),那么一個框架即一次連接
[3] 如果網(wǎng)頁彈出窗口(窗口內(nèi)部嵌套網(wǎng)頁請求),那么一個窗口一個連接
很多人對連接數(shù)的概念認(rèn)識都很模糊,現(xiàn)介紹如下:
[1] 瀏覽者訪問站點,必需與站點通過TCP協(xié)議,建立連接。這個連接在從服務(wù)器上讀取信息時存在,讀取結(jié)束時,一般即自動關(guān)閉。所以,當(dāng)一個頁面已經(jīng)完全地顯示在客戶端的顯示器上時,使用的連接也許已經(jīng)關(guān)閉了。
[2] 每個瀏覽者,訪問某站點時,可能會占用1-3多個連接,這是由計算機(jī)自動處理的,這樣做的目的是為了加快速度。所以,對于連接數(shù)為30的基礎(chǔ)型主機(jī)而言,有時只能十幾個人訪問。
[3] 雖然服務(wù)器中可以規(guī)定每個站點的最大連接數(shù),但同時也存在服務(wù)器的總計最大連接數(shù)。所以,即使規(guī)定用戶站點的最大連接數(shù)為不限,當(dāng)服務(wù)器達(dá)到了最大連接數(shù)時,仍不能訪問站點。而服務(wù)器的最大連接數(shù)一般在1000—2000。
注意:
[1] 這就是為什么服務(wù)商敢于開出不限連接數(shù)的主機(jī),本質(zhì)上不是無限連接數(shù)的。
[2] 西部數(shù)碼提供的主機(jī),允許連接數(shù)均較高,一般可以滿足用戶需求。
在IIS(6.2版及以上版本)中 “點擊網(wǎng)站”->“右擊切換到功能視圖”->“點擊界面右側(cè)的 ‘限制...’ 鏈接”->“編輯網(wǎng)站限制”


限制連接數(shù)(N)即為虛擬主機(jī)供應(yīng)公開的IIS連接數(shù)標(biāo)準(zhǔn),如果購買的IIS連接數(shù)為50,那么我們不得不考慮網(wǎng)站的內(nèi)容框架和訪問量。
如果網(wǎng)站圖片夠多,彈窗窗口隨意(可能連時間選擇框、簡單條件篩選框也用彈出新窗口),加上不得已的打開新頁面瀏覽內(nèi)容,那么僅僅能容忍10個人同時操作也很正常,我不會把這個操作描述為很多網(wǎng)站說的“10同時在線”,這很容易讓人誤解,在用戶的一次請求(表面上可能是刷新一次網(wǎng)頁,實際上內(nèi)部請求不止一次,事實上很少只有一次)都完成得到服務(wù)器響應(yīng)完畢之后,連接全部會被釋放,當(dāng)然在你看到展示的頁面之前,內(nèi)部嵌套如果有請求圖片等連接請求,連接會早早的被釋放。
事實上,很多企業(yè)門戶網(wǎng)站訪問量低的驚人,IIS連接數(shù)為50也是綽綽有余了。
“管理網(wǎng)站” → “高級設(shè)置...” → “限制” → “最大并發(fā)連接數(shù)”

其實,普通用戶常說的“IIS連接數(shù)”就是這邊的“最大并發(fā)連接數(shù)”,如果PC端有IIS的朋友,可以測試上述“限制連接數(shù)”和“最大并發(fā)連接數(shù)”的設(shè)置,是相互影響的。“最大并發(fā)連接數(shù)”默認(rèn)為:4294967295,這是一個很驚人的數(shù)字,難道這代表著網(wǎng)站能具有并發(fā)執(zhí)行連接數(shù)為4294967295的能力?
這邊做兩個假設(shè):
1、很多虛擬主機(jī)供應(yīng)商所說的無并發(fā)連接數(shù)限制真的成立嗎?
2、每個連接的處理,IIS都會開啟一個線程去處理,假設(shè)這個處理方式成立,那么4294967295個并發(fā)連接請求來了是否IIS會立即啟動4294967295個線程去處理?
對于假設(shè)1:很顯然不成立,最大并發(fā)連接數(shù)的設(shè)置絕對有上限;
對于假設(shè)2:這是很多朋友的誤區(qū),假設(shè)4294967295并發(fā)連接同時來了,IIS不會立即啟動4294967295個線程去處理,因為這不現(xiàn)實,對于處理連接,IIS是有“最大并發(fā)工作線程數(shù)”限制的。從一些資料上查閱到,該數(shù)字跟操作系統(tǒng)相關(guān),win7系統(tǒng)的IIS的值是10(或者其他不確定),VS2012自帶的IIS Express的值是80。對于windows服務(wù)器版本的系統(tǒng)的具體值不清楚,即4294967295個并發(fā)連接來了后,(這邊以win7下的10為例),iis第一時間只能啟動10個工作線程去處理,那么其他4294967285必須排隊,排隊對用戶的體驗來說就是網(wǎng)頁正在加載,但是什么都不顯示,然后此時購買了據(jù)虛擬主機(jī)供應(yīng)商所說的無并發(fā)連接數(shù)限制的客戶就要開始狂暴了,為何購買了所謂的“無限并發(fā)連接數(shù)”,還是會一直在加載的情況,這就是IIS處理能力有限的問題。
當(dāng)然服務(wù)器沒有直接返回“HTTP Error 503. The service is unavailable.”應(yīng)該也算是一些你花更多錢的安慰吧,因為你只購買了IIS連接數(shù)為50的話,那么第50+1個連接請求操作得到的就直接是“HTTP Error 503. The service is unavailable.”了。另外,如果web服務(wù)器的硬件設(shè)備夠牛,那么IIS的工作線程也會處理的更快,那么響應(yīng)的用戶等待的時間也會更短(前提是IIS連接數(shù)夠大,否則就直接503了)。
總的來說,最大并發(fā)連接數(shù),影響了排隊的數(shù)量,很多時候需要我們評估自己的網(wǎng)站的最大并發(fā)連接數(shù),然后來進(jìn)行設(shè)置最佳數(shù)量。
在上面有所涉及,簡單的說就是 IIS 在并發(fā)連接請求過來時的處理機(jī)制,它會更智能的以某個數(shù)量級為單位來分批處理,讓沒有處理連接請求排隊等待,用戶瀏覽器中對于排隊等待的響應(yīng)就是“正在加載”,這比頁面直接顯示“HTTP Error 503. The service is unavailable.”更加能讓人接受。但是切勿怒點刷新按鈕,因為點的越多,請求在排隊隊列中越靠后。
當(dāng)然很多朋友會說,為什么我有時候第一次刷不出來,重新多刷一次內(nèi)容就出來了,
可能是:
1、頁面腳本哪個地方下載或者處理出了問題,導(dǎo)致頁面顯示異常或者直接不顯示
2、你重新刷新的那個秒級別的操作,web服務(wù)器更快速的已經(jīng)處理好了其他隊列的請求或者他人放棄了對web服務(wù)器連接請求的操作
3、路由或者寬帶網(wǎng)絡(luò)運營商問題(不穩(wěn)定)
4、瀏覽器或者本身電腦問題
暫不知道“IIS最大并發(fā)工作線程數(shù)”有無地方可以設(shè)置。
最大并發(fā)連接數(shù),影響了排隊的數(shù)量,那么進(jìn)一步影響排隊數(shù)量的設(shè)置就是隊列長度。
假設(shè)最大連接數(shù)設(shè)置為100,1000個并發(fā)連接請求過來了,首先900直接返回給客戶“HTTP Error 503. The service is unavailable.”
然后IIS先啟動(假設(shè)最大并發(fā)工作線程數(shù)為10)10個線程處理請求,其他90個進(jìn)入排隊狀態(tài),如果此時如下操作:
“應(yīng)用程序池” → 找到網(wǎng)站的所屬應(yīng)用程序池 → 右鍵“高級設(shè)置...” → “常規(guī)” → “列隊長度”,設(shè)置為20

那么實際情況只會有20個進(jìn)入排隊狀態(tài)了,70(隊列中的20-90)個請求也會立刻返回“HTTP Error 503. The service is unavailable”,IIS 默認(rèn)隊列長度設(shè)置是1000,范圍在10-65535 之間。
IIS 6.0 及以后允許將應(yīng)用程序池配置成一個Web園(Web Garden)。每個應(yīng)用程序池的單一工作進(jìn)程,能夠大約承受30-50個左右的并發(fā)。
“應(yīng)用程序池” → 找到網(wǎng)站的所屬應(yīng)用程序池 → 右鍵“高級設(shè)置...” → “進(jìn)程模型” → “最大工作進(jìn)程數(shù)”,默認(rèn)值為1。

如果這個值大于 1,那么當(dāng)有連接請求時會啟動多個新的工作進(jìn)程實例,可啟動的最多進(jìn)程數(shù)為所指定的最大工作進(jìn)程數(shù),后續(xù)更多的請求將以循環(huán)的方式發(fā)送至工作進(jìn)程,這樣每個工作進(jìn)程都能承擔(dān)負(fù)載一些連接請求,當(dāng)然是以消耗cpu等硬件做代價,這是值得的,如果web服務(wù)器cpu使用率很低但是又需要更高效的處理并發(fā)連接請求,應(yīng)當(dāng)這樣做。
如果網(wǎng)站中用到了依賴進(jìn)程的Session和Cache等對象,則不能保存在服務(wù)器內(nèi)存中,存儲方式選用StateServer或者SQLServer會更好,另外多個工作進(jìn)程切換時會有上下文復(fù)制,這也是資源消耗更多地方。
1、 最大工作進(jìn)程數(shù)值的設(shè)置依據(jù)
在確定每個應(yīng)用程序池的最大工作進(jìn)程數(shù)時,最主要參考的數(shù)據(jù)包括網(wǎng)站的最大并發(fā)用戶數(shù)以及WEB服務(wù)器的可用內(nèi)存數(shù)。最大并發(fā)用戶數(shù)需要通過一段時間的觀察,記錄下在系統(tǒng)忙時的最大并發(fā)用戶數(shù),按照每工作進(jìn)程能承載30個并發(fā)的原則來確定應(yīng)用程序池的最大工作進(jìn)程數(shù)。同時要注意,每個工作進(jìn)程大約會占用200M左右的系統(tǒng)內(nèi)存,在設(shè)置最大工作進(jìn)程數(shù)的時候,要主要最大工作進(jìn)程數(shù)與200M的乘積不要超過系統(tǒng)最大可用內(nèi)存數(shù)。一般情況下,建議按照每次增加5個工作進(jìn)程數(shù)的方式對最大工作進(jìn)程數(shù)進(jìn)行調(diào)整,調(diào)整完后對網(wǎng)站觀察一段時間,如依然無法滿足要求,再繼續(xù)增加5個工作進(jìn)程數(shù)。
2、 session共享問題
如果網(wǎng)站沒有用到session機(jī)制,則不會引發(fā)此問題。如果用到了session機(jī)制進(jìn)行傳值和保存數(shù)據(jù),則需要考慮在應(yīng)用程序池多個工作進(jìn)程間進(jìn)行session共享,防止出現(xiàn)session丟失的問題。此問題的解決措施見 Asp.Net 之 Session共享設(shè)置。
2.1 Asp.Net的Session共享設(shè)置
Asp.Net提供了以下幾種Session保存機(jī)制,如表 1所示:Session保存方式
方式名稱 | 存儲方式 | 性能 |
Off | 設(shè)置為不使用Session功能 | 無 |
InProc | 設(shè)置為將Session存儲在進(jìn)程內(nèi),就是ASP中的存儲方式,這是默認(rèn)值 | 最高 |
StateServer | 設(shè)置為將Session存儲在獨立的狀態(tài)服務(wù)中。通常是aspnet_state.exe進(jìn)程 | 性能損失10-15% |
SQLServer | 設(shè)置將Session存儲在SQL Server中。 | 性能損失10-20% |
Custom | 自定制的存儲方案 | 由實現(xiàn)方式確定 |
在Asp.Net程序的web.config配置文件中對Session的保存方式進(jìn)行設(shè)置。如果不顯示指定Session的保存方式,默認(rèn)使用InProc的方式保存,即Session由提供服務(wù)的工作進(jìn)程保存。
為了提高IIS對高并發(fā)的支持,可以增加應(yīng)用程序池的工作進(jìn)程數(shù),IIS會根據(jù)內(nèi)置的調(diào)度算法,將用戶的請求在多個工作進(jìn)程間動態(tài)分配,如果搭建了服務(wù)器集群和負(fù)載均衡,則用戶請求會在多臺機(jī)器的多個工作進(jìn)程間進(jìn)行動態(tài)分配。在上述情況下,如果Session的保存方式依然為InProc,則用戶請求在多個工作進(jìn)程間切換時可能出現(xiàn)Session丟失的情況,導(dǎo)致請求失敗或出錯。
為解決上述為,需要將Session的保存方式設(shè)置為共享,即表 1中的“StateServer”、“SQLServer”或“Custom”方式。這幾種方法中,“SQLServer”方式需要安裝獨立的SQLServer數(shù)據(jù)庫,“Custom”方式需要自行實現(xiàn)相應(yīng)的Session存儲與檢索過程,部署起來相對復(fù)雜,相對上述兩種方式,“StateServer”方式在功能性和可實施性上最好,因此下文重點介紹此種Session共享機(jī)制。
2.2 “ StateServer ”設(shè)置步驟:
[1] 確定StateServer服務(wù)器。如果只有一臺WEB服務(wù)器,可指定當(dāng)前服務(wù)器為StateServer服務(wù)器。如果存在多臺服務(wù)器集群,可指定集群中的一臺符合較輕的服務(wù)器作為StateServer服務(wù)器。
[2] 修改注冊表,允許遠(yuǎn)程訪問StateServer服務(wù)。可直接導(dǎo)入如下腳本。
端口默認(rèn)為42424,可根據(jù)需要進(jìn)行修改,下文均以42424為例。
[3] 打開【管理工具】-【服務(wù)】,找到“Asp.Net State Service”,點擊右鍵,選擇【屬性】,如圖 4所示:
[4]在彈出的【屬性】窗口中,將【啟動方式】改為“自動”,然后點擊【啟動】按紐啟動服務(wù),如圖 5所示:
[5] 打開待修改網(wǎng)站主目錄下的web.config配置文件,搜索找到“”配置節(jié)點,如果不存在配置節(jié)點,則在“
其中“tcpip=*”后的主機(jī)IP地址和端口可根據(jù)實際情況修改。修改完后保存配置文件即可。
注意:
[1] Session中保存的自定義對象必須顯示標(biāo)記為可序列化“[serializable]”。如果未顯示標(biāo)記為可序列化,則在訪問頁面時會報錯。
[2] StateServer服務(wù)器必須為Windows Server操作系統(tǒng),如Windows Server 2003或Windows Server 2008。
3、 合理的資源回收機(jī)制
大多數(shù)應(yīng)用系統(tǒng)都存在工作時間使用量高、非工作時間使用量低的情況,針對這種現(xiàn)象,在系統(tǒng)非忙時應(yīng)合理的釋放操作系統(tǒng)資源,因此,應(yīng)合理設(shè)置應(yīng)用程序池的【限制超時】和【回收時間間隔】屬性。
當(dāng)很多請求同時到來的時候,IIS會根據(jù)【最大并發(fā)連接數(shù)】來判斷是否有多余的請求,多余的請求直接返回503,然后再根據(jù)【隊列長度】來判斷是否有多余的請求排不了隊,排不了隊的也直接返回503。所以,如何設(shè)置【最大并發(fā)連接數(shù)】和【隊列長度】,實際上是有公式可以計算的:
最大并發(fā)連接數(shù) = 隊列長度 + IIS最大并發(fā)工作線程數(shù)
IIS的默認(rèn)值對我們網(wǎng)站并發(fā)處理能力的影響:
IIS默認(rèn)的" 最大并發(fā)連接數(shù) "為4294967295(42億多),而" 隊列長度 "默認(rèn)值為1000。對于windows server版本的IIS,最大并發(fā)工作線程數(shù)可能幾百(猜測,可能沒有限制),按照這個默認(rèn)值,那么IIS同時處理的請求數(shù)也就1000多。1000多這個數(shù)字才是IIS真正的并發(fā)處理能力,而這個能力跟我們的代碼沒有關(guān)系。
哪些指標(biāo)是評判我們網(wǎng)站的處理能力的呢?最重要的指標(biāo)可能莫過于" 每秒處理請求數(shù) "(在性能分析器里面可以查看),這個數(shù)字也叫吞吐率。如果每個請求處理速度非常快,那么那么網(wǎng)站吞吐率就大,吞吐率大那么支持的同時在線人數(shù)就大。如果要做秒殺,那就看你的秒殺相關(guān)的URL支持多大的吞吐率吧。
CPU的計算能力是如何影響網(wǎng)站的處理能力的呢?還是那么多請求,如果CPU很強(qiáng)大,能夠縮減每個請求的處理時間,那必然會提高吞吐率。還有很多的請求,如果花在網(wǎng)絡(luò)傳輸或者到數(shù)據(jù)庫的傳輸時間比較多,這部分等待時間CPU是閑置的,如果能夠提高CPU的利用率,也可能提高網(wǎng)站的處理能力,最充分的利用服務(wù)器的資源。如果不想改代碼而想提高CPU利用率,可以在IIS的應(yīng)用程序池中設(shè)置最大工作進(jìn)程數(shù)(默認(rèn)值為1),可以設(shè)置為10如果當(dāng)前CPU利用率只有百分之幾的話,調(diào)整這個數(shù)值需要特別注意每一個工作進(jìn)程是獨立的應(yīng)用程序,全局靜態(tài)變量不共享。
資訊列表