运行在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下载
相关推荐
### Too many open files 问题详解与解决方案 在Linux系统中,“Too many open files”错误是一个常见的性能瓶颈,尤其是在运行大量并发服务或应用时。这个问题的根本在于操作系统对每个进程可打开的文件数量有限制...
### AIX关于Weblogic的报错“Too many open files”的处理 #### 背景与问题概述 在AIX环境中部署Weblogic时,可能会遇到一个常见的错误提示:“Too many open files”。这一错误提示通常出现在系统资源限制不当的...
MongoDB是一款流行且功能强大的NoSQL数据库,以其灵活性和高性能而受到广泛应用。然而,当MongoDB占用过多内存时,可能导致系统资源紧张,甚至频繁死机,严重影响服务的稳定性和性能。本文将深入探讨如何解决MongoDB...
在Linux或Unix系统中,错误代码24通常与"Too many open files"相关,意味着当前进程已经打开了太多的文件或连接,超过了系统允许的最大限制。 描述进一步确认了这个问题,即无法创建TCP/IP套接字,并提供了寻找解决...
`java.io.IOException: Too many open files`表明在创建大量分区时,系统无法分配更多的文件描述符,从而导致服务异常。 4. **验证和解决方法** - 通过`jps`命令获取Kafka进程的PID,然后使用`lsof -p <PID>`可以...
4. 打开太多的文件(Too many open files) 当前程序打开的文件数超过了操作系统允许打开的最多文件数。这种情况下,应用程序可能会尝试打开太多的文件,导致运行错误。 5. 文件访问拒绝(File access denied) ...
如果超过且非特权用户,返回`-ENFILE`错误,表示“Too many open files in system”。特权用户(拥有`CAP_SYS_ADMIN`能力)不受此限制。 3. **发起Connect** `connect()`系统调用负责实际的连接过程。它接收Socket...
当这些资源耗尽时,服务器将无法接受更多的TCP连接,可能出现"too many open files"或OOM(Out Of Memory)错误。 服务器通常固定在本地端口监听,等待来自不同客户端的IP和端口的连接请求,因此客户端的IP和端口...
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 ...
13. error 13: Too many open files - 打开文件太多 程序尝试打开的文件数量超过了系统允许的最大值。 14. error 14: Invalid file name - 无效的文件名 提供的文件路径或名称格式不正确。 15. error 15: File ...
`worker_rlimit_nofile`设定每个工作进程可打开的最大文件数,提高这个值可以避免“too many open files”的问题。 接下来是`events`模块,这是处理客户端连接的核心。`worker_connections`定义了一个工作进程可...
#### 23 ENFILE -- Too many open files in system 系统中的打开文件过多。这通常发生在系统级别的文件描述符耗尽时。 #### 24 EMFILE -- Too many open files 打开文件过多。这通常发生在进程级别的文件描述符耗尽...
OS error code 23: Too many open files in system** - **中文解释**:打开太多的文件系统 - **描述**:当系统级别的文件描述符已满时返回此错误。可以增加系统配置中的文件描述符限制。 **25. OS error code 24:...
系统默认值 1024,对于一般的应用来说已经足够使用,但是对于需要处理大量请求的应用,可能会出现“too many files open”的错误提示。 要知道当前进程打开了多少个文件句柄,可以使用以下命令: lsof -n | awk '{...
- **error13: Too many open files(打开文件太多)** - **释义**:同时打开了超出系统限制数量的文件。 - **解决方法**: - 关闭不再使用的文件。 - 调整系统配置以增加最大打开文件数限制。 - **error14: ...
24. **OS error code 23: Too many open files in system** - **操作系统错误代码23:打开太多的文件系统** - 当系统达到其最大允许打开文件数量时,会发生此错误。可以通过增加系统配置中的文件句柄数量来解决。 ...
- **Socket error #10024 - Too many open files**:打开了太多的文件。 - **Socket error #10035 - Resource temporarily unavailable**:资源暂时不可用。 - **Socket error #10036 - Operation now in progress**...
Too many open files (error13):** - **含义:** 同时打开的文件数量超过了系统限制。 - **解决方法:** 减少同时打开的文件数量,或增加系统允许的最大文件数限制。 **13. Invalid filename (error14):** - **...
#### error13: Too many open files(打开文件太多) 当程序同时打开的文件数量超过了系统限制时会出现此错误。可以适当关闭一些不再使用的文件,或者增加系统允许的最大文件打开数。 #### error14: Invalid ...
当达到“too many open files”错误时,意味着超过了系统允许的最大打开文件数。为了提高Linux服务器的TCP连接承载能力,我们需要进行以下优化: 1. **修改文件句柄限制**: 可以通过`ulimit -n`命令查看当前用户...