天天看点

java error: Too Many files

参考文章:

https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/

考虑一个实际问题,某服务器程序报Too many files opened错误。

这个问题的出现原因是system对程序打开files数量的限制问题。 

用 ulimit -a 可以查看. ulimit 指令,对资源限制和系统性能优化提供了一条便捷的途径。从用户的 shell 启动脚本,应用程序启动脚本,以及直接在控制台,都可以通过该指令限制系统资源的使用,包括所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存,等等方面。本文中的示例非常直观的说明了 ulimit 的使用及其产生的效果,显而易见,ulimit 对我们在 Linux 平台的应用和开发工作是非常实用的。

[root@5 ~]# ulimit -a 
core file size          (blocks, -c) 0 
data seg size           (kbytes, -d) unlimited 
scheduling priority             (-e) 0 
file size               (blocks, -f) unlimited 
pending signals                 (-i) 4096 
max locked memory       (kbytes, -l) 32 
max memory size         (kbytes, -m) unlimited 
open files                      (-n) 1024 
pipe size            (512 bytes, -p) 8 
POSIX message queues     (bytes, -q) 819200 
real-time priority              (-r) 0 
stack size              (kbytes, -s) 10240 
cpu time               (seconds, -t) unlimited 
max user processes              (-u) 4096 
virtual memory          (kbytes, -v) unlimited 
file locks                      (-x) unlimited       

可以看出,对open files的限制数是1024,我们可以通过修改这个值来增加可以打开的文件数。 

******************************************************************

临时修改:

将其改为2048,用 ulimit -n 2048.  在这种做法中,ulimit 限制的是当前 shell 进程以及其派生的子进程。举例来说,如果用户同时运行了两个 shell 终端进程,只在其中一个环境中执行了 ulimit – s 100,则该 shell 进程里创建文件的大小收到相应的限制,而同时另一个 shell 终端包括其上运行的子程序都不会受其影响:

当你把open files的值增大到一定程度,你的Too many open files就不会再出现了。

******************************************************************

若要 长久 改变这两个参数值,就要修改/ect/security/limits.conf,文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:

<domain> <type> <item> <value>

domain 表示用户或者组的名字,还可以使用 * 作为通配符。Type 可以有两个值,soft 和 hard。Item 则表示需要限定的资源,可以有很多候选值,如 stack,cpu,nofile 等等,分别表示最大的堆栈大小,占用的 cpu 时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制

在文件中加上两行: 

* - nofile 102400 

* - nproc 102400

******************************************************************