Linux系统资源限制配置_limits.conf详解

2次阅读

linux资源限制通过/etc/security/limits.conf由pam pam_limits.so在登录时生效,需确保pam启用、重新登录,并注意systemd和容器需单独配置;推荐用“user – nofile 65535”同时设软硬限。

Linux系统资源限制配置_limits.conf详解

Linux系统资源限制主要靠 /etc/security/limits.conf 实现,它不是内核配置,而是由 PAM 模块 pam_limits.so 在用户登录时加载生效的。配置写对了,但没登录新会话、没启用 PAM 或被 systemd 绕过,都会导致不生效。

limits.conf 的基本格式和含义

每行遵循四字段结构:domain type item value

  • domain:作用对象,可以是用户名(如 www-data)、组名(如 @devs),或通配符 * 表示所有普通用户(不包括 root)
  • type:限制类型,soft 是当前生效值,hard 是上限,- 表示同时设置软硬限制
  • item:资源类型,最常用的是 nofile(文件描述符数)、nproc(最大进程/线程数),其他还有 stackasmemlock
  • value:数值,支持整数或 unlimited(慎用)

为什么 soft 和 hard 要配对设置

soft 限制不能高于 hard 限制,且普通用户只能调高 soft 值(到 hard 范围内),不能动 hard 值。root 用户可修改两者。若只设 soft 不设 hard,后续 ulimit -Hn 查看可能显示默认低值(如 4096),导致服务启动时因硬限不足失败。

  • 推荐写法:www-data - nofile 65535(一行搞定软硬)
  • 避免只写:www-data soft nofile 65535(hard 仍为系统默认,可能卡住服务)
  • root 用户不受 * 规则影响,如需限制 root,必须显式写 root - nofile 65535

配置生效的前提条件

limits.conf 不是改完就生效的配置文件,它依赖完整的 PAM 流程:

  • 确认 /etc/pam.d/login/etc/pam.d/sshd 等登录服务中包含 session required pam_limits.so
  • 修改后必须退出当前会话并重新登录(SSH 重连、图形界面注销再进),su - user 也有效,但 su user 不加载新 limits
  • systemd 服务(如 nginxredis)默认不读取 limits.conf,需单独在 /etc/systemd/system/*.service.d/override.conf 中设 LimitNOFILE=65535
  • 容器环境(如 docker)需用 --ulimit nofile=65535:65535 显式传递,宿主机 limits.conf 对容器内进程无效

常见陷阱与验证方法

配置看似正确却无效,多数出在验证方式或层级覆盖上:

  • ulimit -n 查看当前 shell 的 nofile 值,用 ulimit -Hnulimit -Sn 分别确认硬软限制是否一致
  • 不要只查 root 或当前终端,要切换目标用户验证:sudo -u www-data bash -c 'ulimit -n'
  • systemd 服务要用 systemctl show -p LimitNOFILE nginx.service 查,不是 ulimit
  • 注意 /etc/security/limits.d/*.conf 下的文件按字母序加载,后加载的会覆盖前面同 domain+item 的设置
  • 某些发行版(如新版 ubuntu)默认禁用 PAM limits,需检查 /etc/pam.d/common-session 是否含 pam_limits.so
text=ZqhQzanResources