java.io.IOException: Too many open files

java.io.IOException: Too many open files

前言:

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

一、问题排查

1,查看所有进程信息

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

2,下面用 lsof 命令使用讲解,排查的逻辑

lsof: list open files 【列出来打开的命令】

c 复制代码
-- 计算<进程>打开的文件数
lsof -p <进程号> | wc -l

进程 82253 打开的文件数是 2289

系统默认是 1024

命令如下

c 复制代码
-- 查看系统默认进程打开的文件个数
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) 循环,也管自己没有考虑到,索引进行打开的文件数始终在增加】

定时器:

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

消费者:

c 复制代码
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...

相关推荐
Flynn Liang7 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
SomeOtherTime7 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔7 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆8 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
SimonKing8 小时前
Workbuddy太占C盘空间了,写个迁移工具迁走10G的数据
java·后端·程序员
Hvitur9 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck9 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J9 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪9 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂9 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法