温馨提示×

debian ulimit内存限制在哪改

小樊
45
2026-09-03 20:24:17
栏目: 智能运维

在 Debian 里,“ulimit 内存限制”一般分临时生效永久生效两种改法,而且还要看你是想限制虚拟内存 / 驻留内存 / 栈,还是系统级 cgroup

下面按常见场景说明。


一、临时修改(当前 shell / 进程)

直接用 ulimit 命令:

ulimit -v 1048576      # 虚拟内存限制(KB),约 1G
ulimit -m 524288       # 常驻内存(很多系统实际不生效)
ulimit -s 8192         # 栈大小(KB)
ulimit -a              # 查看当前所有限制

⚠️ 注意:

  • -v 是最常用的“内存限制”
  • 只对当前 shell 及其子进程有效
  • 非 root 只能调小,不能调大

二、永久修改(用户级,推荐)

1️⃣ 通过 /etc/security/limits.conf

sudo vim /etc/security/limits.conf

示例(限制用户 appuser):

appuser soft as 1048576
appuser hard as 2097152

说明:

  • as = address space(虚拟内存,单位 KB)
  • soft = 当前限制
  • hard = 上限
  • 也可用 @group 限制用户组

⚠️ 必须满足条件:

  • 使用 PAM
  • 登录方式启用了 pam_limits.so

检查:

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

一般 Debian 默认是启用的。


2️⃣ systemd 用户(重要!)

如果你是通过 systemd 服务运行的程序,limits.conf 不生效

要在 service 文件里加:

[Service]
LimitAS=1G
LimitRSS=512M
LimitSTACK=16M

然后:

sudo systemctl daemon-reexec
sudo systemctl restart your-service

三、系统级(所有用户)

1️⃣ /etc/sysctl.conf(内核级,不是 ulimit)

sudo vim /etc/sysctl.conf

例如:

vm.overcommit_memory=2
vm.overcommit_ratio=80
sudo sysctl -p

⚠️ 这是内存分配策略,不是 ulimit,但会影响 OOM。


四、容器 / cgroup(Docker / Kubernetes)

如果是容器:

docker run -m 512m --memory-swap=512m ...

K8s:

resources:
  limits:
    memory: 512Mi

五、常见坑总结

场景 正确方式
普通 SSH 登录用户 limits.conf
systemd 服务 service 文件
Docker -m
crontab 任务 在脚本里加 ulimit
想限制“真实物理内存” 基本只能 cgroup

如果你能说清楚:

  • 限制 哪个用户 / 服务
  • 限制 虚拟内存还是物理内存
  • 是不是 systemd / Docker

我可以直接给你一份可复制的配置。

0