Linux文件描述符限制影响高并发服务,需区分临时与永久调整:用ulimit查看和临时修改当前会话限制;永久修改需配置/etc/security/limits.conf(用户级)或systemd服务的LimitNOFILE(服务级),并重启生效。

Linux中文件描述符(File Descriptor)数量限制直接影响程序能同时打开的文件、网络连接等资源数量。默认值通常偏低(如1024),高并发服务(如Web服务器、数据库)容易因“Too many open files”报错而异常。调整需区分临时生效与永久生效,且需注意用户级、系统级、进程级三重作用域。
查看当前限制
使用 ulimit 命令可快速检查当前 shell 会话的软限制(soft limit)和硬限制(hard limit):
- ulimit -n:显示当前打开文件数的软限制
- ulimit -Hn:显示硬限制(管理员设定的上限)
- ulimit -Sn:显示软限制(实际生效值,不能超过硬限制)
- cat /proc/<pid>/limits | grep "Max open files":查看某进程运行时的实际限制
临时修改(仅当前会话有效)
适用于调试或测试,退出终端即失效:
- 先提升硬限制(需有权限,普通用户只能降低或保持,不能提高硬限):ulimit -Hn 65536
- 再设置软限制(必须 ≤ 硬限制):ulimit -Sn 65536
- 合并写法:ulimit -n 65536(等价于同时设软硬为65536,前提是已有足够硬限)
永久修改用户级限制(推荐方式)
对指定用户(如 www-data、nginx、普通登录用户)长期生效,需编辑 /etc/security/limits.conf 或其子配置:
- 在 /etc/security/limits.conf 末尾添加(以用户 nginx 为例):
nginx soft nofile 65536
nginx hard nofile 65536 - 若使用 systemd(多数现代发行版),还需确保 pam_limits.so 已启用:检查 /etc/pam.d/common-session 或 /etc/pam.d/sshd 是否含 session required pam_limits.so
- 注意:修改后需**重新登录用户**(或重启对应服务)才生效;systemd 服务可能还需额外配置(见下条)
systemd 服务的特殊处理
使用 systemd 管理的服务(如 nginx、redis、自定义 service)不读取 limits.conf,需在 service 文件中显式设置:
- 编辑服务单元文件,例如:sudo systemctl edit nginx.service
- 添加如下内容:
[Service]
LimitNOFILE=65536 - 重载配置并重启:sudo systemctl daemon-reload && sudo systemctl restart nginx
- 验证:systemctl show nginx | grep LimitNOFILE 或查 /proc/<pid>/limits










