問題描述
群里小伙伴在做並發上傳文件的時候,大約到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超時時間】
結果
優化之后,問題得到解決