


Apache中KeepAlive配置的合理使用good
在 Apache 服務(wù)器中,KeepAlive 是一個(gè)布爾值,On 代表打開(kāi),Off 代表關(guān)閉,這個(gè)指令在其他眾多的 HTTPD 服務(wù)器中都是存在的。
KeepAlive 配置指令決定當(dāng)處理完用戶發(fā)起的 HTTP 請(qǐng)求后是否立即關(guān)閉 TCP 連接,如果 KeepAlive 設(shè)置為 On,那么用戶完成一次訪問(wèn)后,不會(huì)立即斷開(kāi)連接,如果還有請(qǐng)求,那么會(huì)繼續(xù)在這一次 TCP 連接中完成,而不用重復(fù)建立新的 TCP 連接和關(guān)閉 TCP 連接,可以提高用戶訪問(wèn)速度。
那么我們考慮3種情況:
1。用戶瀏覽一個(gè)網(wǎng)頁(yè)時(shí),除了網(wǎng)頁(yè)本身外,還引用了多個(gè) java 文件,多個(gè) css 文件,多個(gè)圖片文件,并且這些文件都在同一個(gè) HTTP 服務(wù)器上。
2。用戶瀏覽一個(gè)網(wǎng)頁(yè)時(shí),除了網(wǎng)頁(yè)本身外,還引用一個(gè) java 文件,一個(gè)圖片文件。
3。用戶瀏覽的是一個(gè)動(dòng)態(tài)網(wǎng)頁(yè),由程序即時(shí)生成內(nèi)容,并且不引用其他內(nèi)容。
對(duì)于上面3中情況,我認(rèn)為:1 最適合打開(kāi) KeepAlive ,2 隨意,3 最適合關(guān)閉 KeepAlive
下面我來(lái)分析一下原因。
在 Apache 中,打開(kāi)和關(guān)閉 KeepAlive 功能,服務(wù)器端會(huì)有什么異同呢?
先看看理論分析。
打 開(kāi) KeepAlive 后,意味著每次用戶完成全部訪問(wèn)后,都要保持一定時(shí)間后才關(guān)閉會(huì)關(guān)閉 TCP 連接,那么在關(guān)閉連接之前,必然會(huì)有一個(gè) Apache 進(jìn)程對(duì)應(yīng)于該用戶而不能處理其他用戶,假設(shè) KeepAlive 的超時(shí)時(shí)間為 10 秒種,服務(wù)器每秒處理 50 個(gè)獨(dú)立用戶訪問(wèn),那么系統(tǒng)中 Apache 的總進(jìn)程數(shù)就是 10 * 50 = 500 個(gè),如果一個(gè)進(jìn)程占用 4M 內(nèi)存,那么總共會(huì)消耗 2G 內(nèi)存,所以可以看出,在這種配置中,相當(dāng)消耗內(nèi)存,但好處是系統(tǒng)只處理了 50次 TCP 的握手和關(guān)閉操作。
如 果關(guān)閉 KeepAlive,如果還是每秒50個(gè)用戶訪問(wèn),如果用戶每次連續(xù)的請(qǐng)求數(shù)為3個(gè),那么 Apache 的總進(jìn)程數(shù)就是 50 * 3 = 150 個(gè),如果還是每個(gè)進(jìn)程占用 4M 內(nèi)存,那么總的內(nèi)存消耗為 600M,這種配置能節(jié)省大量?jī)?nèi)存,但是,系統(tǒng)處理了 150 次 TCP 的握手和關(guān)閉的操作,因此又會(huì)多消耗一些 CPU 資源。
在看看實(shí)踐的觀察。
我 在一組大量處理動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容的服務(wù)器中,起初打開(kāi) KeepAlive 功能,經(jīng)常觀察到用戶訪問(wèn)量大時(shí)Apache進(jìn)程數(shù)也非常多,系統(tǒng)頻繁使用交換內(nèi)存,系統(tǒng)不穩(wěn)定,有時(shí)負(fù)載會(huì)出現(xiàn)較大波動(dòng)。關(guān)閉了 KeepAlive 功能后,看到明顯的變化是: Apache 的進(jìn)程數(shù)減少了,空閑內(nèi)存增加了,用于文件系統(tǒng)Cache的內(nèi)存也增加了,CPU 的開(kāi)銷增加了,但是服務(wù)更穩(wěn)定了,系統(tǒng)負(fù)載也比較穩(wěn)定,很少有負(fù)載大范圍波動(dòng)的情況,負(fù)載有一定程度的降低;變化不明顯的是:訪問(wèn)量較少的時(shí)候,系統(tǒng)平均 負(fù)載沒(méi)有明顯變化。
總結(jié)一下:
在內(nèi)存非常充足的服務(wù)器上,不管是否關(guān)閉 KeepAlive 功能,服務(wù)器性能不會(huì)有明顯變化;
如果服務(wù)器內(nèi)存較少,或者服務(wù)器有非常大量的文件系統(tǒng)訪問(wèn)時(shí),或者主要處理動(dòng)態(tài)網(wǎng)頁(yè)服務(wù),關(guān)閉 KeepAlive 后可以節(jié)省很多內(nèi)存,而節(jié)省出來(lái)的內(nèi)存用于文件系統(tǒng)Cache,可以提高文件系統(tǒng)訪問(wèn)的性能,并且系統(tǒng)會(huì)更加穩(wěn)定。
補(bǔ)充:
關(guān)于是否應(yīng)該關(guān)閉 KeepAlive 選項(xiàng),我覺(jué)得可以基于下面的一個(gè)公式來(lái)判斷。
在理想的網(wǎng)絡(luò)連接狀況下,系統(tǒng)的 Apache 進(jìn)程數(shù)和內(nèi)存使用可以用如下公式表達(dá):
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
換成中文:
總Apache進(jìn)程數(shù) = KeepAliveTimeout * 每秒種HTTP請(qǐng)求數(shù) / 平均KeepAlive請(qǐng)求
Apache占用內(nèi)存 = 總Apache進(jìn)程數(shù) * 平均每進(jìn)程占用內(nèi)存數(shù)
需要特別說(shuō)明的是:
[平 均KeepAlive請(qǐng)求] 數(shù),是指每個(gè)用戶連接上服務(wù)器后,持續(xù)發(fā)出的 HTTP 請(qǐng)求數(shù)。當(dāng) KeepAliveTimeout 等 0 或者 KeepAlive 關(guān)閉時(shí),KeepAliveTimeout 不參與乘的運(yùn)算從上面的公式看,如果 [每秒用戶請(qǐng)求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive請(qǐng)求] 的值小,都會(huì)造成 [Apache進(jìn)程數(shù)] 多和 [內(nèi)存] 多,但是當(dāng) [平均KeepAlive請(qǐng)求] 的值越大時(shí),[Apache進(jìn)程數(shù)] 和 [內(nèi)存] 都是趨向于減少的。
基于上面的公式,我們就可以推算出當(dāng) 平均KeepAlive請(qǐng)求 <= KeepAliveTimeout 時(shí),關(guān)閉 KeepAlive 選項(xiàng)是劃算的,否則就可以考慮打開(kāi)。
關(guān)鍵字:Apache KeepAlive 配置 合理 使用 good
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解