当前位置: 首页 > article >正文

java.io.IOException: Too many open files

java.io.IOException: Too many open files

前言:
项目最近报 java.io.IOException: Too many open files 问题,大概意思是:意味着你的应用程序尝试打开的文件描述符数量超过了系统允许的最大数量,在linux中每个进程打开的文件描述是有一定限制的。导致项目运行不起来,找了好几天,记录一下。
在这里插入图片描述

一、问题排查

1,查看所有进程信息

-- 查看所有进程消息
jps -l
-- 找到java进程的PID
ps aux | grep 应用名称

2,下面用 lsof 命令使用讲解,排查的逻辑
lsof: list open files 【列出来打开的命令】

-- 计算<进程>打开的文件数
lsof -p <进程号> | wc -l

进程 82253 打开的文件数是 2289
系统默认是 1024
在这里插入图片描述
命令如下

-- 查看系统默认进程打开的文件个数
ulimit -n

在这里插入图片描述

二、 解决方案:

1,可以临时增加进行打开文件的个数
– 将进程打开个数临时修改为 65535
ulimit -n 65535

2,查看占用端口的文件是哪个
lsof -p xxxxx
最后发现有个关于 kafka打开的文件过多

3,将所有关于kafka关闭 进程维持在200左右问题解决

问题分析:

1,之前对接kafka 做消费者时候,是有个while(true) 循环,不断拉取数据
2,现在是有个定时器,每5分钟拉取一波数据代码如下,问题出现在 每5分钟拉取一波数据,但是consumer 始终没有关闭。要关闭consumer ,进程打开数据量是有限的。【之前对接kafka都是不断轮训拉取数据使用while(true) 循环,也管自己没有考虑到,索引进行打开的文件数始终在增加】
定时器:

    
    @Scheduled(cron = "0 0/5 * * * ?")
    public void physicalAlarmConsumerTask(){
        kafkaReportClient.physicalAlarmTopicConsumer();
    }

消费者:

public void physicalAlarmTopicConsumer(){
        Date currentDate = new Date();
       
        // 1.配置Kafka
        Properties properties = new Properties();
        properties.put("bootstrap.servers","xxx");
        properties.put("group.id","xxx");
        properties.put("enable.auto.commit","false");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
        consumer.subscribe(Collections.singleton("xxxaacctopic"));
        // 2.消费消息
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(5000));
        // 3.数据解析

        for (ConsumerRecord<String, String> record : records) {
            JSONObject jsonObject = JSON.parseObject(record.value());
            // TODO:业务逻辑
            ...	
        }
        // 4.提交offset
        consumer.commitAsync(new OffsetCommitCallback() {
            @Override
            public void onComplete(Map<TopicPartition, OffsetAndMetadata> offsets, Exception e) {
                if (e != null){
                    log.error("xxx  commit offset is error,offsets:{},e:{}", offsets, e);
                } else {
                    log.info("xxxx offset commit success");
                }
            }
        });
    
    }
小节

1,如果在有类似 Too many open files ,看下是哪个端口下的服务
2,lsof -P -i :xxx 【指定端口占用情况】
3,lsof -p xxx 【占用端口文件是哪个,具体分析】
4,lsof -p xxxx | wc -l
注:xxx为进程号。

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…


http://www.kler.cn/a/381068.html

相关文章:

  • webpack的常见配置
  • 【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
  • 【Android】Gradle 7.0+ 渠道打包配置
  • OpenStack API 来创建用户
  • conda迁移虚拟环境路径
  • git commit应遵循的提交规范
  • qt QPicture详解
  • Spring Boot助力信息学科平台系统构建
  • std::locale多语言切换
  • 在软件设计时,怎样寻找和确定对象,以及设计模式的作用
  • Java 8 中引入的 Comparator 工具方法
  • C++:unordered_set、unordered_map类
  • Spring Cloud数据库从MySQL切换到OceanBase
  • redis缓存雪崩、击穿、穿透
  • 江协科技STM32学习- P36 SPI通信外设
  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • Chrome 130 版本新特性 Chrome 130 版本发行说明
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(2)
  • ORA-00020和ORA-00603报错处理
  • Linux高阶——1103——Signal信号机制
  • 【Stable Diffusion】
  • 家具组装行业产品说明书的创新与优化
  • 鸿蒙笔记--tsets
  • 探索 Move 编程语言:智能合约开发的新纪元
  • CSRF初级靶场
  • 文件操作:使用ByteArrayInputStream