java.io.IOException: Error writing to server
问题描述:
客户端在发送POST请求时,报出如下堆栈异常java.io.IOException: Error writing to server:
原因分析:
从堆栈字面意思来看,是输出流写到服务端时发生了异常。到底是服务端还是客户端的问题呢?于是我在测试环境用并发和大报文模拟复现了这个问题,模拟结果如图:
在复现问题之前我猜测是由于请求方出口带宽不足,导致网络拥挤造成的报错,请看下图网络资源监控:
从测试结果来看,当请求方无线网的出口带宽被占满时,网络出现拥堵,有些请求会在等待发送,但是有些请求就会报错:Error writing to server;测试过程中还报了另外一个错误:Connection reset by peer: socket write error(这个错具体是不是由于请求方出口带宽占满导致的还不清楚,暂未深入研究)。
当然,测试时也观察了服务端带宽的占用情况,只是当时没有截图,各位有兴趣的可以自行测试,最好使用公网的接口,因为局域网的带宽比较大,不好复现这种问题,或者使用弱网工具Network-Emulator-Toolkit(博主没用过)来辅助测试。
解决方案:
1.有条件则增加请求方出口带宽;
2.无条件则降低并发以及不要使用大报文;
3.最好服务方入口带宽也相应增加。
总结:
从这次事件来看,想要排查出jdk底层的报错很难,尤其是网络层面或者硬件层面,毕竟我这种码农只会写点hello world。。。