Apache 中關於Keep-alive的配置建議

在 Apache 服務器中,Keep-Alive 是一個布爾值,On 表明打開,Off 表明關閉,這個指令在其餘衆多的 HTTPD 服務器中都是存在的。javascript

Keep-Alive 配置指令決定當處理完用戶發起的 HTTP 請求後是否當即關閉 TCP 鏈接,若是 Keep-Alive 設置爲On,那麼用戶完成一次訪問後,不會當即斷開鏈接,若是還有請求,那麼會繼續在這一次 TCP 鏈接中完成,而不用重複創建新的 TCP 鏈接和關閉TCP 鏈接,能夠提升用戶訪問速度。css

那麼咱們考慮3種狀況:前端

  1. 用戶瀏覽一個網頁時,除了網頁自己外,還引用了多個 javascript 文件,多個 css 文件,多個圖片文件,而且這些文件都在同一個 HTTP 服務器上。java

  2. 用戶瀏覽一個網頁時,除了網頁自己外,還引用一個 javascript 文件,一個圖片文件。服務器

  3. 用戶瀏覽的是一個動態網頁,由程序即時生成內容,而且不引用其餘內容。網絡

對於上面3中狀況,我認爲:1 最適合打開 Keep-Alive ,2 隨意,3 最適合關閉 Keep-Alive性能

下面我來分析一下緣由。ui

在 Apache 中,打開和關閉 Keep-Alive 功能,服務器端會有什麼異同呢?spa

先看看理論分析。.net

打開 Keep-Alive 後,意味着每次用戶完成所有訪問後,都要保持必定時間後才關閉會關閉 TCP 鏈接,那麼在關閉鏈接以前,必然會有一個Apache 進程對應於該用戶而不能處理其餘用戶,假設 Keep-Alive 的超時時間爲 10 秒種,服務器每秒處理 50個獨立用戶訪問,那麼系統中 Apache 的總進程數就是 10 * 50 = 500 個,若是一個進程佔用 4M 內存,那麼總共會消耗 2G內存,因此能夠看出,在這種配置中,至關消耗內存,但好處是系統只處理了 50次 TCP 的握手和關閉操做。

若是關閉 Keep-Alive,若是仍是每秒50個用戶訪問,若是用戶每次連續的請求數爲3個,那麼 Apache 的總進程數就是 50 * 3= 150 個,若是仍是每一個進程佔用 4M 內存,那麼總的內存消耗爲 600M,這種配置能節省大量內存,可是,系統處理了 150 次 TCP的握手和關閉的操做,所以又會多消耗一些 CPU 資源。

再看看實踐的觀察。

我在一組大量處理動態網頁內容的服務器中,起初打開 Keep-Alive功能,常常觀察到用戶訪問量大時Apache進程數也很是多,系統頻繁使用交換內存,系統不穩定,有時負載會出現較大波動。關閉了 Keep-Alive功能後,看到明顯的變化是: Apache 的進程數減小了,空閒內存增長了,用於文件系統Cache的內存也增長了,CPU的開銷增長了,可是服務更穩定了,系統負載也比較穩定,不多有負載大範圍波動的狀況,負載有必定程度的下降;變化不明顯的是:訪問量較少的時候,系統平均負載沒有明顯變化。

總結一下:

內存很是充足的服務器上,不論是否關閉 Keep-Alive 功能,服務器性能不會有明顯變化;

若是服務器內存較少,或者服務器有很是大量的文件系統訪問時,或者主要處理動態網頁服務,關閉 Keep-Alive 後能夠節省不少內存,而節省出來的內存用於文件系統Cache,能夠提升文件系統訪問的性能,而且系統會更加穩定。

補充1:

關因而否應該關閉 Keep-Alive 選項,我以爲能夠基於下面的一個公式來判斷。

在理想的網絡鏈接情況下,系統的 Apache 進程數和內存使用能夠用以下公式表達:

HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)

HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess

換成中文:

總Apache進程數 = KeepAliveTimeout * 每秒種HTTP請求數 / 平均KeepAlive請求

Apache佔用內存 = 總Apache進程數 * 平均每進程佔用內存數

須要特別說明的是:

[平均Keep-Alive請求] 數,是指每一個用戶鏈接上服務器後,持續發出的 HTTP 請求數。當 Keep-AliveTimeout 等 0或者 Keep-Alive 關閉時,Keep-AliveTimeout 不參與乘的運算從上面的公式看,若是 [每秒用戶請求]多,[Keep-AliveTimeout] 的值大,[平均Keep-Alive請求] 的值小,都會形成 [Apache進程數] 多和 [內存]多,可是當 [平均Keep-Alive請求] 的值越大時,[Apache進程數] 和 [內存] 都是趨向於減小的。

基於上面的公式,咱們就能夠推算出當 平均Keep-Alive請求 <= Keep-AliveTimeout 時,關閉 Keep-Alive 選項是划算的,不然就能夠考慮打開。

補充2:  Keep-Alive 該參數控制Apache是否容許在一個鏈接中有多個請求,默認打開。但對於大多數論壇類型站點來講,一般設置爲off以關閉該支持。 

補充3:  若是服務器前跑有應用squid服務,或者其它七層設備,Keep-Alive On 設定要開啓持續長鏈接

實際在前端有 squid 的狀況下, Keep-Alive 很關鍵。記得 On



轉載於:http://www.nowamagic.net/academy/detail/23350332

相關文章
相關標籤/搜索