天天看點

Apache中KeepAlive 配置

引子

Apache中KeepAlive 配置

  先來分析一個yslow 測試的一個頁面的前端性能。

  這裡所有的請求是指http請求,對于一個請求各個階段的劃分,阻擋->域名解析->建立連接配接->發送請求->等待響應->接收資料。當然不是每個請求都要包含所有過程。

  在以上測試中,沒有涉及到請求下載下傳資源過程中還有一個部分:tcp請求的連結與斷開,而這篇文章正式說這個請求的。 

  那麼http請求和tcp請求是什麼關系呢?簡單點說就是一個tcp請求是比較靠近底層的,在它上面是http之類的應用請求,是以可以認為一個tcp請求包括很多個http請求(至于包括多少,apache中可以設定),同時tcp的連結與斷開比http請求的連結和斷開更需要消耗掉更多的記憶體資源和時間。 

keepalive的含義                                                                               

  keepalive配置的含義:對于http/1.1的用戶端來說,将會盡量的保持客戶的http連接配接,通過一個連接配接傳送多份http請求響應。這樣對于用戶端來說,可以提高50%左右的響應時間,而于伺服器端來說則降低了更多個連接配接的開銷。不過這個依賴于用戶端是否想保持連接配接。ie預設是保持連接配接的,當你打開100個圖檔的網站時,ie有可能隻打開2個連接配接,通過這兩個連接配接傳送資料,而不是開100個連接配接。

  在 apache 伺服器中,keepalive 是一個布爾值,on 代表打開,off 代表關閉,這個指令在其他衆多的 httpd 伺服器中都是存在的。

  keepalivetimeout 為持久連接配接保持的時間,也就是說,在這此連接配接結束後開始計時,多長時間内沒有重新發送http請求,就斷掉連接配接。預設設定為5秒,這個值可以大點,但不能太大,否則會出現同時等候過多連接配接,導緻多的記憶體被占用。

keepalive的作用                                                                              

如何謀求網絡帶寬與伺服器資源之間的平衡。這個要根據具體情況,具體分析。

那麼我們考慮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配置檔案                                                                                   

  如果設定keepalive ,找到這個設定的檔案頗為費時,以前版本的大多配置都在httpd.conf檔案,現在版本(2.4.2)的apache把不少配置都分離到不同的檔案中了,于是,我隻好一個檔案一個檔案的搜尋。

...apache/conf/extra/httpd-default.conf