keepalive的來龍去脈

2021-08-25 17:49:51 字數 2182 閱讀 9026

今天有同事反應在效能測試環境cpu load

很高有500

多,我的分析過程是這樣的,先用visualvm

連上去觀察了下,發現請求都卡在channelsocket

的read

上面。

這一步是mod_jk

的**,並未真正進入應用**。所以懷疑是apache

和jboss

之間出現了為題,為了印證這個猜測,先對jboss

直接做壓力測試,果然應用正常,load

也在正常值。

於是就觀察了下httpd.conf

和mod_jk.conf.

發現兩個配置除了用的都是正常值並沒有其他特殊設定,在15

個併發的情況下,就算有效能問題也不應該是這樣的。

netstat –an

觀察網路連線,發現有很多的close_wait

狀態。根據tcp-ip

關閉連線的四次握手過程和狀態轉變,close_wait

應該是客戶端主動發起的,而服務端被動接受關閉,並且服務端還未向客戶端傳送fin

請求導致。又仔細看了下httpd.conf

中的keepalive

設定為off

。於是就明白是怎麼回事了。

直接抓包看圖:

keepalive

為on的時候:

keepalive

為off

的時候:

紅框框部分可以看到,首先客戶端(10.19.14.20

)向伺服器傳送fin

請求seq=484

伺服器響應ack=484+1

並且傳送fin

給客戶fin

請求seq=142

客戶端響應服務端請求ack=142+1

下面再看下具體的狀態轉換圖:

從這個圖中可以看到狀態變為close_wait

的一方為被動關閉方。再結合剛才的抓包圖分析,在httpd.conf

設定為keepalive

為off

的時候,客戶端會在請求結束之後主動發出close

呼叫,這個時候服務端變為close_wait

狀態,但是由於apache

程式的某些原因導致不能很好的在繁忙情況下處理完這些請求,導致load

公升高。

上面分析的都是針對http

協議的keepalive

設定,並且這個keepalive

是需要http

協議支援。

下面我們再來稍微看一下tcp

層的keepalive

引數。

其實tcp

協議本身就是面向連線的協議,之所以這樣設計是因為這個協議是提供乙個高可靠的服務,在連線的基礎上我們可以做很多的事情保證可靠性,例如流量的控制(滑動視窗),失敗重傳的機制等等。只要三次握手完成,那麼tcp

所謂的連線也就建立了。由於有這個三次握手的過程,所以很多壞人會利用這個過程瘋狂往伺服器傳送syn

包,導致伺服器響應不過來而掛掉。

那既然連線已經建立了,為什麼還有有keepalive

呢,因為連線是有個超時時間的,假如在規定時間內沒有資料交換的話,就會超時,所以需要定期傳送資料來保持連線,linux

作業系統的套介面選項就有個so_keepalive

可以設定心跳的傳送時間(預設2

小時),可惜這個引數是針對全域性的,你設定了,其他人在這台機器的應用心跳資料傳送間隔時間都會改變,所以最好自己寫程式來實現心跳。

由此可見,http

協議的keepalive

引數只不過是為了保持連線的乙個實現方式而已,他是在http

的頭上面定義連線是否需要保持(on/off)

,和保持的時間(timeout).

最後再說一下長連線的用處: 1)

可以省去頻繁建立連線的開銷 2)

某些場景省去客戶端對服務端的頻繁輪詢 3)

服務端和客戶端可以靈活的來回讀寫資料,所謂的推和拉都可以基於此實現。

比如所謂的comet

聽著很炫,也就是長連線上的一些需求實現。但是由於不是所有的瀏覽器程式都支援長連線,例如ie

就不支援流式的ajax

,只能通過例如flash socket

程式,或者iframe

等猥瑣的方式來實現。

以上是小弟因為keepalive

引起的亂彈,歡迎各位批評指正。謝謝。

補充2個文件:

訊息的來龍去脈

上面敘述的過程就是訊息觸發演算法的過程,又稱訊息驅動。這樣乙個過程對於想入門windows開發的人來說門檻太高,對於大型的windows程式來說開發與維護成本也不低。隨著微軟物件導向開發平台日趨成熟,微軟把訊息機制封裝成了更容易讓人理解的事件模型。事件模型隱藏了訊息機制的很多細節,讓程式的開發變得簡...

COOKIE的來龍去脈

上網瀏覽者在網際網路上留下的資料蹤跡稱為 cookies 小甜餅 很多人害怕cookies,認為cookies可以攜帶病毒,侵犯個人隱私。然而,當你了解了cookies為何物,它們是怎樣產生的之後,你就會明白cookies 的存在實際上方便了你的網上瀏覽,cookies 是 發給你的電腦的文字檔案,...

HKMG來龍去脈

1.為什麼要high k。隨著cmos電路線寬的不斷縮小,電晶體的乙個關鍵指標 柵氧厚度也要不斷縮小。以intel為例90nm時代實際應用的柵氧厚度最低達到了1.2nm,45nm時代更是需要低至1nm以下的柵氧厚度。不過柵氧厚度是不能無限縮小的,因為薄到2nm以下的sio2層不再是理想的絕緣體,會出...