1. 程式人生 > 其它 >jmeter併發上傳檔案,伺服器返回Connection reset by peer異常

jmeter併發上傳檔案,伺服器返回Connection reset by peer異常

問題描述

群裡小夥伴在做併發上傳檔案的時候,大約到30併發量左右,響應時間就變得特別長。從服務端的tomcat可以看到大量的錯誤日誌。報錯如下

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356)
at org.apache.catalina.connector.OutputBuffer.appendByteArray(OutputBuffer.java:785)
at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:714)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)
at org.springframework.security.web.util.OnCommittedResponseWrapper

問題分析

Connection reset by peer的意思是在做資料讀取的時候,另一端的socket突然強行中斷了,才返回這個錯誤
中斷的原因大概有幾種
1.請求伺服器資料的時候,伺服器突然掛了
2.請求伺服器資料的時候,強行手動停止連線
3.處理的報文過大,超出了接收緩衝區的尺寸,導致資料包丟失
4.處理時間過長,觸發tomcat超時直接結束程序
5.tcp重試次數過多,直接觸發socket連線中斷

再結合下面這段錯誤日誌,基本能鎖定問題
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:321)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:284)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118)
at org.springframework.security.web.util.OnCommittedResponseWrapper

pipe是管道,也就是資料流,或者從檔案或socket套接字讀取的資料。 當socket的另一端突然關閉,會導致資料突然中斷,即是broken
這一段錯誤很明顯能看出,socket一端在讀取遠端的響應資料時,被強行中斷了。
解決問題的思路有兩塊。一是增加接收緩衝區的空間,二是增加tomcat和tcp的超時時間
tcp_wmem【接收緩衝區】
tcp_rmem【傳送緩衝區】
tcp_mem【tcp記憶體】
net.ipv4.tcp_fin_timeout【fin超時時間】

結果

優化之後,問題得到解決