記錄一次大量CLOSE WAIT的情況

2022-08-13 04:36:18 字數 1287 閱讀 1138

近期的專案中,有乙個特殊的需求,對於每個客戶端程式有若干個機構,對於每個機構有不同的客戶端證書,程式間隔一段時間向服務端進行請求,根據請求的成功與否更新各機構的狀態(如正常,證書未配置,證書過期等)。

實際投入測試環境進行使用的時候,執行了一段時間之後,客戶端程式出現了大量的close_wait的情況,導致壓力測試無法正常進行。

對相關的**進行了檢查之後,發現了之前的做法是對於每乙個機構,維護乙個resttemplate物件,在其中進行讀取證書等操作。懷疑和大量的resttemplate有關這個問題,因為本地開發的時候基本只有幾個機構進行測試,所以未出現以上情況。根據close_wait出現在客戶端的情況進行分析,是服務端發起了關閉連線的請求,而客戶端進行了響應之後,接收了資料完成後並沒有進行關閉,導致出現了close_wait。

首先增加了連線池的引數 setvalidateafterinactivity(如下),發現不起作用。

然後在初始化httpclient時增加了引數 evictidleconnections ,發現生效。

通過分析原始碼發現,resttemplate在不做額外配置的情況下,會預設開啟keepalive,而服務端不進行額外配置的時候,不會返回額外的內容,此時客戶端進行了相關的判斷之後,如果響應頭沒有keep-alive會返回-1,即認為預設不釋放,後續服務端進行相應的連線的斷開時,客戶端認為可重用,就不進行清理,導致一致處於close_wait狀態,而由於使用了大量的resttemplate,導致大量的close_wait出現。

連線池的配置不起作用是因為底層呼叫的是連線池的release方法,而release方法內部會進行相應的判斷,如果發現是可重用的鏈結,就不會釋放。

closeablehttpclient的配置生效是因為底層是檢視是否過期,如果過期,則呼叫關閉方法。

記錄一次伺服器產生大量close wait的過程

參考文章 問題就產生了,測試人員在用內網網域名稱訪問頁面的時候,js使用了外網的網域名稱再穿透到了內網,最後造成服務無法確認的返回資料是否客戶端接收到了,一直處於等待狀態,造成了大量的close wait,處理方法 在linux中檢視socket狀態的命令 netstat nt awk end 然後...

記一次大數整除

除法其實也是減法 應該可以這樣說 那麼大數除法中,該如何判斷乙個大數能否被其它數整除呢?這裡說的數指自然數 比如 a 100000000000000000000000 就不能被 b 333 整除,但是計算機硬體不支援這次計算或者計算結果有誤 為了方便理解,這裡定義乙個函式 h a,b 如果h a,b...

記錄一次大規模linux系統root密碼撞庫的經歷

在某公司做了乙個專案,查詢公司幾十萬臺主機的root密碼是否是弱密碼。該過程涉及到任務下發,資料處理和上報等過程,這裡不介紹其他模組,只介紹收集部分。一 怎麼判斷linux主機密碼是否是弱密碼 首先linux下面的密碼儲存在passwd和shadow檔案中,其中passwd檔案儲存賬戶名,shado...