性能测试中的SocketException异常与解决方案

一、 java.net.BindException:Address already in use:JVM_Bind

该异常发生在服务器端进行 new ServerSocket(port)(port 是一个 0-65536 的整型值)操作时。异常的原因是因为与 Tcp port 一样的端口已经被占用与监听。此时用 netstat –an 或者 lsof -i:port 命令,可以看到一个 Listeding 状态的端口。出现这种情况的原因可能有下面几种

1、Tcp port 范围太小

可以把 tcp 的 port 范围改成 65535

net.ipv4.ip_local_port_range= 0 65535

2 、大量的 tcp 连接堆积在 timewait 状态,导致新的连接没有端口可用

可以开启端口复用net.ipv4.tcp_tw_reuse = 1

或调整 timewait 阈值net.ipv4.tcp_max_tw_buckets

二、java.net.SocketException: Connection refused: connect

异常原因是ip地址的机器找不到,或者是该ip存在但找不到指定的端口

1、检查客户端的 ip 和 port 是否写错了

2、从客户端 ping 服务器看是否能 ping 通

3、看服务器端的监听程序是否启动

三、java.net.SocketException: Socket is closed

该异常在客户端和服务器均可能发生。原因是己方主动关闭了连接后(调用了 Socket 的 close 方法)又试图对网络连接进行读写操作

四、java.net.SocketException Connection reset 与

Connect reset by peer:Socket write error

一端退出,但退出时并未调用 close 方法,另一端如果继续从连接中读数据则抛出异常 Connection reset

一端 Socket 被关闭(主动关闭或因为异常退出而引起关闭),另一端仍发送数据,发送的第一个数据包引发异常 Connect reset by peer

关闭的原因大概有如下几种

1、请求服务器数据的时候,服务器突然挂了

2、请求服务器数据的时候,强行手动停止连接

3、处理的报文过大,超出了接收缓冲区的尺寸,导致数据包丢失

4、处理时间过长,触发 tomcat 超时直接结束进程

5、tcp 重试次数过多,直接触发 socket 连接中断

解决的思路:一是增加接收缓冲区的空间,二是增加 tomcat 和 tcp的超时时间

tcp_wmem【接收缓冲区】

tcp_rmem【发送缓冲区】

tcp_mem【tcp 内存】

net.ipv4.tcp_fin_timeout【fin 超时时间】

你可能感兴趣的:(性能测试中的SocketException异常与解决方案)