瀏覽器同域名請求的最大並發數限制


瀏覽器同域名請求的最大並發數限制

 

 

當我們在瀏覽網頁的時候,對瀏覽速度有一個重要的影響因素,就是瀏覽器的並發數量。並發數量簡單通俗的講就是,當瀏覽器網頁的時候同時工作的進行數量。

 

如果同時只有2個並發連接數數量,那網頁打開的時候只能依賴於這2條線程,前面如果有打開慢的內容,就會直接影響到后面的內容打開。但是如果同時有更多的並發連接數,這樣就會大大的提高網頁加載速度。詳情可查看我們之前發布的文章:並發連接數對瀏覽器加載速度的測試。瀏覽器的並發連接數也並非越大越好。

 

下表概括了基於主機上運行的IE瀏覽器的版本的最大並發連接數、主機的連接速度和服務器的受支持的協議版本。

  

1,HTTP客戶端一般對同一個服務器的並發連接個數都是有限制的。

實際上,瀏覽器確實使用並行連接,但它們將並行連接的總數限制為少量(通常為四個)。服務器可以自由地關閉來自特定客戶端的過多連接。

2,一些主流瀏覽器對HTTP 1.1和HTTP 1.0的最大並發連接數目,可以參考如下表格:

瀏覽器

HTTP / 1.1

HTTP / 1.0

IE 11

6

6

IE 10

6

6

IE 9

10

10

IE 8

6

6

IE 6,7

2

4

火狐

6

6

Safari 3,4

4

4

Chrome 4+

6

6

歌劇9.63,10.00alpha

4

4

Opera 10.51+

8

     

iPhone 2

4

iPhone 3

6

iPhone 4

4

iphone 5

6

     

Android2-4

4

 

3,Firefox 瀏覽器的最大並發連接數

在Firefox中的地址欄輸入“about:config中”,然后搜索並修改如下兩個配置項目即可:

network.http.max持久的連接 - 每個服務器

network.http.max持久的連接 - 每個代理

網絡。HTTP。最大的連接:設置的Http同時連接的最大數量

network.http.max持久的連接,每台服務器是連接同一個服務器允許的最大持久連接數,默認為6,可以不用更改。

network.http.max持久的連接 - 每個代理每個代理服務器允許的最大持久連接數

公司用戶使用代理服務器,但是外面的客戶一般不使用代理,火狐的維基推薦的network.http.max持久的連接,每台服務器設置為:<= 10。

4,IE 瀏覽器的最大並發連接數

用“注冊表編輯器”命令打開注冊表編輯器,找到:

[HKEY_CURRRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings],可以看到MaxConnectionsPerServerMaxConnectionsPer1_0Server

這兩個鍵(分別是針對HTTP 1.1和HTTP 1.0的設置)

對於IE 9

[HKEY_CURRRENT_USER \ Software \ Policies \ Microsoft \ Internet Exploer \ Main \ FeatureControl,可以看到FEATURE_MAXCONNECTIONSPER1_0SERVERFEATURE_MAXCONNECTIONSPERSERVER

這兩個鍵(分別是針對HTTP 1.1和HTTP 1.0的設置)

************************************************** **************************

5,假定一個瀏覽器的並發連接請求數為10,通常同一時間內會有多個用戶並發訪問網站。又考慮到,一個Http連接請求在同一時間只能被一個線程訪問。

所以,IHS服務器的httpd.conf里的maxclients(允許建立的總線程數)要能夠處理峰值時刻的瀏覽器連接請求才行。

同時,考慮不是所有的連接請求都會到was server,有的連接只是為了在web服務器上取靜態資源,所以,was上的線程池數目(Thread pools :50 )會遠小於IHS server上的maxclients值譬如400)。

************************************************** *****************************

6,HTTP 連接請求與線程

HTTP連接是復雜,有狀態的對象,所以它必須被妥善管理。一HTTP 連接請求在同一時間只能被一個線程訪問。

HttpClient的使用一個叫做的Http連接管理器的特殊實體類來管理的Http連接.Http連接管理器在新建的HTTP連接時,作為工廠類;管理持久的http連接的生命周期;同步持久連接(確保線程安全,即一個HTTP連接同一時間只能被一個線程訪問)。

如果一個的Http連接被釋放或者被它的消費者明確表示要關閉,那么底層的連接就會和它的代理進行分離,並且該連接會被交還給連接管理器。這是,即使服務消費者仍然持有代理的引用,它也不能再執行I / O操作,或者更改的Http連接的狀態。

如圖7所示,連接池管理器

連接池管理器是個復雜的類,它管理着連接池,可以同時為很多線程提供HTTP連接請求。當請求一個新的連接時,如果連接池有有可用的持久連接,連接管理器就會使用其中的一個,而不是再創建一個新的連接。

當使用了請求連接池管理器后,HttpClient的就可以同時執行多個線程的請求了。

連接池管理器會根據它的配置來分配請求連接。如果連接池中的所有連接都被占用了,那么后續的請求就會被阻塞,直到有連接被釋放回連接池中。

8,線程池的原理

線程池的原理很簡單,類似於操作系統中的緩沖區的概念,它的流程如下:

線程池在還沒有任務到來之前,創建一定數量的線程,放入空閑隊列中。這些線程都是處於睡眠狀態,即均為啟動,不消耗CPU,而只是占用較小的內存空間。當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求后,線程又處於睡眠狀態。

線程池能節約大量的的系統資源,使得更多的CPU時間和內存用來處理實際的商業應用,而不是頻繁的線程創建與銷毀

每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大。

在什么情況下使用線程池:
1.單個任務處理的時間比較短
2.將需處理的任務的數量大

9,數據庫連接池

數據庫連接池的解決方案是在應用程序啟動時建立足夠的數據庫連接,並講這些連接組成一個連接池(簡單說:在一個“池”里放了好多半成品的數據庫聯接對象),由應用程序動態地對池中的連接進行申請,使用和釋放。對於多於連接池中連接數的並發請求,應該在請求隊列中排隊等待。並且應用程序可以根據池中連接的使用率,動態增加或減少池中的連接數。 
連接池技術盡可能多地重用了消耗內存地資源,大大節省了內存,提高了服務器地服務效率,能夠支持更多的客戶服務。通過使用連接池,將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量,使用情況等。

1)最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費; 
2)最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。

數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的性能低下。

10,WebSphere Application Server性能

http://websphere.sys-con.com/node/46514/print

構建服務器應用程序的一個過於簡單的模型是:每當一個請求到達就創建一個新的服務對象,然后在新的服務對象中為請求服務但當有大量請求並發訪問時,服務器不斷的創建和銷毀對象的開銷很大。

在面向對象的編程中,創建和銷毀對象是很浪費資源的,因為創建一個對象要獲取內存資源或者其它更多資源。在Java的中更是如此,虛擬機試圖跟蹤每一個對象,以便能夠在對象銷毀后進行垃圾回收。所以,提高程序效率的一個手段就是盡可能減少創建和銷毀對象的次數。利用已有的對象來服務就是“池化資源”技術產生的原因。

圖1顯示了一個需要后端處理的應用程序請求流程,並說明了在處理用戶請求時線程池之間的關系。 

HTTP偵聽器
HTTP偵聽器負責在HTTP服務器級別創建線程。這里發生的大多數處理是靜態頁面服務,或HTTP post / GET傳遞命令到后端。這是必須考慮的第一級線程配置。

Web容器
Web容器負責在應用程序服務器級別創建線程池。此級別的大多數處理包括servlet,JSP,EJB,動態頁面創建和后端傳遞處理。Web容器是必須配置的第二級線程池配置。

ORB容器 ORB容器負責在對象級創建線程池。這里發生的大部分處理包括處理基於非Web的客戶端。ORB容器是必須配置的線程池配置的第三級。

數據源
數據源級負責創建從數據庫或“傳統”系統訪問的連接線程。這些線程是必須解決的第四級配置

 

連接數的小故事

 

實際情況(china):

 

連接數的真相

 

很多客戶端軟件可以修改電腦的最大連接數,比如:迅雷、暴風影音等。

 

之前我們曾跟大家分享過如何修改IE瀏覽器的並發連接數,如果你正在使用IE7及以下的更低版本,不妨嘗試將連接數修改到6,這將有助於提升打開網站的速度。

 

舉個例子:

 

IE8

 

和IE6完全不同的瀑布圖,其特點有:

  • 最大並發HTTP連接數為6個。
  • javascript文件已經不會阻塞其他資源的加載,甚至多個javascript文件可以一起加載,並且會保證執行的順序。
  • 會分析HTML結構,優先下載script和link標簽定義的外部資源。

Firefox3.6

 

和IE8的幾乎完全一樣:

  • 最大並發HTTP連接數為6個(可在about:config中修改)。
  • javascript文件不會阻塞其他資源的加載,多個javascript文件可以一起加載。
  • 會分析HTML結構,優先下載script和link標簽定義的外部資源。

Firefox4 beta12

 

不知是因為設計理念上的不同,還是因為beta版未照顧到這一塊,Firefox4反而退化了,和Firefox3.6的區別主要體現在對資源類型的處理上,Firefox4不再嚴格地優先下載script和link標簽定義的外部資源,而是按照HTML結構中出現的順序來進行加載。

Chrome8

 

Chrome自帶的工具不能很清楚地表示各請求的開始時間,所以使用了Fiddler的瀑布圖,從圖上可以看出,Chrome也是比較特立獨行的一位,其特點有:

  • 最大並發HTTP連接數為6。
  • head部分的資源會單獨下載,且阻塞body中的其他資源的加載。
  • 會優先加載script和link標簽定義的資源。

Opera11

 

先報怨一下,Dragonfly不怎么好用來着……Opera的資源加載也比較有特色,而且很難看出規律,只能大致總結一下:

  • Opera的最大並發HTTP連接數默認為16,可在opera:config - Performance - Max Connections Server查看和修改。
  • javascript文件的加載會阻塞其他script和link標簽定義的外部資源的加載,如圖中的2.js。但不會阻塞圖片等其他資源的加載,如圖中的3.js。
  • 會一定程度上對資源的優先級進行優化,但由於javascript文件要阻止后續部分資源的加載,又為了充分利用最大HTTP連接數,因此不能嚴格先加載所有的script和link標簽定義的資源,導致瀑布圖上各類型資源有相互穿插,難尋規律。

這還是在比較樂觀的情況下,有幾秒加載完畢的,按道理來說,圖片都不大,應該都在1秒范圍內就才是在接收范圍內。當然和用戶自身的帶寬也有關系,但是從我的觀察來看,是分批加載的。

於是乎我查看資料,發現。

從Yahoo關於網站優化的經典14條建議,在V2版中,已經更新到35條了,其中有需要減少請求連接數和減少DNS解析次數,由於在http協議中有對瀏覽器並發請求連接數的限制,1.1版本中規定了是2個(相關資料可以查看文章的結尾),於是通常的優化網站加載速度的方法是采用多個域名增加瀏覽器對同一網頁的請求並發連接數。

二、下面我來看看各大電商是怎么處理的。

1.京東(www.jd.com)

    京東圖片域名一直是老域名360buyimg.com。

    http://img13.360buyimg.com/da/jfs/t1879/131/2924301202/126044/7c7cbf5c/56f3b58fN37c1340a.jpg

    比如說這張圖片,你可以復制打開這個鏈接,把前面的二級域名的Img13換成img11、img12、img13等,發現都是可以打開的,而且一般是同一IP,有的同學說換成img8、img1、img2等打不開,這個是策略問題。這只是舉個栗子。

2.天貓(www.tmall.com)

    圖片CDN域名有很多,tbcdn.cn、alicdn.com 等

    也是同理,不過最近HTTPS轉變后都換成img.alicdn.com了。原因不明。

三、說一下Firefox瀏覽器

Firefox地址欄中輸入:about:config

在搜索項輸入:network.http.max-connections

老版本值是30,我這個版本是256,說明有改進。

我們再輸入:network.http.max-persistent-connections-per-server進行搜索,發現是6。

你可以寫個Demo測試一下,寫個小循環,然后訪問同一個域名(推薦用 Ajax  方式),然后后台sleep一會,你就能看出效果。之前有人做過低版本的測試,得出結論。

IE8的並發連接數限制為10;

Firefox    和 chrome  的並發連接數都為6,可能各個版本有區別。作為一個站長,或者說一個完善的產品,這個是不得不考慮的。

解決方案:

1.給定一組域名,如:img1.baidu.com、img2.baidu.com、img3.baidu.com、img4.baidu.com... ... 

2.這組域名指向同一個源,或者說最終源是一個。

3.上傳圖片(靜態文件)的時候隨機返回這組域名中的其中一個即可,這樣圖片的訪問域名就不會出現只是一個域名了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM