最近在对文件上传接口性能测试时, 设置 150 线程数并发时, 总会出现以下错误: connection reset by peer: socket write error
在网上搜索了一下, 得到的原因有这些:
服务器的并发连接数超过了其承载量, 服务器会将其中一些连接 Down 掉;
客户关掉了浏览器, 而服务器还在给客户端发送数据;
浏览器端按了 Stop;
和开发一起讨论了半天, 谁都说不出个所以然来. 开发说后台 Tomcat 没报错, 不是代码的问题, 会不会是工具的问题, 于是乎找到网上一篇文章:
Jmeter 遇到线程链接被重置 (Connection reset by peer: socket write error) 的解决方法 https://www.cnblogs.com/performancetest/p/5535883.html
根据文章对 jmeter 进行了相应配置也没用.
后来还是一位开发大神找到了错误原因, 原来, 当 jmeter 报错时, 后台 Tomcat 没报错, 但是后台 Nginx 报错了!!! 由于服务器只开通了 80 端口, 开发人员使用 Nginx 将应用的端口进行了反向代理, 反向后的端口为 80, 从而使测试机可以访问应用.
测试是否确实是 Nginx 的问题: 将应用端口直接改为 80, 关闭 Nginx 后测试, 结果显示不再报错, 这证明这个错误确实是 Nginx 引起的. 测试后将端口改回来.
在 D:\nginx-1.15.0\logs\error.log 中报错信息如下:
malloc(31457280) failed (8:Not enough storage is available to process this command)
网上很多人说是 Nginx 内存不足了, 但是也没有人具体说怎么解决. 尝试修改了 Nginx 的一些配置也没有用(可能是没改到点子上).
后来将 Nginx 负载均衡改为 Apache 负载均衡, 发现错误更多性能更差了.
最后还是大神将 Nginx 32 位改为了 Nginx 64 位 (在官网没找到 64 位的, 还是在某个网站上下载的) 后, 发现性能大大提升.
测试发现, 并发 300 线程数时, jmeter 都没报错!!!
当然长时间并发时, 偶尔还是会有 connection reset by peer: socket write error 这个错误发生, 但是总的来说接口性能已经大大提升了.
虽然还是没有完全搞清楚这个错误的发生原因以及解决办法, 但总归是有点进步, 在此记录, 也给各位遇到此问题的朋友一点思路.
来源: http://www.bubuko.com/infodetail-2725862.html