在 Debian(以及大多数 Linux 发行版)中,ulimit 与内存的关系主要体现在 进程级别 的资源限制上,尤其是 虚拟内存(virtual memory) 和 常驻内存(RSS) 的限制。下面从概念、ulimit 参数、实际影响、常见误区几个方面说明。
ulimit 是 shell 内置命令,用于设置或查看 当前 shell 及其子进程 的资源限制。
ulimit -a
这些限制是 进程级 的,不是系统级。
ulimit -v
示例:
ulimit -v 1048576 # 限制为 1GB 虚拟内存
⚠️ 注意:
虚拟内存 ≠ 物理内存
ulimit -m
✅ 不建议依赖 -m 来限制内存使用
ulimit -s
示例:
ulimit -s unlimited
ulimit -u
| 项目 | ulimit | 实际内存 |
|---|---|---|
| 限制对象 | 单个进程 | 整个系统 |
| 虚拟内存 | ✅ 有效 | ❌ 不直接 |
| 物理内存 | ❌ 基本无效 | ✅ |
| 栈 | ✅ | ✅ |
| 进程数 | ✅ | ✅ |
✅ Linux 不靠 ulimit 限制物理内存
Linux 内存管理特点:
因此:
-v 限制的是“地址空间”-m 基本形同虚设ulimit -v 2097152
只对当前 shell 和子进程有效。
/etc/security/limits.conf
示例:
* soft as 2097152
* hard as 2097152
说明:
as = address space(虚拟内存)pam_limits.so 支持systemd 忽略 ulimit,应使用:
[Service]
MemoryMax=1G
LimitAS=2G
MemoryMax=1G
systemctl set-property my.service MemoryMax=1G
❌ ulimit -m 能限制物理内存
✅ 实际无效
❌ ulimit 限制整个系统内存
✅ 只限制进程
❌ 虚拟内存限制 = 物理内存限制
✅ 完全不同
在 Debian 中,ulimit 主要通过
-v限制进程的虚拟内存,对物理内存限制能力非常有限;真正控制内存使用应依赖 systemd / cgroup。
如果你愿意,我可以:
ulimit vs cgroup 的实际效果