常见异常
java.net.SocketTimeoutException
超时错误,分为连接超时和读取超时,连接超时往往是由于网络不稳定造成的,但是读取超时不一定是网络延迟造成的,很有可能是下游服务的响应时间过长。
java.net.BindException: Address already in use:JVM_Bind
端口占用 ,通过netstat -ntlp查看端口占用情况
java.net.ConnectException:Connection refused: connect
连接被拒绝,可能的问题是:网络不通(即ip地址是否写错,端口是否启用,服务是否正常)
java.net.SocketException: Socket is colsed
连接已关闭,问题是通信的一方主动关闭了socket连接,接着又对socket连接进行了读写操作,这时候会报连接已关闭的错误。
java.net.SocketException:Connection reset/Connect reset by peer: Socket write error
连接被重置,错误原因一般是:通信放将socket关闭(主动关闭或者异常导致),这时通信的另一方还在写数据,就会触发(connect reset by peer)此报错;如果对方还在尝试从TCP连接中读数据,则会抛出Connection reset 异常。解决办法:程序在退出钱要主动关闭所有网络连接;检测通信的另一方的关闭连接操作,当发现另一方关闭连接后自己也关闭连接。
java.net.SocketException: Broken pipe
通信管道损坏,一般是:通信的一方收到"Connect reset by peer:Socket write error"后,继续写数据则抛出此异常,解决办法同连接被重置的处理办法。
java.net.SocketException:Too many open files
打开文件句柄数超过限制。 可以通过lsof -p pid 查看进程打开了哪些文件,是否有打开后应该被关闭的文件因异常未关闭;若没有,则通过修改系统最大文件句柄数来增大,ulimit -a查看资源限制,ulimit -n **** 修改最大打开的文件数。
tomcat网络参数:maxConnections和acceptCount
TCP连接处于SYN_RECV状态的连接被保存到半连接队列,队列长度由:net.ipv4.tcp_max_syn_backlog设置
完成TCP连接处理ESTABLISHED状态的连接被保存到accept队列,Tomcat Acceptor线程调用accept方法将连接取走,队列长度为:min(net.core.somaxconn,backlog),即取内核net.core.somaxconn 和tomcat配置中的最小值,其中backlog是在tomcat中配置的acceptCount参数,默认是100,net.core.somaxconn默认是128。
maxConnections是指Tomcat在任意时刻接收和处理的最大连接数,超过此阈值以后,tomcat不再从accept队列中取走连接。默认值与连接器类型有关:NIO默认值10000,APR默认是8192
结论:tomcat的最大并发连接数等于maxConnections + acceptCount ,若acceptCount设置过大,请求等待时间会比较长,若acceptCount设置过小,高并发下,客户端将会很快触发Connection reset异常。
本文整理自:极客时间-李号双-《深入拆解Tomcat&&jetty》