Tomcat各种网络异常场景解决方案及优化(上)

简介: Java Socket网络编程常见的异常有哪些,然后通过一个实验来重现其中的Connection reset异常,并且通过配置Tomcat的参数来解决这个问题。

Java Socket网络编程常见的异常有哪些,然后通过一个实验来重现其中的Connection reset异常,并且通过配置Tomcat的参数来解决这个问题。

异常场景

java.net.SocketTimeoutException

超时异常,超时分为

  • 连接超时
    在调用Socket.connect方法的时候超时,大多因为网络不稳定
  • 读取超时
    调用Socket.read方法时超时。不一定是因为网络延迟,很可能下游服务的响应时间过长

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

端口被占用。

当服务器端调用

  • new ServerSocket(port)
  • 或Socket.bind函数

若端口已被占用,就会抛该异常。

可以用

netstat –an

image.png

查看端口被谁占用了,换个空闲端口即可。

java.net.ConnectException: Connection refused: connect

连接被拒绝。

当客户端调用


  • new Socket(ip, port)
  • 或Socket.connect函数


原因是:


  • 未找到指定IP的机器
  • 机器存在,但该机器上没有开启指定监听端口


解决方案

从客户端机器ping一下服务端IP:

  • ping不通,看看IP是不是写错了?
  • ping通,需要确认服务端的服务是不是挂了?

java.net.SocketException: Socket is closed

连接已关闭。

通信的一方主动关闭了Socket连接(调用了Socket的close方法),接着又对Socket连接进行了读写操作,这时os会报“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”后,如果再继续写数据则会抛出Broken pipe异常,解决方法同上。

java.net.SocketException: Too many open files

进程打开文件句柄数超过限制。

触发场景

当并发用户数比较大时。

因为每创建一个Socket连接就需一个文件句柄,而且服务端程序在处理请求时可能也需要打开一些文件。

可通过

lsof -p pid

查看进程打开了哪些文件,是否有资源泄露,即进程打开的这些文件本应该被关闭,但由于程序的Bug而没有被关闭。

若无资源泄露,可通过设置增加最大文件句柄数:通过

ulimit -a

查看系统目前资源限制,通过

ulimit -n 10240

修改最大文件数。

Tomcat网络参数

  • maxConnections
  • acceptCount

TCP连接的建立过程

客户端向服务端发送SYN包,服务端回复SYN+ACK,同时将这个处于SYN_RECV状态的连接保存到半连接队列。


客户端返回ACK包完成三次握手,服务端将ESTABLISHED状态的连接移入accept队列,等待应用程序(Tomcat)调用accept方法将连接取走。

这里涉及两个队列:


  • 半连接队列:保存SYN_RECV状态的连接

队列长度由net.ipv4.tcp_max_syn_backlog设置

  • accept队列:保存ESTABLISHED状态的连接

队列长度为min(net.core.somaxconn,backlog)。其中backlog是我们创建ServerSocket时指定的参数,最终会传递给listen方法:

int listen(int sockfd, int backlog);

若设置的backlog大于net.core.somaxconn,accept队列的长度将被设置为net.core.somaxconn,而这个backlog参数就是Tomcat中的acceptCount参数,默认值100,但请注意net.core.somaxconn默认值128。


在高并发情况下当Tomcat来不及处理新连接时,这些连接都被堆积在accept队列,而acceptCount参数可以控制accept队列长度。超过该长度,内核会向客户端发送RST,这样客户端会触发“Connection reset”异常。


Tomcat#maxConnections 指Tomcat在任意时刻接收和处理的最大连接数。

当Tomcat接收的连接数达到maxConnections时,Acceptor线程不会再从accept队列取走连接,这时accept队列中的连接会越积越多。


maxConnections的默认值与连接器类型有关:

  • NIO的默认值是10000
  • APR默认是8192

所以Tomcat

最大并发连接数 = maxConnections + acceptCount

若acceptCount


  • 设置过大
    请求等待时间会比较长
  • 设置过小
    高并发情况下,客户端会立即触发Connection reset异常

TIME_WAIT

通过netstat命令发现有大量的TCP连接处在TIME_WAIT状态,请问这是为什么?它可能会带来什么样的问题呢?


增大accept队列长度会使得Tomcat并发短连接数暴增,势必导致服务器处理完请求后,需主动断开连的连接数增加;

TCP 连接处在 TIME_WAIT 状态,是TCP协议规定的,四次挥手时主动关闭方所处的一个状态。断开连接时四次挥手的最后一个阶段,客户端要等待2MSL,保证服务端收到客户端ack(如果服务端没有收到最后一次挥手ack会重试,这时客户端需重新发送ack),所以在这个时间段内不会释放端口,若并发量过大会导致大量time_wait;一旦达到上限将导致服务器拒绝服务。

Tomcat网络调优实战

复现流量高峰时accept队列堆积场景,即会导致客户端触发“Connection reset”异常,然后调参解决。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
227 0
|
1月前
|
机器学习/深度学习 并行计算 算法
粒子群算法优化RBF神经网络的MATLAB实现
粒子群算法优化RBF神经网络的MATLAB实现
291 123
|
23天前
|
机器学习/深度学习 数据可视化 网络架构
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
PINNs训练难因多目标优化易失衡。通过设计硬约束网络架构,将初始与边界条件内嵌于模型输出,可自动满足约束,仅需优化方程残差,简化训练过程,提升稳定性与精度,适用于气候、生物医学等高要求仿真场景。
129 4
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
|
22天前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
166 5
|
25天前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
1月前
|
机器学习/深度学习 并行计算 算法
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
|
17天前
|
缓存 人工智能 API
API接口调用中的网络异常及解决方案
淘宝API是淘宝开放平台提供的接口集合,支持商品、交易、用户、营销等数据交互。开发者需注册获取App Key,通过签名认证调用API,结合沙箱测试、OAuth授权与安全策略,实现订单管理、数据监控等应用,提升电商自动化与数据分析能力。
|
1月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
328 4
|
1月前
|
机器学习/深度学习 传感器 算法
【表面粗糙度】基于粒子群PSO算法优化-BP神经网络的表面粗糙度研究(Matlab代码实现)
【表面粗糙度】基于粒子群PSO算法优化-BP神经网络的表面粗糙度研究(Matlab代码实现)
171 7
|
2月前
|
人工智能 自动驾驶 物联网
AI 来当“交通警察”:如何优化 5G 网络资源分配?
AI 来当“交通警察”:如何优化 5G 网络资源分配?
108 9

热门文章

最新文章