高并發Web服務的演變 - 節約系統內存和CPU

fdwm 9年前發布 | 9K 次閱讀 Web服務

原文  http://linux.cn/article-5294-1-rss.html

一、越來越多的并發連接數

現在的Web系統面對的并發連接數在近幾年呈現指數增長,高并發成為了一種常態,給Web系統帶來不小的挑戰。以最簡單粗暴的方式解決,就是增加 Web系統的機器和升級硬件配置。雖然現在的硬件越來越便宜,但是一味地通過增加機器來解決并發量的增長,成本是非常高昂的。結合技術優化方案,才是更有 效的解決方法。

并發連接數為什么呈指數增長?實際上,從這幾年的用戶基數上看,這個數量并沒有出現指數增長,因此它并非主要原因。主要原因,還是web變得更復雜,交互更豐富所導致的。

高并發Web服務的演變 - 節約系統內存和CPU

1. 頁面元素增多,交互復雜

Web頁面元素越來越多,更為豐富。更多的資源元素,意味著更多的下載請求。Web系統的交互越來越復雜,交互場景和次數也大幅增加。以 “www.qq.com”的首頁為例子,刷新一次,大概會有244個請求。并且,在頁面打開完成之后,還會有一些定時的查詢或者上報請求持續運作。

高并發Web服務的演變 - 節約系統內存和CPU

目前的Http請求,為了減少反復的創建和銷毀連接行為,通常都建立長連接(Connection keep-alive)。一經建立,這個連接 會被保持住一段時間,被后續請求復用。然而,它也帶來了另一個新的問題,連接的保持是會占用Web系統服務端資源的,如果不充分使用這個連接,會導致資源 浪費。長連接被創建后,首批資源傳輸完畢,之后幾乎沒有數據交互,一直到超時時間,才會自動釋放長連接占據的系統資源。

高并發Web服務的演變 - 節約系統內存和CPU

除此之外,還有一些Web需求本身就需要長期保持連接的,例如Web socket。

2. 主流的本瀏覽器的連接數在增加

面對越來越豐富的Web資源,主流瀏覽器并發連接數也在增加,同一個域下,早期的瀏覽器一般只有1-2個下載連接,而目前的主流瀏覽器通常在 2-6個。增加瀏覽器并發連接數目,在需要下載資源比較多的場景下,可以加快頁面的加載速度。更多的連接對瀏覽器加載頁面元素是有好處的,在某些連接遭遇 “網絡阻塞”的情況下,其他正常的下載連接可以繼續工作。

這樣自然無形增加了Web系統后端的壓力,更多的下載連接意味著占據了更多的Web服務器的資源。而在用戶訪問高峰期,自熱而然就形成了“高并 發”場景。這些連接和請求,占據了服務器的大量CPU和內存等資源。尤其在資源數目超過100+的網站頁面中,使用更多的下載連接,非常有必要。

二、Web前端優化,降低服務端壓力

在緩解“高并發”的壓力,需要前端和后端的共同配合優化,才能達到最大效果。在用戶第一線的Web前端,可以起到減少或者減輕Http請求的效果。

1. 減少Web請求

常用的實現方法是通過Http協議頭中的expire或max-age來控制,將靜態內容放入瀏覽器的本地緩存,在之后的一段時間里,不再請求 Web服務器,直接使用本地資源。還有HTML5中的本地存儲技術(LocalStorage),也被作為一個強大的數據本地緩存。

高并發Web服務的演變 - 節約系統內存和CPU

這種方案緩存后,根本不發送請求到Web服務器,大幅降低服務器壓力,也帶來了良好的用戶體驗。但是,這種方案,對首次訪問的用戶無效,同時,也影響部分Web資源的實時性。

2. 減輕Web請求

瀏覽器的本地緩存是存在過期時間的,一旦過期,就必須重新向服務器請求。這個時候,會有兩種情形:

(1)服務器的資源內容沒有更新,瀏覽器請求Web資源,服務器回復“可以繼續使用本地緩存”。(發生通信,但是Web服務器只需要做簡單“回復”)

(2)服務器的文件或者內容已經更新,瀏覽器請求Web資源,Web服務器通過網絡傳輸新的資源內容。(發生通信,Web服務器需要完成復雜的傳輸工作)

這里的協商方式是通過Http協議的Last-Modified或Etag來控制,這個時候請求服務器,如果是內容沒有發生變更的情況,服務器會 返回304 Not Modified。這樣的話,就不需要每次請求Web服務器都做復雜的傳輸完整數據文件的工作,只要簡單的http應答就可以達到相 同的效果。

高并發Web服務的演變 - 節約系統內存和CPU

雖然上述請求,起到“減輕”Web服務器的壓力,但是連接仍然被建立,請求也發生了。

3. 合并頁面請求

如果是比較老一些的Web開發者,應該會更有印象,在ajax盛行之前。頁面大部分都是直接輸出的,并沒有這么多的ajax請求,Web后端將頁 面內容完全拼湊好了,再返回給前端。那個時候,頁面靜態化,是一個挺廣泛的優化方式。后來,被交互更友好的ajax漸漸替代了,一個頁面的請求也變得越來 越多。

由于移動端的網絡(2G/3G)比起PC寬帶差很多,并且部分手機配置比較低,面對一個超過100個請求的網頁,加載的速度會緩慢很多。于是,優化的方向又重新回到合并頁面元素,減少請求數量:

(1)合并HTML展示內容。將CSS和JS直接嵌入到HTML頁面內,不通過連接的方式引入。

(2)Ajax動態內容合并請求。對于動態內容,將10次Ajax請求合并為1次的批量信息查詢。

(3)小圖片合并,通過CSS的偏移量技術Sprites,將很多小圖片合并為一張。這個優化方式,在PC端的Web優化中,也非常常見。

高并發Web服務的演變 - 節約系統內存和CPU

合并請求,減少了傳輸數據的次數,也就是相當于將它們從一個一個地請求,變為一次的“批量”請求。上述優化方法,到達“減輕”Web服務器壓力的目的,減少了需要建立的連接。

</div>


 本文由用戶 fdwm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!