不可忽略的Keep Alive

在網頁開發過程中,Keep-Alive是HTTP協議中非常重要的一個屬性。大家知道HTTP構建在TCP之上。在HTTP早期實現中,每個HTTP請求都要打開一個socket連接。這種做效率很低,因爲一個Web 頁面中的很多HTTP請求都指向同一個服務器。例如,很多爲Web頁面中的圖片發起的請求都指向一個通用的圖片服務器。持久連接的引入解決了多對已請求服務器導致的socket連接低效性的問題。它使瀏覽器可以再一個單獨的連接上進行多個請求。瀏覽器和服務器使用Connection頭ilai指出對Keep-Alive的支持。

 

筆者在去年遇到一個跟Keep-Alive的問題:

 

問題現象: 一個JSP頁面,居然要耗時40多秒。網頁中有大量的圖片的CSS

 

問題解決: 原因也找了半天,原來Apache配置裏面,把Keep-Alive的開關關閉了。這個是個大問題,工程師爲什麼要關閉它,原來他考慮的太簡單了,我們知道Apache適合處於短連接的請求,處理時間越短,併發數才能上去,原來他是這麼考慮,但是沒有辦法,只能這樣了,還是打開Keep-Alive開關吧。

 當然,不是所有的情況都設置KeepAlive爲On,下面的文字總結比較好:

 

【在使用apache 的過程中,KeepAlive 屬性我一直保持爲默認值On,其實,該屬性設置爲On還是Off還是要具體問題具體分析的,在生產環境中的影響還是蠻大的。

KeepAlive 選項到底有什麼用處?如果你用過Mysql ,應該知道Mysql的連接屬性中有一個與KeepAlive 類似的Persistent Connection,即:長連接(PConnect)。該屬性打開的話,可以使一次TCP連接爲同一用戶的多次請求服務,提高了響應速度。

比如很多網頁中圖片、CSS、JS、Html都在一臺Server上,當用戶訪問其中的Html網頁時,網頁中的圖片、Css、Js都構成了訪問請求,打開KeepAlive 屬性可以有效地降低TCP握手的次數(當然瀏覽器對同一域下同時請求的圖片數有限制,一般是2),減少httpd進程數,從而降低內存的使用(假定prefork模式)。MaxKeepAliveRequests 和KeepAliveTimeOut 兩個屬性在KeepAlive =On時起作用,可以控制持久連接的生存時間和最大服務請求數。

不過,上面說的只是一種情形,那就是靜態網頁居多的情況下,並且網頁中的其他請求與網頁在同一臺Server上。當你的應用動態程序(比如:php )居多,用戶訪問時由動態程序即時生成html內容,html內容中圖片素材和Css、Js等比較少或者散列在其他Server上時,KeepAlive =On反而會降低Apache 的性能。爲什麼呢?

前面提到過,KeepAlive =On時,每次用戶訪問,打開一個TCP連接,Apache 都會保持該連接一段時間,以便該連接能連續爲同一client服務,在KeepAliveTimeOut還沒到期並且MaxKeepAliveRequests還沒到閾值之前,Apache 必然要有一個httpd進程來維持該連接,httpd進程不是廉價的,他要消耗內存和CPU時間片的。假如當前Apache 每秒響應100個用戶訪問,KeepAliveTimeOut=5,此時httpd進程數就是100*5=500個(prefork 模式),一個httpd進程消耗5M內存的話,就是500*5M=2500M=2.5G,誇張吧?當然,Apache 與Client只進行了100次TCP連接。如果你的內存夠大,系統負載不會太高,如果你的內存小於2.5G,就會用到Swap,頻繁的Swap切換會加重CPU的Load。

現在我們關掉KeepAlive ,Apache 仍然每秒響應100個用戶訪問,因爲我們將圖片、js、css等分離出去了,每次訪問只有1個request,此時httpd的進程數是100*1=100個,使用內存100*5M=500M,此時Apache 與Client也是進行了100次TCP連接。性能卻提升了太多。

總結:

1、當你的Server內存充足時,KeepAlive =On還是Off對系統性能影響不大。

2、當你的Server上靜態網頁(Html、圖片、Css、Js)居多時,建議打開KeepAlive 。

3、當你的Server多爲動態請求(因爲連接數據庫,對文件系統訪問較多),KeepAlive 關掉,會節省一定的內存,節省的內存正好可以作爲文件系統的Cache(vmstat命令中cache一列),降低I/O壓力。

PS:當KeepAlive =On時,KeepAliveTimeOut的設置其實也是一個問題,設置的過短,會導致Apache 頻繁建立連接,給Cpu造成壓力,設置的過長,系統中就會堆積無用的Http連接,消耗掉大量內存,具體設置多少,可以進行不斷的調節,因你的網站瀏覽和服務器配置 而異。


發佈了19 篇原創文章 · 獲贊 23 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章