最常用且推荐的方式是通过 systemd 的 memorymax 参数实现,基于 cgroup v2 内存控制器,设为硬性上限,超限触发 oom killer;需用 systemctl edit 创建覆盖配置(如 memorymax=512m),再 daemon-reload 并 restart 生效。
服务管理中配置最大内存占用,最常用且推荐的方式是通过 systemd 的 memorymax 参数实现。它基于 cgroup v2 内存控制器,是硬性上限,超限后进程会被内核 oom killer 终止,能有效防止服务失控吃光内存。
用 systemctl edit 设置 MemoryMax(推荐)
这是修改单个服务(如 nginx、redis)内存限制的标准做法,不改动原始 unit 文件,避免被包管理器覆盖:
- 运行
sudo systemctl edit nginx.service(把nginx.service换成你的服务名) - 在打开的编辑器中输入:
MemoryMax=512M
- 保存退出后执行:
sudo systemctl daemon-reloadsudo systemctl restart nginx.service - 验证是否生效:
systemctl show nginx.service | grep MemoryMax
或查看 cgroup 实际值:cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max
注意单位和生效前提
MemoryMax 支持常见单位:K、M、G、B(如 1G、256M、1024K),不带单位默认为字节。
该设置依赖系统启用 cgroup v2 及 memory controller:
- 检查是否启用:
cat /proc/cgroups | grep memory,确认 enabled 列为 1 - 若未启用,需在内核启动参数中添加
systemd.unified_cgroup_hierarchy=1,并确保memory在/sys/fs/cgroup/cgroup.controllers中可见
其他可行但场景不同的方式
不是所有情况都适合用 MemoryMax,需按需求选择:
-
临时测试或脚本启动:用
systemd-run --scope -p MemoryMax=256M your-command -
全局默认限制(影响所有服务):编辑
/etc/systemd/system.conf,添加DefaultMemoryMax=256M,再执行sudo systemctl daemon-reexec -
旧版 systemd 或兼容性要求:可用
MemoryLimit=(已逐步被 MemoryMax 替代),效果类似但语义略有差异
别和 ulimit -v 混淆
ulimit -v 是 shell 级别的虚拟内存限制,只对当前会话及其子进程有效,且 systemd 启动的服务**不会继承** shell 的 ulimit 设置。想持久生效必须通过 systemd 配置或 /etc/security/limits.conf(后者仅对登录用户启动的进程有效,不适用于系统服务)。











