答案:调整 Linux 文件句柄需统一配置用户、系统和 systemd 服务限制。先用 ls /proc/<pid>/fd、cat /proc/sys/fs/file-nr 和 ulimit -Sn/Hn 查看当前状态;临时通过 ulimit 命令修改;永久修改需编辑 /etc/security/limits.conf 设置 soft/hard nofile,确保 PAM 启用 pam_limits.so;再调大 /etc/sysctl.conf 中 fs.file-max 值;systemd 服务需在 [Service] 下添加 LimitNOFILE 并重载生效。

Linux 系统中文件句柄(File Descriptor,简称 fd)是进程访问文件、套接字、管道等 I / O 资源的关键标识。每个进程能打开的文件句柄数量受限于系统配置,当程序并发较高(如 Web服务器、数据库)时容易遇到“Too many open files”错误。合理调整文件句柄上限是系统优化的重要环节。
查看当前文件句柄使用情况
在调整之前,先了解系统当前的状态:
- 查看某进程已使用的 fd 数量:
ls /proc/<pid>/fd | wc -l - 查看系统级当前打开的文件句柄总数:
cat /proc/sys/fs/file-nr输出三列:已分配 fd 数、未使用但已分配的 fd 数、系统最大限制。 - 查看单个进程的软硬限制:
ulimit -Sn(软限制)ulimit -Hn(硬限制)
临时修改文件句柄上限
通过命令行可临时提升当前会话或用户 shell 的限制:
-
ulimit -Sn 65536:设置当前 shell 软限制为 65536 -
ulimit -Hn 65536:设置硬限制
注意:这种方式只对当前 shell 及其子进程有效,重启后失效。
永久配置用户级文件句柄限制
编辑 /etc/security/limits.conf 文件,实现持久化配置:
添加如下内容:
* soft nofile 65536 * hard nofile 65536 your_user soft nofile 131072 your_user hard nofile 131072
说明:
- * 表示对所有用户生效
- soft/hard 分别代表软限制和硬限制
- nofile 是文件句柄的资源类型
- 数值可根据实际需要调整
某些系统需启用 PAM 模块支持,确保 /etc/pam.d/common-session 包含:
pam_limits.so
调整系统级最大文件句柄数
用户限制不能超过系统全局上限,需同步调整内核参数:
- 编辑
/etc/sysctl.conf: - 应用更改:
fs.file-max = 2097152
sysctl -p
此值表示系统可分配的总文件句柄数,建议根据服务器负载设置为几十万甚至更高。
服务进程的特殊处理(systemd 场景)
使用 systemd 管理的服务不受 limits.conf 直接影响,需单独配置:
- 编辑服务单元文件:
systemctl edit your-service - 添加:
- 重载并重启服务:
[Service] LimitNOFILE=65536
systemctl daemon-reexec && systemctl restart your-service
基本上就这些。调整文件句柄限制不复杂,但容易忽略 systemd 或进程继承问题。关键是把用户限制、系统上限和服务配置统一考虑,才能彻底解决问题。