你问的“为什么 Debian 上 ulimit 生效”,可以从 Linux 资源限制机制 和 Debian 的默认配置 两个层面来理解。
ulimit 本质是 shell 对进程资源限制的一种封装,最终通过系统调用实现:
ulimit 是 bash / dash 等 shell 的内建命令setrlimit() / getrlimit()(Linux 系统调用)当前 shell 及其派生的所有子进程
例如:
ulimit -n 65535
./my_server
my_server 继承了这个限制。
✅ 所以只要:
就能“生效”。
ulimit -a
/etc/security/limits.conf(PAM)Debian 默认启用 PAM:
* soft nofile 65535
* hard nofile 65535
生效条件:
pam_limits.so✅ 这是 用户级 ulimit 的主要来源
Debian 10+ 默认用 systemd
⚠️ 注意:
limits.conf对 systemd 服务不生效
必须在 service 里写:
[Service]
LimitNOFILE=65535
否则:
ulimit -n 看起来是 1024可能原因:
ssh user@debian
ulimit -n 100000
✅ 立刻生效
/etc/pam.d/common-session
包含:
session required pam_limits.so
systemctl start xxx| 场景 | 是否生效 |
|---|---|
| ssh 登录后手动执行 | ✅ |
| limits.conf | ✅(非 systemd) |
| systemd 服务 | ❌(需 LimitXXX) |
| docker 容器 | ❌(需 --ulimit) |
| 已运行进程 | ❌(不能改) |
Debian 上 ulimit 能生效,是因为 Linux 的 rlimit 机制 + Debian 默认 PAM / shell 配置支持;但 systemd 服务必须用
Limit*才真正生效。
如果你能说清楚:
我可以给你更精确的“为什么生效 / 不生效”分析。