1. 程式人生 > >Keep Alive 優化例子與總結

Keep Alive 優化例子與總結

       有的網站會在伺服器執行一段時間後down掉,有很多原因可能造成這種現象:比如tomcat堆和非堆記憶體設定不足,程式沒能釋放記憶體空間造成記憶體溢位,或者某些程序一直執行沒能釋放,造成cup資源大量消耗。

      但除了程式本身的原因,還有可能是客服端訪問造成(當然這個客戶端也包含如蜘蛛軟體等搜尋引擎),如果伺服器和客戶端建立的是長連結(可以用"netstat -a"命令檢視網路訪問資訊),這就需要對http響應頭的connection做一定的設定。

      介紹如下:

1. 解釋一下:

    在http1.1中request和reponse header中都有可能出現一個connection頭欄位,此header的含義是當client和server通訊時對於長連結如何進行處理。

    在http1.1中,client和server都是預設對方支援長連結的, 如果client使用http1.1協議,但又不希望使用長連結,則需要在header中指明connection的值為close;如果server方也不想支援長連結,則在response中也需要明確說明connection的值為close.

    不論request還是response的header中包含了值為close的connection,都表明當前正在使用的tcp連結在請求處理完畢後會被斷掉。以後client再進行新的請求時就必須建立新的tcp連結了。 HTTP Connection的 close設定允許客戶端或伺服器中任何一方關閉底層的連線雙方都會要求在處理請求後關閉它們的TCP連線。

2.如何在程式中設定:

    可以在過濾器中加入:response.setHeader("connection", "close");

與之相關:解決伺服器產生大量close_wait問題

要解決這個問題的可以修改系統的引數(/etc/sysctl.conf檔案),系統預設超時時間的是7200秒,也就是2小時。

預設如下:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds

意思是如果某個TCP連線在idle 2個小時後,核心才發起probe.如果probe 9次(每次75秒)不成功,核心才徹底放棄,認為該連線已失效

修改後

sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2

經過這個修改後,伺服器會在短時間裡回收沒有關閉的tcp連線。