问题现场

当你训练模型、处理大量文件或运行高并发服务时,突然出现:

Failed creating file: ... [Too many open files]

你按照标准方案修改了 /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

但重启后 ulimit -n 依然显示 10244096。为什么?

根本原因:Systemd 接管了资源限制

Manjaro(及 Arch 等现代 Linux 发行版)使用 Systemd 作为核心进程管理器。关键事实:

Systemd 管理的进程(包括用户桌面会话)在启动时会忽略传统的 limits.conf 配置!

它们只认 Systemd 自己的资源限制设置。

完整解决方案(四步走)

1. 修改系统级服务限制

sudo nano /etc/systemd/system.conf

取消注释并修改:

DefaultLimitNOFILE=65536:65536  # 格式:soft:hard

2. 修改用户级服务限制(关键!常被遗漏)

sudo nano /etc/systemd/user.conf

同样取消注释并修改:

DefaultLimitNOFILE=65536:65536

3. 重载配置并重启

# 重载系统配置
sudo systemctl daemon-reload # 重载用户配置(必须执行!)
systemctl --user daemon-reload # 彻底重启(否则不生效)
reboot

4. 验证生效情况

# 查看当前shell限制
ulimit -n # 应输出65536 # 检查任意进程的实际限制
sleep 1h & # 启动测试进程
cat /proc/$!/limits | grep "Max open files"

输出应包含:

Max open files            65536                65536                files

常见问题排查

1. 为什么桌面应用仍受限?

  • 原因:图形应用由 systemd --user 管理,只受 user.conf 约束
  • 解决:确保修改了 user.conf 并执行 systemctl --user daemon-reload

2. 重启后部分终端仍显示旧限制

  • 原因:终端会话未完全重启
  • 解决:关闭所有终端窗口,重新打开新终端

3. 系统服务(如Docker)未生效

  • 原因:系统服务受 system.conf 约束
  • 解决:确认已修改 system.conf 并执行 sudo systemctl daemon-reload

高级场景处理

只为特定服务增加限制

# 创建服务覆盖配置
sudo systemctl edit nginx.service # 添加内容
[Service]
LimitNOFILE=1048576

临时调试解决方案

# 当前终端会话有效
ulimit -n 65536 # 修改运行中进程的限制
prlimit --pid <PID> --nofile=65536:65536

为什么 limits.conf 会失效?

  • limits.conf 依赖 PAM 认证流程生效
  • Systemd 管理的进程(特别是桌面环境)绕过 PAM 初始化
  • 用户级服务由 systemd --user 直接启动,继承其默认限制

配置作用域总结

配置文件 影响范围 典型场景
/etc/systemd/system.conf 系统级服务 Docker, Nginx, PostgreSQL
/etc/systemd/user.conf 用户级进程 桌面应用,终端启动的脚本
/etc/security/limits.conf 通过PAM登录的会话 SSH登录,tty控制台

终极验证命令

# 查看系统全局限制
cat /proc/sys/fs/file-max # 查看当前用户限制
ulimit -n # 查看具体进程限制
cat /proc/$(pgrep -f your_process)/limits | grep open.files # 查看已打开文件数
lsof -u $USER | wc -l

总结流程图

graph LR
A[遇到错误] --> B{进程类型}
B -->|系统服务| C[修改 system.conf]
B -->|用户进程| D[修改 user.conf]
C --> E[执行双 reload]
D --> E
E --> F[重启系统]
F --> G[验证结果]
G -->|仍受限| H[检查特定服务]

Manjaro/Arch 彻底解决 "Too many open files":为什么你改的 limits.conf 不生效的更多相关文章

  1. 解决 browser-sync start --server --files 文件不能同步的问题!

    解决 browser-sync start --server --files 文件不能同步的问题! 请看我的源命令: browser-sync start --server --file 'test2 ...

  2. [转载]性能测试工具 2 步解决 too many open files 的问题,让服务器支持更多连接数

    [转载]性能测试工具 2 步解决 too many open files 的问题,让服务器支持更多连接数 大话性能 · 2018年10月09日 · 最后由 大话性能 回复于 2018年10月09日 · ...

  3. Centos 修改limits.conf open files后不生效的解决办法

    线上几台APACHE服务器报过三.四次open files的问题,导致服务不可用,执行ulimit -n 查看后,发现是默认的1024,找到原因所在了,就去修改下/etc/security/limit ...

  4. mysql5.7出现大量too many connections及too many open files错误,且配置最大连接数未生效

    too many connections是由于mysql配置中连接数过少,不足以支撑当前的并发数,too many open files是由于mysql open_files_limit的值大小不够. ...

  5. Windows中Nginx配置nginx.conf不生效解决方法(路径映射)

    Windows中Nginx配置nginx.conf不生效解决方法 今天在做Nginx项目的时候,要处理一个路径映射问题, location /evaluate/ { proxy_pass http:/ ...

  6. manjaro(arch)里的vbox 安装centos7后,centos无法联网的解决办法

    第一步,在VirtualBox中设置网卡连接方式:点“设置”,在弹出的界面中点“网络”,最后选择“连接方式”为“桥接网卡”. 回到centOS中,进入终端,输入命令:ip addr,查看网络配置文件的 ...

  7. manjaro (arch) 安装搜狗输入法

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/sogou_input_install_in_arch_manja ...

  8. Manjaro/Arch linux 安装输入法

    输入命令: sudo pacman -Syu fcitx fcitx-googlepinyin fcitx-im fcitx-configtool 编辑 ~/.xprofile:# xfcitxexp ...

  9. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题

    问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubuntu 有一个 reso ...

  10. 解决iOS9苹果将原http协议改成了https协议问题

    解决方法: 在info.plist 加入key <key>NSAppTransportSecurity</key> <dict> <key>NSAllo ...

随机推荐

  1. 【Maven】生命周期

    Maven 有三个相互独立的生命周期:Clean 生命周期.build 生命周期.site 生命周期. 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行. Maven 的核心程序中定 ...

  2. dxSpreadSheet的报表demo-关于设计报表模板问题

    学习 dxSpreadSheetReportDesigner过程中发现: dxSpreadSheet通过dxSpreadSheetReportDesigner点击右键出现弹出菜单,自动生成如图的菜单和 ...

  3. C# 调用 Win10/11 文件关联对话框

    方法一:调用未公开接口 IOpenWithLauncher Adobe Acrobat 应该是调用的未公开接口方法 [ComImport] [InterfaceType(ComInterfaceTyp ...

  4. C中输入输出

    引入一个概念,对于计算机来说,外来数据都是输入,经过计算机处理的结果并进行显示的就是输出.在linux里面,一切都是文件,就连输入输出,都可以划归到"文件"一类,而为了管理这些文件 ...

  5. java中使用BigDecimal解决小数计算问题

    1.示例 @Test public void test() { System.out.println(0.3 + 0.1); System.out.println(0.3 - 0.1); System ...

  6. 康谋分享 | aiSim5仿真场景重建感知置信度评估(三)

    aiSim5重建高精度的真实交通场景,用于测试和训练ADAS/AD系统.内置场景包括赛道.车库.高速公路和城市环境.通过全局行动日志,aiSim能将驾驶数据转化为场景重建.车道线检测算法在仿真与现实世 ...

  7. 为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?

    为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的? 在 CMS(Concurrent Mark-Sweep)垃圾收集器中 ...

  8. MCP协议Streamable HTTP

    一.概述 2025 年 3 月 26 日,模型上下文协议(Model Context Protocol,简称 MCP)引入了一项关键更新:用 Streamable HTTP 替代原先的 HTTP +  ...

  9. K8s新手系列之K8s架构

    应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署 互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分 ...

  10. 从零开始学Flink:开启实时计算的魔法之旅

    在凌晨三点的数据监控大屏前,某电商平台的技术负责人突然发现一个异常波动:支付成功率骤降15%.传统的数据仓库此时还在沉睡,而基于Flink搭建的实时风控系统早已捕捉到这个信号,自动触发预警机制.当运维 ...