一:问题描述
异常中最关键的信息是“Toomany open flies”,这是一种常见的Linux系统错误,通常意味着文件描述符不足,它一般发生在创建线程、创建Socket、打开文件这些场景下。在Linux系统的默认设置下,这个文件描述符的个数不是很多。
二:问题描述
通过ulimit命令可以查看:
[root@nodel kafka 2.11 2.0.0]# ulimit -n
1024
[root@nodel kafka 2.11-2.0.0]# ulimit -Sn
1024
[root@nodel kafka 2.11-2.0.0]# ulimit -Hn
4096
ulimit 是在系统允许的情况下,提供对特定shell可利用的资源的控制。-H 和-S选项指定资源的硬限制和软限制。硬限制设定之后不能再添加,而软限制则可以增加到硬限制规定的值。如果-H和-S选项都没有指定,则软限制和硬限制同时设定。限制值可以是指定资源的数值或hard、soft,unlimited这些特殊值,其中hard代表当前硬限制,soft代表当前软件限制,unlimited代表不限制。如果不指定限制值,则打印指定资源的软限制值,除非指定了-H选项。硬限制可以在任何时候、任何进程中设置,但硬限制只能由超级用户设置。软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于硬限制的值。
三:问题解决
对于一个高并发、高性能的应用来说,1024或4096的文件描述符限制未免太少,可以适当调大这个参数。比如使用 “ulimit -n 65535” 命令将上限提高到65535,这样足以应对大多数的应用情况,再高也完全没有必要了。
四:额外补充
查看某个进程(pid)下占用多少文件符:
> ls /proc/{pid}/fd I wc -1
> 例如: ls /proc/16534/fd I wc -1