1. 概述
1.1 问题描述
Linux 服务器中部署帆软应用时,出现报错打开的文件过多或者too many open files,如下图所示:
1.2 原因分析
Linux 系统对每个登录用户打开的最大文件数有限制。
在一些并发或多线程情况下, 需要手动改掉 Linux 系统的最大打开文件数,以突破限制。该修改在不同情况下会涉及到 3 个关键值。
2. 参数说明
2.1 参数介绍
参数 | 说明 | 默认值 |
---|---|---|
nofile | 单个进程的最大打开文件数 | 1024 |
nr_open | 单个进程可分配的最大文件数 | 1024*1024=1048576 |
file-max | 系统内核一共可以打开的最大值 | 185745 |
2.2 修改策略
一般情况下,nofile 的值不允许超过 nr_open 和 file-max 的值。因此在修改 nofile 时要考虑是否超过以上两个值的情况:
当要修改的「nofile」值未超过「nr_open」和「file-max」两个值时,直接修改「nofile」值即可。
当要修改的「nofile」值超过「nr_open」和「file-max」两个值时,不仅要修改「nofile」的值,还要修改「nr_open」和「file-max」的值满足「大于nofile」值。
2.3 查看参数大小
基于修改策略,请在执行下文的修改操作前,先查看各个参数的大小。
参数 | 查询语句 |
---|---|
nofile | ulimit -n |
nr_open | cat /proc/sys/fs/nr_open |
file-max | cat /proc/sys/fs/file-max |
3. 修改 nofile 值
当要修改的「nofile」值(最大打开文件数)未超过「nr_open」和「file-max」两个值时,直接修改「nofile」值即可。
3.1 临时生效
1)使用终端工具连接服务器,执行命令:ulimit -n 128000
2)该修改只会影响当前shell会话。如果你打开一个新的终端窗口,nofile 限制将恢复为系统设置值。
3.2 永久生效
参考3.1节步骤后,直接执行 reboot 重启 Linux 服务器,即可永久生效;
若不想重启服务器,可参考本节完整步骤。
1)使用vi /etc/security/limits.conf编辑 limits.conf 文件,修改 nofile 值(其中 128000 即为修改的 nofile 值),如下所示:
vi /etc/security/limits.conf #进入文件编辑界面
* soft nofile 128000 #确保有该行内容
* hard nofile 128000 #确保有该行内容
注:有的系统需把「*」替换为具体用户名才生效,例如 root soft nofile 128000
2)编辑/etc/pam.d/login文件,确保有下面内容,并保存。如下图所示:
session required pam_limits.so
3)使用exit语句退出终端重新登录即可。如下图所示:
4. nr_open 和 file-max 值
4.1 临时生效
echo 1200000 > /proc/sys/fs/nr_open
echo 200000 > /proc/sys/fs/file-max
4.2 永久生效:需重启服务器
当要修改的最大打开文件数超过 nr_open 和 file-max 时,就需要改动该值,将该值提高。其修改方式如下:
在文件/proc/sys/fs/nr_open
中加入如下代码:(1200000 为修改的参数值)
fs.nr_open=1200000
在文件 /proc/sys/fs/file-max 中插入如下代码:
fs.file-max=200000
保存并执行 reboot 重启服务器。
注:Linux的内核参数 nr_open 只有在内核版本是 2.6.25 之后的版本才可设置。查看内核版本使用命令“uname -a”。
然后再修改 nofile 值 ,请参见 3.2 节。
4.3 永久生效:无需重启服务器
在/etc/sysctl.conf中设置fs.nr_open= 1200000 fs.file-max=200000,然后执行sysctl -p,使配置生效。如下所示:
4.4 效果查看
通过cat /proc/pid/limits查看单进程最大打开文件数,如下图所示:
5. 注意事项
5.1 nofile修改不生效
问题描述
参考文档第三章修改nofile值不生效,仍为之前的值。
原因及解决方案
检查/etc/profile文件中,是否存在 ulimit -n xxx相关语句,删除即可
5.2 普通用户修改未生效
问题描述
参考本文4.3节无需重启服务器的步骤后,普通用户修改未生效,使用 ssh 连接 Linux 报错:ulimit: open files: cannot modify limit: Operation not permitted
原因分析
该问题发生在 openssh 升级之后,且只有 ssh 登录才发生此问题,与 ssh 有关。
解决方案
1)修改sshd_config文件,将#UseLogin no修改为UseLogin yes,如下所示:
vi /etc/ssh/sshd_config
2)使用service sshd restart重启 ssh 服务。