统信uos中解决“too many open files”需三步:临时用ulimit -n 65535验证;永久修改/etc/security/limits.conf并重新登录;调大fs.file-max及systemd的defaultlimitnofile或服务级limitnofile。

您在统信UOS中运行Nginx、Redis或自研高并发服务时,突然收到“Too many open files”错误,进程崩溃退出——这说明系统当前打开文件数限制已触顶,必须立即调整最大文件限制。
临时提高当前会话限制
这一步操作起来很简单,直接在终端里执行命令就行,仅对当前终端及其启动的子进程生效,适合快速验证是否是句柄不足导致的问题。
ulimit -n 65535
验证是否成功:ulimit -n → 输出应为【65535】。若仍显示1024或4096,说明当前shell受限于PAM策略,需跳过此步直接进入永久配置。
永久修改用户级最大打开文件数
该设置通过PAM模块加载,覆盖所有登录会话(包括图形界面启动的应用),是绝大多数服务实际生效的层级。
第一步:编辑限制配置文件
sudo nano /etc/security/limits.conf
第二步:在文件末尾新增两行(注意空格不能用Tab替代,必须是英文空格):
* soft nofile 65535
* hard nofile 65535
第三步:保存退出,【必须重新登录或重启图形会话(Ctrl+Alt+Backspace 或注销再登录)才能生效】。仅重启终端无效,因为图形环境进程不读取新limits。
同步调大系统级文件句柄总量
用户级限制不能超过内核允许的全局上限,否则硬限制会被自动截断为fs.file-max值。若只改limits.conf却不调大此项,65535可能实际被压到默认的几十万以下。
编辑内核参数:
sudo nano /etc/sysctl.conf
追加一行:
fs.file-max = 2097152
立即加载:
sudo sysctl -p
验证:
cat /proc/sys/fs/file-max → 输出应为【2097152】
适配systemd托管的服务进程
nginx、redis、mysql等服务由systemd启动,默认完全忽略/etc/security/limits.conf,必须单独配置systemd的DefaultLimitNOFILE。
方法一:全局启用
编辑:
sudo nano /etc/systemd/system.conf
取消注释并修改:
DefaultLimitNOFILE=65535
方法二:单服务覆盖(推荐用于关键服务)
创建覆盖目录:
sudo mkdir -p /etc/systemd/system/nginx.service.d
新建配置:
echo "[Service]\nLimitNOFILE=65535" | sudo tee /etc/systemd/system/nginx.service.d/override.conf
重载配置:
sudo systemctl daemon-reload











