壓測netty框架,返回少量java.net.ConnectException:Connection timed out,優化程式碼
xx專案需要做效能測試,開發端主要是netty框架,500併發TPS能達到7000+,但是返回少量
Connection timed out,原因有可能是程式碼有問題,也有可能僅是客戶端主動關閉了連線,導致服務端的寫失敗,linux伺服器本身無法處理如此大量請求,監控到客戶端並未有大量CLOSE_WAIT狀態,不過大量timewait狀態,伺服器端linxu核心已做各項引數優化。
優化:一是限流,二是讓服務端在寫資料之前判斷一下channel是否已關閉。採用方法一,壓力端指令碼採用限流,處理正常(若壓測指令碼做分流限制,不符合生產大批量併發場景)。故採用方法二,讓服務端在寫資料之前判斷一下channel是否已關閉,本次優化方案主要採用優化程式碼:
1. if (!channel.isConnected()) {
2. if (logger.isWarnEnabled()) {
3. logger.warn("Failed to write any response because the channel is not connected any more. Maybe the client has closed the connection? ");
4. }
5. return;
6. }
優化程式碼後重新執行500併發壓測,持續壓測20分鐘以上,少量 Connection timed out解決。