too many open files 是比较常见的报错,尤其使用TDengine 3.0 集群时,大概率会遇到。这个报错很简单,但要想顺利解决,却涉及到很多知识点。
知识点:fs.nr_open
单个进程能够打开的最大句柄数量,大部分同学看到too many open files 时想到的参数。这个参数时操作系统全局变量,天花板级的参数,决定了进程能够打开最大句柄数量。可动态修改,最大值:2147483584(x64环境)
sysctl -w fs.nr_open=2147483584
知识点:file-max & fs.file-nr
我们可用通过查询fs.file-nr
,来获得当前系统已打开的句柄数量和支持的最大数量。当我们修改fs.nr_open
时会发现 fs.file-nr
中的最大值并没有变化,因为最大值是有 fs.file-max
控制的。如果我们单独修改 fs.nr_open
并不能获得想要的效果。
对于fs.file-max
的最大值不同的操作系统限制也不同。
知识点:limits.conf
通过limits.conf 可设置用户初始化参数
root soft nproc 65536
root soft nofile 65536
root soft stack 65536
root hard nproc 65536
root hard nofile 65536
root hard stack 65536
注意:RHEL7/CentOS7 以后的系统limits.conf文件只影响通过pam登录的用户。
知识点:LimitNOFILE
以上提到了limits.conf 只影响用户,对于服务进程,需要通过配置启动文件中LimitNOFILE参数来限制。
如果LimitNOFILE没有配置或配置为infilty
,则默认取fs.nr_open
数值。
注意:systemd 234版本以下不支持infinity参数,而CentOS 7 的systemd 版本是219。
知识点:ulimit
用户的最大打开句柄数会在操作系统启动时通过limits.conf 中数值进行初始化。操作系统启动后,可通过ulimit 进行动态修改。
ulimit -n 1048576
知识点:prlimit
ulimit 只能动态修改用户相关参数,如果想动态修改进程参数,则需要使用prlimit
prlimit --nofile=2147483584 -p `pidof taosd`
引用:
[1] Documentation for /proc/sys/fs/
[2]What is the default value and the max value range for fs.file-max in Red Hat Enterprise Linux?
[3]What is the maximum value and default value for fs.nr_open in Red Hat Enterprise Linux?