`
langyu
  • 浏览: 888229 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

详解 Too many open files

    博客分类:
  • java
阅读更多

        运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景。

        程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来了。




        每个进程中都有一个file descriptor table管理当前进程所访问(open or create)的所有文件,文件描述符关联着open files table中文件的file entry。细节不表,对于open files table能容纳多少file entry。Linux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。这种限制有系统级和用户级之分。

       系统级:
                系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制
                1  cat /proc/sys/fs/file-max 
                2  sysctl -a 查看结果中fs.file-max这项的配置数量
                如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。
                配置完成后使用sysctl -p来通知系统启用这项配置


       用户级:
                Linux限制每个登录用户的可连接文件数。可通过  ulimit -n来查看当前有效设置。如果想修改这个值就使用 ulimit -n <setting number> 命令。

              对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。

       在出现Too many open files问题后,首先得找出主要原因。最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:
lsof -p $java_pid 每个文件描述符的具体属性
lsof -p $java_pid | wc -l  当前Java进程file descriptor table中FD的总量

        分析命令的结果,可判断问题是否由非正常释放资源所引起。




文件描述符资料 : 简介      PDF下载
  • 大小: 25.7 KB
2
1
分享到:
评论
6 楼 来迟了 2015-06-02  
cl1_1_1 写道
ulimit -n <setting number>
不知道为啥,还是会报错 java.net.SocketException: socket failed: EMFILE (Too many open files)

我也是不尽报Too many open files的异常,就连后面连接数据的代码也一起报错The Network Adapter could not establish the connection,在出现Too many open files的异常前数据库是可以连上的,之前的数据都进数据库了。。。。
5 楼 tuzi37 2014-05-18  
牛掰~~~~
4 楼 cl1_1_1 2013-08-09  
ulimit -n <setting number>
不知道为啥,还是会报错 java.net.SocketException: socket failed: EMFILE (Too many open files)
3 楼 MyDream83 2011-01-03  
2 楼 langyu 2010-12-31  
MyDream83 写道

但想到一个问题 log4j也是多线程写同一个日志文件,为什么会不报这个系统错误呢?
写日志的时候也没有做线程同步

只是我们在用的时候没有看到线程同步,但底层肯定是做了,不然一个线程的一行还没有写完,会被其它线程打断。我们只见过多线程写log时log行不固定,但没见过一行中出现不同线程操作结果的。

贴出apache-log4j-1.2.16中log同步的代码
public void callAppenders(LoggingEvent event) {
    int writes = 0;

    for(Category c = this; c != null; c=c.parent) {
      // Protected against simultaneous call to addAppender, removeAppender,...
      synchronized(c) {
	if(c.aai != null) {
	  writes += c.aai.appendLoopOnAppenders(event);
	}
	if(!c.additive) {
	  break;
	}
      }
    }

    if(writes == 0) {
      repository.emitNoAppenderWarning(this);
    }
  }
1 楼 MyDream83 2010-12-30  
研究的很透彻!
想请教个问题,  我写了个socket服务端,多线程的, 处理异常时会写nohup.out
一段时间后就too many open files, 后来想办法捕获了异常,
但想到一个问题 log4j也是多线程写同一个日志文件,为什么会不报这个系统错误呢?
写日志的时候也没有做线程同步

相关推荐

    Too many open files 问题的解决.txt

    ### Too many open files 问题详解与解决方案 在Linux系统中,“Too many open files”错误是一个常见的性能瓶颈,尤其是在运行大量并发服务或应用时。这个问题的根本在于操作系统对每个进程可打开的文件数量有限制...

    AIX关于Weblogic的报错_Too_many_open_files_的处理

    ### AIX关于Weblogic的报错“Too many open files”的处理 #### 背景与问题概述 在AIX环境中部署Weblogic时,可能会遇到一个常见的错误提示:“Too many open files”。这一错误提示通常出现在系统资源限制不当的...

    解决MongoDB占用内存过大频繁死机的方法详解

    MongoDB是一款流行且功能强大的NoSQL数据库,以其灵活性和高性能而受到广泛应用。然而,当MongoDB占用过多内存时,可能导致系统资源紧张,甚至频繁死机,严重影响服务的稳定性和性能。本文将深入探讨如何解决MongoDB...

    Can't create TCP/IP socket(24).原因及解决办法

    在Linux或Unix系统中,错误代码24通常与"Too many open files"相关,意味着当前进程已经打开了太多的文件或连接,超过了系统允许的最大限制。 描述进一步确认了这个问题,即无法创建TCP/IP套接字,并提供了寻找解决...

    26_如何选择合适的分区数 - 2(csdn)————程序.pdf

    `java.io.IOException: Too many open files`表明在创建大量分区时,系统无法分配更多的文件描述符,从而导致服务异常。 4. **验证和解决方法** - 通过`jps`命令获取Kafka进程的PID,然后使用`lsof -p &lt;PID&gt;`可以...

    Freepascal运行错误详解

    4. 打开太多的文件(Too many open files) 当前程序打开的文件数超过了操作系统允许打开的最多文件数。这种情况下,应用程序可能会尝试打开太多的文件,导致运行错误。 5. 文件访问拒绝(File access denied) ...

    从Linux源码看Socket(TCP)Client端的Connect的示例详解

    如果超过且非特权用户,返回`-ENFILE`错误,表示“Too many open files in system”。特权用户(拥有`CAP_SYS_ADMIN`能力)不受此限制。 3. **发起Connect** `connect()`系统调用负责实际的连接过程。它接收Socket...

    ppt的测试版本---无用 不要下载

    当这些资源耗尽时,服务器将无法接受更多的TCP连接,可能出现"too many open files"或OOM(Out Of Memory)错误。 服务器通常固定在本地端口监听,等待来自不同客户端的IP和端口的连接请求,因此客户端的IP和端口...

    linux命令返回值的含义解析

    23. OS error code 23: Too many open files in system - 系统打开的文件数量达到上限。 24. OS error code 24: Too many open files - 当前用户打开的文件数量达到上限。 25. OS error code 25: Inappropriate ...

    turbopascal编译错误和运行错误信息中英文对照表

    13. error 13: Too many open files - 打开文件太多 程序尝试打开的文件数量超过了系统允许的最大值。 14. error 14: Invalid file name - 无效的文件名 提供的文件路径或名称格式不正确。 15. error 15: File ...

    Nginx配置优化详解

    `worker_rlimit_nofile`设定每个工作进程可打开的最大文件数,提高这个值可以避免“too many open files”的问题。 接下来是`events`模块,这是处理客户端连接的核心。`worker_connections`定义了一个工作进程可...

    Linux系统调用出错errno描述一览

    #### 23 ENFILE -- Too many open files in system 系统中的打开文件过多。这通常发生在系统级别的文件描述符耗尽时。 #### 24 EMFILE -- Too many open files 打开文件过多。这通常发生在进程级别的文件描述符耗尽...

    Linux操作系统错误代码解释 (中英文对照).pdf

    OS error code 23: Too many open files in system** - **中文解释**:打开太多的文件系统 - **描述**:当系统级别的文件描述符已满时返回此错误。可以增加系统配置中的文件描述符限制。 **25. OS error code 24:...

    linux的最大进程句柄数设置

    系统默认值 1024,对于一般的应用来说已经足够使用,但是对于需要处理大量请求的应用,可能会出现“too many files open”的错误提示。 要知道当前进程打开了多少个文件句柄,可以使用以下命令: lsof -n | awk '{...

    C语言错误信息表

    - **error13: Too many open files(打开文件太多)** - **释义**:同时打开了超出系统限制数量的文件。 - **解决方法**: - 关闭不再使用的文件。 - 调整系统配置以增加最大打开文件数限制。 - **error14: ...

    Linux操作系统错误代码解释-(中英文对照)

    24. **OS error code 23: Too many open files in system** - **操作系统错误代码23:打开太多的文件系统** - 当系统达到其最大允许打开文件数量时,会发生此错误。可以通过增加系统配置中的文件句柄数量来解决。 ...

    socket错误代码对应表

    - **Socket error #10024 - Too many open files**:打开了太多的文件。 - **Socket error #10035 - Resource temporarily unavailable**:资源暂时不可用。 - **Socket error #10036 - Operation now in progress**...

    KEIL编译错误信息

    Too many open files (error13):** - **含义:** 同时打开的文件数量超过了系统限制。 - **解决方法:** 减少同时打开的文件数量,或增加系统允许的最大文件数限制。 **13. Invalid filename (error14):** - **...

    单片机程序错误代码及错误信息 错误释义

    #### error13: Too many open files(打开文件太多) 当程序同时打开的文件数量超过了系统限制时会出现此错误。可以适当关闭一些不再使用的文件,或者增加系统允许的最大文件打开数。 #### error14: Invalid ...

    你知道一台Linux服务器可以负载多少个连接吗

    当达到“too many open files”错误时,意味着超过了系统允许的最大打开文件数。为了提高Linux服务器的TCP连接承载能力,我们需要进行以下优化: 1. **修改文件句柄限制**: 可以通过`ulimit -n`命令查看当前用户...

Global site tag (gtag.js) - Google Analytics