测试驿栈-由浅入深学性能 jmeter 并发上传文件,服务器返回 Connection reset by peer 异常
飞天小子的性能课堂
·
2021年09月10日
·
2552 次阅读
「原创声明:保留所有权利,禁止转载」
答疑微信号:uhz2008
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 超时时间】
结果
优化之后,问题得到解决
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。