`

(收藏)Java程序员也应该知道的too many open files的一些事

 
阅读更多
Java应用也有很大的概率会碰到too many open files这样的异常,此异常的主要原因是进程打开了太多的文件(可通过lsof | grep [pid] | wc -l来查看),linux对每个用户/进程都会有打开的文件数的限制。

当前进程打开的文件数的限制可通过cat /proc/[pid]/limits来查看,看到的内容类似如下:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 387075 387075 processes
Max open files 131072 131072 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 387075 387075 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
其中的max open files即为进程可打开的文件数,所有的io都会涉及到文件的打开等,例如建立连接等。

那么进程的这些limits又是怎么被赋值的,一种是在启动脚本里通过ulimit来主动赋值,例如ulimit -n 10000,表示把要启动的进程的max open files限制为10000,另一种是在代码中通过setlimit的方式来设置,在不做主动赋值的情况下,那么会继承父进程的limits,如没有父进程,则继承当前启动的用户的。

用户的limits可通过/etc/security/limits.conf来控制,也可通过放入/etc/security/limits.d/*.conf来控制,limits.conf内容怎么写这个在文件本身有很详细的解释,就不在这里多说了。

跟随机器启动的进程会继承init的limits信息,init的max open files在2.6.18/2.6.32里默认都是1024,这个是在代码里写S的固定值:
/*
* boot-time rlimit defaults for the init task:
*/
#define INIT_RLIMITS
{

[RLIMIT_NOFILE] = { INR_OPEN, INR_OPEN },
….
}
#define INR_OPEN 1024 /* Initial setting for nfile rlimits */

至于如何查到对应的Java代码中为什么打开了这么多的文件,主要可通过btrace监控文件API和socket open的相关API的调用,从而确定原因。

顺带说下,max processes是用于限制进程本身最多派生的子进程数以及线程数个数,对于java而言,主要就是限制线程数,可通过ulimit -u来做设置。
分享到:
评论

相关推荐

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法 JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES...同时,程序员和系统管理员也需要加强代码的质量和服务器的维护,以避免 Too many open files 错误的出现。

    一些优化Nginx服务器的技巧简介

    增加此值可以防止在高负载下出现too many open files的错误,但同样需要注意操作系统的限制。 ### 总结 在优化Nginx服务器的过程中,应根据实际应用场景和服务器硬件资源进行合理配置。上述配置中,HTTP模块和...

    free pascal 错误代码表

    4. **Too many open files**:系统限制了同时打开的文件数量,当超过这个限制时,会触发此错误。关闭不再使用的文件,或提高操作系统允许的最大文件数。 5. **File access denied**:这通常是因为尝试对只读文件...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    C语言报错整理大全[借鉴].pdf

    12. **打开文件太多(Too many open files)**:操作系统限制了同一时间可以打开的文件数量,如果超过这个限制,将无法再打开新的文件。 13. **无效的文件名(Invalid file name)**:文件名格式不正确,或者包含了...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    requests-0.13.7.tar.gz

    12. **错误处理**:Requests库提供了丰富的异常处理机制,如`requests.exceptions.RequestException`是所有异常的基类,其他如`ConnectionError`、`Timeout`、`TooManyRedirects`等。 13. **代理设置**:如果你需要...

    kell常见错误提示.

    error13: Too many open files (打开文件太多) **错误描述**:当程序尝试打开的文件数量超过了系统限制时会发生此错误。 **解决方法**: - 减少同时打开的文件数量。 - 确保文件在不再需要时被及时关闭。 #### ...

    requests-0.11.2.tar.gz

    9. **错误处理**:Requests库提供了丰富的异常处理机制,如`requests.exceptions.RequestException`是所有异常的基类,其他如`ConnectionError`、`Timeout`、`TooManyRedirects`等。 10. **证书验证**:可以设置...

    requests-2.12.1.tar.gz

    7. **错误处理**:requests库提供了异常处理机制,如`requests.exceptions.RequestException`是最基础的异常,其他如`ConnectionError`、`Timeout`、`TooManyRedirects`等都是其子类,可以在try-except语句中捕获并...

Global site tag (gtag.js) - Google Analytics