Linux文件句柄数限制进程可打开的文件等资源数量,高并发服务需调大以防“Too many open files”错误;可通过/proc、ulimit、sysctl等命令查看和临时修改,永久配置需设置limits.conf、sysctl.conf及systemd服务LimitNOFILE参数。

Linux文件句柄数(file descriptor limit)限制了进程能同时打开的文件、socket、管道等资源数量。高并发服务(如Web服务器、数据库、消息队列)若不调大该限制,容易出现 Too many open files 错误,导致连接拒绝或服务异常。
查看当前句柄使用与限制
快速定位是否已达上限:
-
查看某进程已用句柄数:
ls /proc//fd | wc -l -
查看进程软/硬限制:
cat /proc//limits | grep "Max open files" -
查看系统级总限制:
cat /proc/sys/fs/file-max -
查看当前用户会话限制:
ulimit -n(软限制),ulimit -Hn(硬限制)
临时修改(重启后失效)
适用于调试或紧急扩容:
- 对当前shell及子进程:
ulimit -n 65536(需小于等于硬限制) - 提升硬限制(需root):
ulimit -Hn 65536,再设软限制 - 修改系统级最大值(全局生效,无需重启服务):
echo 2097152 > /proc/sys/fs/file-max
永久修改(推荐生产环境使用)
需多层配置,确保服务启动时加载正确值:
-
/etc/security/limits.conf(影响用户登录会话):
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
注意:需确保 PAM 模块pam_limits.so已启用(检查/etc/pam.d/common-session或对应登录配置) -
/etc/sysctl.conf(系统级持久化):
fs.file-max = 2097152
执行sysctl -p生效 -
systemd服务单独配置(重要!多数现代服务由 systemd 管理):
编辑服务单元文件,如/etc/systemd/system/nginx.service.d/override.conf:
[Service]
LimitNOFILE=65536
然后执行systemctl daemon-reload && systemctl restart nginx
验证与注意事项
修改后务必验证实际生效效果:
- 重启目标服务(非仅 reload),再查
/proc//limits - 注意区分:soft limit 可被进程自行降低,hard limit 需 root 权限才能提升
- 容器环境(如 Docker)需在
docker run中加--ulimit nofile=65536:65536,或在docker-compose.yml的ulimits字段配置 - Java 应用注意 JVM 参数不影响 OS 层句柄限制,仍需系统级配置










