首先确认是否因文件句柄耗尽导致“Too many open files”错误,通过查看系统file-nr、进程fd数量及limits判断;随后依次调整用户级ulimit(修改limits.conf)、系统级file-max(配置sysctl.conf)及systemd服务的LimitNOFILE,确保各层限制合理并生效,从而解决高并发下句柄不足问题。

当系统出现“Too many open files”错误时,通常是由于进程打开的文件句柄数超过了系统或用户的限制。这类问题常见于高并发服务(如Web服务器、数据库等)运行过程中。下面介绍如何排查和解决Linux中文件句柄耗尽的问题,并配置ulimit参数。
1. 确认是否是文件句柄耗尽
首先通过以下方式判断当前是否存在句柄耗尽情况:
-
查看系统整体句柄使用情况:
cat /proc/sys/fs/file-nr
输出三列数字,分别是:已分配的文件句柄数、已使用的文件句柄数、系统最大可分配数。如果第二列接近第三列,说明系统级句柄紧张。 -
查看具体进程的打开文件数量:
ls /proc//fd | wc -l
替换为实际进程ID,即可看到该进程当前打开的文件描述符个数。 -
查看进程的资源限制:
cat /proc//limits | grep "open files"
可以看到该进程能打开的最大文件数(soft limit 和 hard limit)。
2. 查看和修改用户级 ulimit 配置
Linux 使用 ulimit 控制单个用户或进程的资源上限。默认情况下,普通用户的打开文件数限制较低(常见为1024)。
-
查看当前 shell 的文件句柄限制:
ulimit -n # 显示 soft limit
ulimit -Hn # 显示 hard limit -
临时提高限制(仅当前会话有效):
ulimit -n 65536 -
永久配置用户/系统级限制:
编辑/etc/security/limits.conf文件,添加如下内容:
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
其中*表示所有用户,也可指定特定用户名。修改后需重新登录生效。
3. 系统级文件句柄数调整
如果应用并发量大,还需提升系统级别的最大句柄数。
-
查看当前系统最大句柄数:
cat /proc/sys/fs/file-max -
临时设置系统最大句柄数:
echo 2097152 > /proc/sys/fs/file-max -
永久配置:
编辑/etc/sysctl.conf,添加:
fs.file-max = 2097152
执行sysctl -p生效。
4. 应用服务启动环境中的 ulimit 设置
某些服务由 systemd 管理,其资源限制不受 limits.conf 完全控制,需要单独配置。
-
查看某服务的限制:
systemctl show| grep LimitNOFILE -
修改 systemd 服务的文件句柄限制:
创建或编辑服务的 override 配置:
systemctl edit
添加内容:
[Service]
LimitNOFILE=65536
重启服务生效:systemctl restart
基本上就这些。关键是先定位是哪个进程或用户触发了限制,再逐层检查系统、用户、服务三个层面的配置。合理设置 ulimit 和 file-max 能有效避免因文件句柄耗尽导致的服务异常。










