麒麟系统高并发服务因文件描述符不足报“Too many open files”时,需依次调整:1.临时提升会话限制(ulimit);2.永久配置用户级限制(limits.conf);3.调高内核全局上限(fs.file-max);4.为systemd服务单独设限(systemd配置);5.逐项验证生效。

如果您在麒麟操作系统上运行高并发服务(如Nginx、达梦数据库或Java微服务)时频繁收到“Too many open files”错误,或发现连接被拒绝、日志提示文件句柄耗尽,说明当前系统的文件描述符限制已无法支撑实际负载。这并非应用代码问题,而是系统资源配额不足导致的硬性拦截。
临时提升当前会话限制
这一步操作起来很简单,直接在终端里敲几条命令就行,适合快速验证是否是限制过低引发的问题。
执行 ulimit -Sn 查看当前软限制值;再执行 ulimit -Hn 查看硬限制值。
若软限制低于65535,运行 ulimit -Sn 65535 将其提升;若需同步提高硬限制(必须有root权限),再执行 ulimit -Hn 65535。
【注意:该设置仅对当前终端及其启动的子进程生效,关闭窗口或新建SSH会话后即失效】
永久配置所有用户的限制
这是生产环境最常用、最稳妥的方式,通过PAM机制在用户登录时自动加载限制规则。
用root权限编辑配置文件:sudo nano /etc/security/limits.conf。
在文件末尾新增两行:
* soft nofile 65535
* hard nofile 65535
保存退出后,【必须重新登录用户或新建SSH会话才能生效】,图形界面用户需注销重进。
调高内核级全局上限
用户级限制再高,也绕不过整个系统能分配的总文件描述符数。这个值由内核参数 fs.file-max 控制,它决定了所有进程加起来最多能打开多少个文件。
先查看当前值:cat /proc/sys/fs/file-max。
临时修改(重启失效):sudo sysctl -w fs.file-max=1048576。
永久生效:执行 echo "fs.file-max = 1048576" | sudo tee -a /etc/sysctl.conf → 运行 sudo sysctl -p 加载新配置。
为systemd服务单独设限
麒麟V10默认使用systemd管理服务,而limits.conf对systemd托管的服务往往不生效——因为这些服务由systemd父进程派生,不经过PAM登录流程。
方法一:全局生效
编辑 /etc/systemd/system.conf,取消 #DefaultLimitNOFILE= 行的注释,改为:DefaultLimitNOFILE=65535 → 执行 sudo systemctl daemon-reload → 重启 systemd-logind 服务。
方法二:按服务精准控制
例如针对达梦数据库服务,运行 sudo systemctl edit DmService → 在打开的编辑器中输入:
[Service]LimitNOFILE=65535
保存后执行 sudo systemctl daemon-reload → 重启对应服务即可。
验证是否真正生效
第一步:新开一个终端,执行 ulimit -n,确认返回值为65535。
第二步:检查内核全局值:sysctl fs.file-max,应显示1048576。
第三步:找一个正在运行的服务进程,比如Nginx主进程,先用 pgrep -f nginx 获取PID,再执行 cat /proc/PID/limits | grep "Max open files",输出的两列数值都应为65535。

















