在 Debian 里,“ulimit 内存限制”一般分临时生效和永久生效两种改法,而且还要看你是想限制虚拟内存 / 驻留内存 / 栈,还是系统级 cgroup。
下面按常见场景说明。
直接用 ulimit 命令:
ulimit -v 1048576 # 虚拟内存限制(KB),约 1G
ulimit -m 524288 # 常驻内存(很多系统实际不生效)
ulimit -s 8192 # 栈大小(KB)
ulimit -a # 查看当前所有限制
⚠️ 注意:
-v 是最常用的“内存限制”/etc/security/limits.confsudo vim /etc/security/limits.conf
示例(限制用户 appuser):
appuser soft as 1048576
appuser hard as 2097152
说明:
as = address space(虚拟内存,单位 KB)soft = 当前限制hard = 上限@group 限制用户组⚠️ 必须满足条件:
pam_limits.so检查:
grep pam_limits /etc/pam.d/common-session
一般 Debian 默认是启用的。
如果你是通过 systemd 服务运行的程序,limits.conf 不生效。
要在 service 文件里加:
[Service]
LimitAS=1G
LimitRSS=512M
LimitSTACK=16M
然后:
sudo systemctl daemon-reexec
sudo systemctl restart your-service
/etc/sysctl.conf(内核级,不是 ulimit)sudo vim /etc/sysctl.conf
例如:
vm.overcommit_memory=2
vm.overcommit_ratio=80
sudo sysctl -p
⚠️ 这是内存分配策略,不是 ulimit,但会影响 OOM。
如果是容器:
docker run -m 512m --memory-swap=512m ...
K8s:
resources:
limits:
memory: 512Mi
| 场景 | 正确方式 |
|---|---|
| 普通 SSH 登录用户 | limits.conf |
| systemd 服务 | service 文件 |
| Docker | -m |
| crontab 任务 | 在脚本里加 ulimit |
| 想限制“真实物理内存” | 基本只能 cgroup |
如果你能说清楚:
我可以直接给你一份可复制的配置。