學(xué)習(xí)Http系列_2:HTTP中的keep-alive
Posted on 2009-06-14 12:23 60 閱讀(2605) 評(píng)論(0) 編輯 收藏 所屬分類: 網(wǎng)絡(luò)學(xué)習(xí)HTTP Keep-Alive
Keep-Alive功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),Keep-Alive功能避免了建立或者重新建立連接。市場(chǎng)上的大部分Web服務(wù)器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。對(duì)于提供靜態(tài)內(nèi)容的網(wǎng)站來(lái)說,這個(gè)功能通常很有用。但是,對(duì)于負(fù)擔(dān)較重的網(wǎng)站來(lái)說,這里存在另外一個(gè)問題:雖然為客戶保留打開的連接有一定的好處,但它同樣影響了性能,因?yàn)樵谔幚頃和F陂g,本來(lái)可以釋放的資源仍舊被占用。當(dāng)Web服務(wù)器和應(yīng)用服務(wù)器在同一臺(tái)機(jī)器上運(yùn)行時(shí),Keep-Alive功能對(duì)資源利用的影響尤其突出。
為什么有些apache服務(wù)器,負(fù)載很高,把Keep-Alive關(guān)掉負(fù)載就減輕了呢?
apache 有兩種工作模式,prefork和worker。apache 1.x只有,prefork。
prefork比較典型,就是個(gè)進(jìn)程池,每次創(chuàng)建一批進(jìn)程,還有apache是基于select實(shí)現(xiàn)的。在用戶不是太多的時(shí)候,長(zhǎng)連接還是很有用的,可以節(jié)約分組,提升響應(yīng)速度,但是一旦超出某個(gè)平衡點(diǎn),由于為了保持很多長(zhǎng)連接,創(chuàng)建了太多的進(jìn)程,導(dǎo)致系統(tǒng)不堪重負(fù),內(nèi)存不夠了,開始換入換出,cpu也被很多進(jìn)程吃光了,load上去了。這種情況下,對(duì)apache來(lái)說,每次請(qǐng)求重新建立連接要比保持這么多長(zhǎng)連接和進(jìn)程更劃算。
--------------------------------------------------------
KeepAliveTime 值控制 TCP/IP 嘗試驗(yàn)證空閑連接是否完好的頻率。如果這段時(shí)間內(nèi)沒有活動(dòng),則會(huì)發(fā)送保持活動(dòng)信號(hào)。如果網(wǎng)絡(luò)工作正常,而且接收方是活動(dòng)的,它就會(huì)響應(yīng)。如果需要對(duì)丟失接收方敏感,換句話說,需要更快地發(fā)現(xiàn)丟失了接收方,請(qǐng)考慮減小這個(gè)值。如果長(zhǎng)期不活動(dòng)的空閑連接出現(xiàn)次數(shù)較多,而丟失接收方的情況出現(xiàn)較少,您可能會(huì)要提高該值以減少開銷。缺省情況下,如果空閑連接 7200000 毫秒(2 小時(shí))內(nèi)沒有活動(dòng),Windows 就發(fā)送保持活動(dòng)的消息。通常,1800000 毫秒是首選值,從而一半的已關(guān)閉連接會(huì)在 30 分鐘內(nèi)被檢測(cè)到。 KeepAliveInterval 值定義了如果未從接收方收到保持活動(dòng)消息的響應(yīng),TCP/IP 重復(fù)發(fā)送保持活動(dòng)信號(hào)的頻率。當(dāng)連續(xù)發(fā)送保持活動(dòng)信號(hào)、但未收到響應(yīng)的次數(shù)超出 TcpMaxDataRetransmissions 的值時(shí),會(huì)放棄該連接。如果期望較長(zhǎng)的響應(yīng)時(shí)間,您可能需要提高該值以減少開銷。如果需要減少花在驗(yàn)證接收方是否已丟失上的時(shí)間,請(qǐng)考慮減小該值或 TcpMaxDataRetransmissions 值。缺省情況下,在未收到響應(yīng)而重新發(fā)送保持活動(dòng)的消息之前,Windows 會(huì)等待 1000 毫秒(1 秒)。 KeepAliveTime 根據(jù)你的需要設(shè)置就行,比如10分鐘,注意要轉(zhuǎn)換成MS。 XXX代表這個(gè)間隔值得大小。