解决“too many open files”错误需分五步:一、临时用ulimit调整当前会话限制;二、通过/etc/security/limits.conf永久配置用户级限制;三、为systemd服务单独设置limitnofile;四、修改/proc/sys/fs/file-max调优内核级全局上限;五、在对应上下文中验证生效。

如果您在Linux系统中运行高并发服务时遇到“Too many open files”错误,可能是由于文件描述符数量达到系统默认上限。以下是调整文件描述符上限的具体配置步骤:
一、临时修改当前会话的文件描述符限制
该方法仅对当前Shell会话及其子进程生效,重启后失效,适用于快速验证或调试场景。
1、执行命令查看当前软硬限制:ulimit -Sn(软限制)和ulimit -Hn(硬限制)。
2、将当前会话的软限制提升至65535:ulimit -Sn 65535。
3、若需同时提升硬限制(需具备相应权限):ulimit -Hn 65535。
二、通过/etc/security/limits.conf永久配置用户级限制
该方法针对指定用户或用户组,在每次登录时自动加载限制值,适用于长期稳定运行的服务账户。
1、使用root权限编辑配置文件:sudo vi /etc/security/limits.conf。
2、在文件末尾添加以下两行(以用户名www-data为例):www-data soft nofile 65535 和 www-data hard nofile 65535。
3、如需对所有用户生效,可将用户名替换为通配符:* soft nofile 65535 和 * hard nofile 65535。
4、保存并退出编辑器,重新登录用户使配置生效。
三、配置systemd服务的文件描述符限制
对于由systemd管理的服务(如nginx、redis),limits.conf配置可能不生效,需直接修改对应service单元文件。
1、查看服务当前限制:systemctl show -p LimitNOFILE nginx.service。
2、创建覆盖目录:sudo mkdir -p /etc/systemd/system/nginx.service.d。
3、新建覆盖配置文件:sudo vi /etc/systemd/system/nginx.service.d/override.conf。
4、在文件中写入以下内容:[Service]\nLimitNOFILE=65535(注意换行符为实际回车)。
5、重载systemd配置并重启服务:sudo systemctl daemon-reload && sudo systemctl restart nginx.service。
四、修改内核级全局最大文件描述符数
该设置定义系统允许打开的文件描述符总数上限,影响所有进程的总和,需谨慎调整。
1、查看当前值:cat /proc/sys/fs/file-max。
2、临时修改(重启失效):sudo sysctl -w fs.file-max=2097152。
3、永久生效:编辑/etc/sysctl.conf,添加一行:fs.file-max = 2097152。
4、应用更改:sudo sysctl -p。
五、验证配置是否生效
需在目标用户或服务上下文中确认最终生效值,避免因加载顺序或覆盖机制导致配置未触发。
1、切换至目标用户后执行:ulimit -n,检查输出是否为预期数值。
2、对systemd服务,查看其进程的limits信息:cat /proc/$(pgrep -f 'nginx: master')/limits | grep "Max open files"。
3、确认/proc/sys/fs/file-max输出与设定一致:cat /proc/sys/fs/file-max。











