今天有同事反應在效能測試環境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層不再是理想的絕緣體,會出...