Ubuntu中的“too many open files”打开文件数量过多的错误?

Ubuntu等linux发行版本中,该如何解决“too many open files”这类错误呢?应该是打开文件数量过多,超出操作系统的文件打开数量限制了?

喜欢这个问题 | 分享 | 新建回答

回答

冯纪忠雄

Sep 11, 2019
0 赞

确实如此,“too many open files”错误就是因为打开文件数量过多,超出了操作系统的限制,从而出现的错误;解决这种问题,两种思路:一、是对自己的程序进行修改,尽量不要打开这么多文件;二、是提高操作系统对于同时打开文件数量的上限。

我曾经写过关于Mac OS操作系统的出现“too many open files”打开文件数量过多的解决方式;而关于Linux中如何解决“too many open files”打开文件数量过多的解决方案,则在本文进行详细介绍,接下来以Ubuntu这类Linux发型版本为例。

“ulimit -a”命令来查看打开文件的上限:

在Ubuntu中使用“ulimit -a”命令可以查看当前操作系统的相关上限,如下所示,“open files (-n) 1024”这行输出就代表着当前打开文件数量的上限是1024;这个数字挺小的,所以就经常会出现这类“too many open files”的错误。

$ 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) 257199
max locked memory       (kbytes, -l) 16384
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) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 257199
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

“ulimit -n 数字”命令来设置打开文件的上限:

在Ubuntu中使用“ulimit -n 数字”命令,即可将操作系统打开文件数量的上限设置成新的数字;比如要想将上限设置成2048,那就在终端输入命令“ulimit -n 2048”即可:

$ ulimit -n 2048

具体可设置的上限,我的经验是普通用户是2048,root用户可以达到65535;不过这也未必,视具体的操作系统版本而定,会有差异的。


不过上述的这些设置方式,都是临时操作;所谓的临时:还不是指主机从开机到关机期间的临时,而是指登录用户的登录所建立的生命周期,简而言之,使用某个账户登入后,若彻底离开,再次登录时,上述的修改也会被还原的;比如“sudo -s”或“screen”所建立的临时登录,在每次登入的生命周期里,上述的修改才会生效。



若想全局、永久地修改打开文件的数量上限,对“/etc/security/limits.conf”文件进行修改即可。

因为是修改etc文件夹下的,所以要用管理员权限;如下所示,使用“sudo vim /etc/security/limits.conf”命令,对该文件进行修改,在文件末尾添加下述的两行代码即可,意思是将打开文件数量的软资源限制和硬资源限制都设置成指定数字,而“*”符号则代表适用于操作系统的所有用户:

$ sudo vim /etc/security/limits.conf

在终端输入上述命令,即使用vim来编辑/etc/security/limits.conf
在文件末尾添加如下的两行即可,保存后重启或注销操作系统,即可生效

root soft nofile 65535
root hard nofile 65535



题外话:用什么命令来查看目前操作系统打开了多少文件?又用什么命令能查看某进行打开了多少文件?

使用“lsof | wc -l”命令即可查看当前操作系统打开了多少文件:

$ lsof | wc -l
12312

使用“lsof -p <pid> | wc -l”即可查看某进程当前打开了多少文件,将<pid>换成指定进程的数字id即可,比如查看17419进程,那就如下所示:

$ lsof -p 17419 | wc -l
678

但是,虽说上述命令是这么一回事,但是你目前都出现了“too many open files”就说明你当前肯定并行了很多进程,也打开了太多文件;因此,很有可能在使用上述命令查看时,会等待很久很久;没办法,谁叫目前是在超出操作系统上限进行活动呢?不过对于编程者而言,这个错误还是蛮正常的。