天天看點

Apache 中 KeepAlive 配置的合理使用

 在 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,可以提高檔案系統通路的性能,并且系統會更加穩定。

  補充:   關于是否應該關閉 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 選項是劃算的,否則就可以考慮打開。