温馨提示×

debian ulimit不生效为何

小樊
45
2026-10-06 22:03:55
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)里,ulimit “不生效”通常不是命令本身的问题,而是作用范围 / 配置位置 / 服务管理方式不对。下面按最常见原因逐条说明。


1. ulimit 只对“当前 shell 及其子进程”有效

ulimit -n 65535

这只对:

  • 当前 shell
  • 当前 shell 启动的子进程

有效,不会影响:

  • 已运行的进程
  • 其他终端
  • 系统服务(systemd 服务)

✅ 验证:

ulimit -n

在同一 shell里看才有效。


2. 修改 /etc/security/limits.conf 但没生效(最常见)

正确配置示例

* soft nofile 65535
* hard nofile 65535

但必须满足以下条件:

✅ (1) 使用 PAM 登录

limits.conf 依赖 PAM:

# 确认以下文件包含
session required pam_limits.so

检查:

grep pam_limits /etc/pam.d/common-session
grep pam_limits /etc/pam.d/login

✅ (2) 必须是“登录会话”

以下情况 不会读取 limits.conf:

  • cron
  • systemd 服务
  • docker
  • 某些 CI / 守护进程

✅ 只有:

  • 本地登录
  • SSH 登录
  • su -(注意有 -)

❌ 错误:

su root

✅ 正确:

su - root

3. systemd 服务忽略 ulimit / limits.conf

这是 Debian 9+ 最常见坑

现象

systemctl start nginx

ulimit -n 不生效

原因

systemd 不读:

  • /etc/security/limits.conf
  • shell 的 ulimit

正确做法

在 service 文件里加:

[Service]
LimitNOFILE=65535
LimitNPROC=65535

然后:

systemctl daemon-reexec
systemctl restart xxx

验证:

cat /proc/<pid>/limits

4. Docker / 容器不生效

Docker 默认继承宿主机限制,但:

docker run --ulimit nofile=65535:65535 ...

或 docker-compose:

ulimits:
  nofile:
    soft: 65535
    hard: 65535

5. 硬限制低于你想设的值

ulimit -Hn

如果你当前是:

-Hn 1024

那:

ulimit -n 65535

会失败。

✅ 必须:

  • root
  • 或修改 /etc/security/limits.conf

6. 非 root 用户不能提高硬限制

只有:

  • root
  • 或已在 limits.conf 中授权

才能提高 hard limit


7. 内核参数限制(极少)

sysctl fs.file-max

如果太小:

fs.file-max = 100000

修改:

/etc/sysctl.conf
fs.file-max = 1000000
sysctl -p

快速排查清单 ✅

# 当前 shell
ulimit -a

# 进程实际限制
cat /proc/$$/limits

# systemd 服务
systemctl show <service> | grep Limit

# 登录方式
echo $0

一句话总结

Debian 上 ulimit 不生效,90% 是因为:你改的地方不是进程真正启动的地方。

如果你愿意,可以告诉我:

  • Debian 版本
  • 想限制什么(nofile / nproc / 内存?)
  • 是登录用户还是服务

我可以直接给你精确配置。

0 踩