netty运行一段时间报错:java.io.IOException: 打开的文件过多

news2024/9/24 9:22:04

报错详细内容如下:

java.io.IOException: 打开的文件过多
	at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:421)
	at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:249)
	at io.netty.util.internal.SocketUtils$5.run(SocketUtils.java:119)
	at io.netty.util.internal.SocketUtils$5.run(SocketUtils.java:116)
	at java.security.AccessController.doPrivileged(Native Method)
	at io.netty.util.internal.SocketUtils.accept(SocketUtils.java:116)
	at io.netty.channel.socket.nio.NioServerSocketChannel.doReadMessages(NioServerSocketChannel.java:147)
	at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

问题背景

使用netty做了一个TCP/IP的通讯服务,我们作为TCP的服务端接收客户端发送的请求,项目部署在Linux环境下运行。但是运行一段时间,服务就崩了,报错内容如上:java.io.IOException: 打开的文件过多 或 java.io.IOException: Too many open files。反正意思一样,都是当前服务文件句柄数超出上限,内存达到上限,服务承受不住了。这个时候把netty服务重启一下就又恢复了…循环往复,苦不堪言

一般出现这类问题,都是在网上一通搜索,基本的方案不外乎以下几种:

🚀方案一,升级netty的版本
结果:没用

版本升级之后,运行一段时间又成这样了,肯定不是版本的问题了

🚀方案二,初始化NioEventLoopGroup的时候,传参限制1个

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

结果:没用

网上有些人真的是误人子弟,你抄我、我抄你的,本来实例化的也是1个对象,这样改有什么意义呢?

🚀方案三,修改/etc/security/limits.conf中的数量限制,默认是1024,改为65536

* soft nofile 65536
* hard nofile 65536

结果:短时间有用,运行几天之后又报这个错了

典型的治标不治本。这种情况针对的是并发很高,TCP客户端超过1024了,但是我们总共就100多个客户端,怎么会超出呢。改了这个只把句柄数量上限提高了,根本上还是没有解决问题,过几天还是要崩的!

 
💔行了,网上的解决方案都没用,只能靠自己分析报错原因了。客户端总共就100多个,怎么过几天就超过65536了呢?肯定是单个客户端建立了多次连接,但是服务端的连接没有及时关闭所致。正常客户端会主动断开连接并重新建立连接,而这个项目的客户端可能就没有做断开操作,而是不断向服务端建立新的连接,所以我们要在服务端做好处理了。

通过三条命令,更加佐证了我的想法:

lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

查询服务倒序连接数,可以看到linux下所以服务进程号对应的连接数量,从高到低排序


netstat -lnaop|grep 5655|wc -l

查询某进程号连接数,此时我的netty服务对应的进程号是5655,间隔时间多查几次,发现连接数量在不断递增,早就超过了预留客户端的数量


netstat -ntu | grep 10072

查询某端口客户端连接的情况,此时我netty服务开放的TCP端口是10072,列表查到占用资源的客户端列表,发现大量重复的客户端IP地址


👍 重点来了,解决根本问题

最终解决方案:netty初始化的时候,设置连接超时时间 pipeline.addLast(new ReadTimeoutHandler(timeoutSeconds))

/**
 * 设置初始化器,主要是给pipeLine添加Handler
 */
public class MyServerInitializer  extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        
        //设置2min的超时时间,如果某个通道2min内未发送信号,则抛出异常删除当前通道
        pipeline.addLast(new ReadTimeoutHandler(120));
        
        pipeline.addLast("encoder",new StringEncoder(CharsetUtil.UTF_8));
        pipeline.addLast("decoder",new StringDecoder(CharsetUtil.UTF_8));
        pipeline.addLast(new MyServerHandler());
    }

}

        我这边设置的是2分钟,具体按照项目的实际需求设置,因为我这边的客户端是每1分钟发送一次报文的,我就暂时设置为2分钟了。超过2分钟没发数据,服务端就认为这个连接超时了,超时就会在执行到exceptionCaught方法中并且断开当前连接。我们的MyServerHandler类继承了ChannelInboundHandlerAdapter类或SimpleChannelInboundHandler类,自然而然就重写了exceptionCaught这个方法。而netty框架中某通道发生异常的时候,会在执行到exceptionCaught方法中。
 
        这样我们就完美解决了这个问题,间隔时间多跑几次【netstat -lnaop|grep 5655|wc -l】命令,会发现连接数稳定在100多个了!
 
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/930839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APP Binder客户端调用全流程分析

现在要搞明白JAVA层app调用跨进程的Service接口时&#xff0c;它的binder是怎样从Java->jni-->native--->binder驱动的这条链路&#xff1a;就是上图中的左半部分从上至下的流程。所以切入点在于&#xff0c;如app调用另一个进程的Service接口的getString&#xff08;…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

安全学习DAY19_小程序信息打点

信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构 文章目录 信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构本节知识&思维导图本节使用到的链接&工具 小程序获取-各大平台&关键字搜索小程序-模版测试上线&源码…

如何开启esxi主机的ssh远程连接

环境&#xff1a;esxi主机&#xff0c;说明&#xff1a;esxi主机默认ssh是不开启的&#xff0c;需要人工手动启动&#xff0c;也可以设置同esxi主机一起开机启动。 1、找到esxi主机&#xff0c;点击“配置”那里&#xff0c;再点击右边的属性&#xff0c;如图所示&#xff1a; …

java属性映射使用MapStruct的坑

目录 1.实体类和映射类只加注解Data 2.将Data换成getter和setter后build 3.那么此时我把getter和setter换成lombok的getter和setter 1.实体类和映射类只加注解Data 映射关系类 这个时候运行 提示源参数中不存在 注意这个文件夹 2.将Data换成getter和setter后build package c…

Python如何进行基本的数学运算

Python进行基本的数学运算 Python是一门功能强大且易于学习的编程语言&#xff0c;它不仅可以用于开发应用程序&#xff0c;还可以用于执行各种数学运算。让我们一起来看看如何在Python中进行基本的数学运算。 加法、减法、乘法和除法 Python支持常见的加法、减法、乘法和除…

[论文分享]Pedestrian attribute recognition based on attribute correlation

Pedestrian attribute recognition based on attribute correlation 行人属性识别广泛应用于行人跟踪和行人重识别。 两项最基本的挑战&#xff1a; 多标签性质数据样本的差异性特征&#xff0c;例如类别不平衡和部分遮挡。 不同方法的示意图&#xff1a; 此项工作中&#…

Linux操作系统--常用指令(用户管理操作类)

用户的管理需要使用超级管理员(root)来进行操作 (1).useradd添加新用户 功能:给当前的操作系统添加新的用户 语法: useradd 用户名 (2).passwd设置用户新密码 功能:给当前的用户设置密码 语法: passwd用户名 (3).i

核辐射对生物的影响

目录 1.什么是核辐射 2.核辐射的危害 3.核辐射对环境造成的影响 4.核辐射的影响会持续多长时间 1.什么是核辐射 核辐射是指自然界或人工产生的高能粒子或电磁波的放射性能量。当原子核不稳定时&#xff0c;会发生放射性衰变&#xff0c;释放出核辐射。 核辐射主要分为三种类…

市场的新宠:4G智能手表

现在人们提到智能手表&#xff0c;健康监测、运动记录、接打电话等定是他不可或缺的功能&#xff0c;而其中通讯功能在绝大数多的智能手表上都是通过蓝牙实现的&#xff0c;需要让手表通过蓝牙连接到手机端来进行。在没有手机的情况下&#xff0c;配置再高的蓝牙智能手表也是“…

深入浅出AXI协议(2)——通道及信号

一、前言 在之前的文章中&#xff0c;我们主要介绍了什么是AXI协议&#xff0c;AXI协议的特点与优点&#xff0c;然后对于AXI协议非常重要的五通道结构进行了介绍&#xff0c;了解了5个通道各自的作用。本文我们继续AXI协议的学习&#xff0c;我们将讨论5个通道的具体内容和相对…

判断网站是否开启CDN加速

方法一&#xff1a; 我们可以在CMD中ping一下想要测试的网站。比如baidu.com。 我们看到转向的还是baidu.com 接着用命令nslookup尝试下反向解析&#xff1a; 这种情况下一般是没有做CDN加速。 假设我们ping www.csdn.com: 我们看到它跳转到xxxx.com去了&#xff0c;这说明c…

Spring AOP 的实现及原理

目录 什么是 Spring AOP &#xff1f;AOP 是啥 ?Spring AOP 可以干啥 &#xff1f; AOP 的组成Spring AOP 的实现Spring AOP 的实现原理 什么是 Spring AOP &#xff1f; AOP 是啥 ? 我们知道 OOP 是面向对象编程, 那 AOP 又是啥呢 ? AOP&#xff08;Aspect Oriented Prog…

fastadmin后台表格新增tab选项卡不生效问题

官方一张图解析表格列表功能文档&#xff1a;(一张图解析FastAdmin中的表格列表的功能 - FastAdmin问答社区) 会遇到后期手动添加tab栏的情况 首先&#xff0c;需要在控制器对应的index.html页面中需要增加你想要筛选的字段 <div class"panel-heading">{:bui…

基于神经网络的3D地质模型

地球科学家需要对地质环境进行最佳估计才能进行模拟或评估。 除了地质背景之外&#xff0c;建立地质模型还需要一整套数学方法&#xff0c;如贝叶斯网络、协同克里金法、支持向量机、神经网络、随机模型&#xff0c;以在钻井日志或地球物理信息确实稀缺或不确定时定义哪些可能是…

leetcode 583. 两个字符串的删除操作

2023.8.26 本题看似很绕&#xff0c;其实就是 最长公共子序列 的变式。 求出最长公共子序列之后&#xff0c;再用两单词的总长度减去他们的最长公共子序列即可。 代码如下&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vec…

Java——单例设计模式

什么是设计模式&#xff1f; 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱、“套路”。 经典的设计模式共有23种。…

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVD分解重构算法&#xff0c;MATLAB程序&#xff0c;奇异值分解 (Singular Value Decompo…

响应式web-PC端web与移动端web(H5)兼容适配 选型方案

背景 项目需要&#xff0c;公司已经有一套PC端web&#xff0c;需要做一套手机端浏览器可用的&#xff0c;但是又想兼容pc端&#xff0c;适配的web项目。 以下是查阅到响应布局现成的开源模版。根据自己技术栈&#xff0c;vue2,js来搜索相关的开源项目。 RuoYi 使用若依快速…