在Apache 伺服器中,KeepAlive 是一個布爾值,On 代表開啟,Off 代表關閉,這個指令在其他眾多的HTTPD 伺服器中都是存在的。
KeepAlive 配置指令決定當處理完使用者發起的HTTP 要求後是否立即關閉TCP 串連,如果KeepAlive 設定為On,那麼使用者完成一次訪問後,不會立即中斷連線,如果還有請求,那麼會繼續在這一次TCP 串連中完成,而不用重複建立新的TCP 串連和關閉TCP 串連,可以提高使用者訪問速度。
那麼我們考慮3種情況:
1。使用者瀏覽一個網頁時,除了網頁本身外,還引用了多個javascript 檔案,多個css 檔案,多個圖片檔案,並且這些檔案都在同一個HTTP 伺服器上。
2。使用者瀏覽一個網頁時,除了網頁本身外,還引用一個javascript 檔案,一個圖片檔案。
3。使用者瀏覽的是一個動態網頁,由程式即時產生內容,並且不引用其他內容。
對於上面3中情況,我認為:1 最適合開啟KeepAlive ,2 隨意,3 最適合關閉KeepAlive
下面我來分析一下原因。
在Apache 中,開啟和關閉KeepAlive 功能,伺服器端會有什麼異同呢?
先看看理論分析。
開啟KeepAlive 後,意味著每次使用者完成全部訪問後,都要保持一定時間後才關閉會關閉TCP 串連,那麼在關閉串連之前,必然會有一個Apache 進程對應於該使用者而不能處理其他使用者,假設KeepAlive 的逾時時間為10 秒種,伺服器每秒處理50個獨立使用者訪問,那麼系統中Apache 的總進程數就是10 * 50 =500 個,如果一個進程佔用4M 記憶體,那麼總共會消耗2G記憶體,所以可以看出,在這種配置中,相當消耗記憶體,但好處是系統只處理了 50次TCP 的握手和關閉操作。
如果關閉KeepAlive,如果還是每秒50個使用者訪問,如果使用者每次連續的請求數為3個,那麼Apache 的總進程數就是50 * 3= 150 個,如果還是每個進程佔用4M 記憶體,那麼總的記憶體消耗為600M,這種配置能節省大量記憶體,但是,系統處理了150 次TCP的握手和關閉的操作,因此又會多消耗一些CPU 資源。
在看看實踐的觀察。
我在一組大量處理動態網頁內 容的伺服器中,起初開啟KeepAlive功能,經常觀察到使用者訪問量大時Apache進程數也非常多,系統頻繁使用交換記憶體,系統不穩定,有時負載會出現較大波動。關閉了KeepAlive功能後,看到明顯的變化是:Apache 的進程數減少了,空閑記憶體增加了,用於檔案系統Cache的記憶體也增加了,CPU的開銷增加了,但是服務更穩定了,系統負載也比較穩定,很少有負載大範圍 波動的情況,負載有一定程度的降低;變化不明顯的是:訪問量較少的時候,系統平均負載沒有明顯變化。
總結一下:
在記憶體非常充足的伺服器上,不管是否關閉KeepAlive 功能,伺服器效能不會有明顯變化;
如果伺服器記憶體較少,或者伺服器有非常大量的檔案系統訪問時,或者主要處理動態網頁服務,關閉KeepAlive 後可以節省很多記憶體,而節省出來的記憶體用於檔案系統Cache,可以提高檔案系統訪問的效能,並且系統會更加穩定。
補充1:
關於是否應該關閉KeepAlive 選項,我覺得可以基於下面的一個公式來判斷。
在理想的網路連接狀況下,系統的Apache 進程數和記憶體使用量可以用如下公式表達:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
換成中文:
總Apache進程數= KeepAliveTimeout * 每秒種HTTP請求數/ 平均KeepAlive請求
Apache佔用記憶體= 總Apache進程數* 平均每進程佔用記憶體數
需要特別說明的是:
[平均KeepAlive請求] 數,是指每個使用者串連上伺服器後,持續發出的HTTP 要求數。當KeepAliveTimeout 等0或者KeepAlive 關閉時,KeepAliveTimeout 不參與乘的運算從上面的公式看,如果[每秒使用者請求]多,[KeepAliveTimeout] 的值大,[平均KeepAlive請求] 的值小,都會造成[Apache進程數] 多和[記憶體]多,但是當[平均KeepAlive請求] 的值越大時,[Apache進程數] 和[記憶體] 都是趨向於減少的。
基於上面的公式,我們就可以推算出當 平均KeepAlive請求<= KeepAliveTimeout 時,關閉KeepAlive 選項是划算的,否則就可以考慮開啟。
補充2: KeepAlive 該參數控制Apache是否允許在一個串連中有多個請求,預設開啟。但對於大多數論壇類型網站來說,通常設定為off以關閉該支援。
補充3: 如果伺服器前跑有應用squid服務,或者其它七層裝置,KeepAlive On 設定要開啟持續長串連
實際在 前端有squid 的情況下, KeepAlive 很關鍵。記得On