前言

在使用linux的过程中,经常会遇到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) 15660
max locked memory       (kbytes, -l) 65536
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) 15660
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

绝大多数情况下,都是因为open files太小的缘故,此处为1024,将其改大即可。

设置open files

临时设置,系统重启失效

使用ulimit -n命令即可,如

ulimit -n 8096

永久设置

对于首次设置,可直接使用如下命令。

echo 'root soft nofile 65535' >> /etc/security/limits.conf
echo 'root hard nofile 65535' >> /etc/security/limits.conf
echo '* soft nofile 65535' >> /etc/security/limits.conf
echo '* hard nofile 65535' >> /etc/security/limits.conf

也可以手动编辑limits.conf文件

vim /etc/security/limits.conf

加入如下内容

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

需要注意的是,root用户和普通用户需要单独设置,上述配置中,* 表示普通用户。
设置后重启生效。

设置系统最大打开文件数

除了对用户的设置,整个系统也有一个上限值,如果上述设置后,用户最大打开文件数仍未改变,或仍然出现too many open files错误,则需要检查系统最大打开文件数。

cat /proc/sys/fs/file-max

设置方法是编辑/etc/sysctl.conf文件

vim /etc/sysctl.conf

设置fs.file-max参数

fs.file-max = 2000000

让其生效

sysctl -p