在 Debian(以及大多数 Linux 发行版)中,ulimit 本身不能直接限制进程占用内存的总量(如 RSS 或虚拟内存上限的精细控制),它主要限制的是:
-v)-f)-u)-n)-c)下面分场景说明 Debian 下如何设置内存相关的 ulimit。
ulimit -v 1048576 # 限制虚拟内存为 1GB(单位 KB)
查看当前限制:
ulimit -a
⚠️ 注意:
-v是 虚拟内存(VSZ),不是物理内存(RSS)
很多程序会因 VSZ 过大直接无法启动
/etc/security/limits.confsudo vim /etc/security/limits.conf
示例(限制用户 appuser):
appuser soft as 1048576
appuser hard as 2097152
说明:
as = address space(虚拟内存,KB)soft:警告值hard:硬限制检查:
grep pam_limits /etc/pam.d/common-session
应包含:
session required pam_limits.so
修改后 重新登录 才生效
如果你是用 systemd 管理服务,ulimit 基本没用,要用:
[Service]
MemoryMax=512M
MemoryHigh=400M
示例:
sudo systemctl edit myapp.service
[Service]
MemoryMax=512M
然后:
sudo systemctl daemon-reload
sudo systemctl restart myapp
✅ 这是 推荐方式,可限制 物理内存(RSS)
ulimit 不能精确限制 RSS,可选方案:
systemd-run --scope -p MemoryMax=512M ./myapp
docker run -m 512m myimage
❌ 用 ulimit -m 限制物理内存
✅ 实际上 -m 在大多数系统已 被忽略
| 需求 | 推荐方式 |
|---|---|
| 限制虚拟内存 | ulimit -v |
| 限制用户资源 | /etc/security/limits.conf |
| 限制服务内存 | systemd MemoryMax |
| 精确内存控制 | cgroups / Docker |
如果你能说明:
我可以给你更精确的配置示例。