首页/系统/信创系统运维速查/limits.conf 持久化资源限制
服务与运维65 条

limits.conf 持久化资源限制

登录会话级限制写到 /etc/security/limits.conf 或 /etc/security/limits.d/*.conf(PAM 的 pam_limits 加载);对通过 PAM 登录产生的会话生效,重新登录后生效。

信创系统运维速查系统更新于 2026-10-13

登录级限制怎么生效

limits.conf 是 PAM 模块 pam_limits 的配置文件:用户通过 PAM 登录(SSH、su -、登录终端)时,会话会按文件规则设定 ulimit 值,例如最大打开文件数、进程数、core 文件大小。它只作用于登录会话,改完必须重新登录;由 PID 1 直接拉起的 systemd 服务没有 PAM 会话,因此不受它约束,需要限制服务就得写 unit 里的 LimitNOFILE、LimitNPROC。

基本信息

配置文件/etc/security/limits.conf、/etc/security/limits.d/*.conf
配置字段域(用户或组) 类型(soft/hard) 项目 值
生效机制pam_limits 在登录会话建立时套用
生效时机重新登录后生效,当前会话不变
服务侧unit 的 LimitNOFILE/LimitNPROC/LimitCORE
查看当前值ulimit -a、ulimit -n、cat /proc/<PID>/limits

典型使用场景

  • 中间件要求进程可打开文件数很大,需要给专属账号放开 nofile
  • 避免服务崩溃时生成巨大 core 文件把磁盘写满
  • 多用户开发机上限制单用户可创建的进程数
  • 交付验收时按规范统一下发登录限制
  • 排查『手工启动正常、服务启动报 too many open files』的差异

配置示例与验证

配置示例与验证
# /etc/security/limits.d/90-app.conf
# appuser  soft  nofile  65535
# appuser  hard  nofile  65535
# *        soft  core    0

cat /proc/sys/fs/file-max                      # 先看内核全局上限,配置值不应超过它
su - appuser -c 'ulimit -n'                    # 完整登录方式验证,输出应为 65535
su - appuser -c 'ulimit -Hu'                   # 看硬限制,软限制不能反向超过硬限制
cat /proc/$(pgrep -u appuser -n)/limits | head # 看实际运行进程的限制(比 ulimit 更准)

服务侧限制写法

服务侧限制写法
# systemd 服务需要单独配置:
systemctl edit myapp
# [Service]
# LimitNOFILE=65535
# LimitNPROC=4096
# LimitCORE=0

systemctl daemon-reload && systemctl restart myapp
systemctl show myapp -p LimitNOFILE -p LimitNPROC    # 确认服务实际拿到的限制
systemctl status myapp | grep -i limit               # 或从状态输出里的资源段核对

常见项目与判读

项目含义注意点
nofile单进程可打开的文件描述符数过低表现为 too many open files
nproc单用户可创建的进程/线程数过紧会让服务 fork 失败
corecore 文件大小上限设 0 表示不生成,利于省磁盘
memlock可锁定内存上限数据库等应用常需要放开
soft 与 hard软限制与硬限制软限制不能超过硬限制,改软限制上限需先改硬限制
limits.conf 对 systemd 服务默认不生效:服务没有 PAM 会话,改完配置文件重启服务仍然继承旧限制,这是『文件配了但服务还是报 too many open files』的典型原因。
给 * 通配所有用户调大 nofile 前先核对内核 fs.file-max:全局上限不足时单个用户配得再大也起不到作用,关键用户单独配置更稳妥。

易错点

  • 改完 limits.conf 用当前会话的 ulimit 验证,未重新登录看不到变化,误判为配置无效
  • 用 su appuser 而不是 su - appuser 验证,没走完整登录流程导致结果不符,需要带上短横线
  • 只改软限制没动硬限制,软限制被硬限制卡住,实际生效值比预期小
  • 以为改了 limits.conf 就能约束 systemd 服务,服务仍受旧限制,问题反复出现
  • 对全用户通配上调 nofile 而内核 fs.file-max 不足,调优表面生效、高峰仍报描述符耗尽

数据来源与参考

  • man 5 limits.conf
  • man 8 pam_limits
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌