使用Jmeter进行压测是经常遇到java.net.SocketException: Connection reset这个错误,网上搜了好多方法也不管用机缘巧合下搜到一个方法,亲测可用先整理如下(仅适用于liunx环境)。
首先,我们要知道这个Connection reset是个什么东西。reset简称为RST复位,它发生在三次握手的最后一次握手(ACK)。
如下图:
服务器收到 ACK 后表示连接建立成功。此时内核会把连接从 SYN 半连接队列中移出,再移入 accept 队列,等待进程调用 accept 函数时把连接取出来。如果进程不能及时地调用 accept 函数,会造 accept 队列溢出 ,导致建立好的 TCP 连接被丢弃。此时我们可以选择向客户端 RST 复位报文 ,告诉客户端连接已经建立失败。
linux在/etc/sysctl.conf中可以设置是否发送RST复位报文
net.ipv4.tcp_abort_on_overflow=0
tcp_abort_on_overflow设置为0可以提高连接建立的成功率。当accept队列频繁溢出的时候,才可以设置为1