在 linux 中用 systemd 限制服务内存需启用 cgroup v2 并设 memorymax(如 512m),超限即被 oom killer 终止;推荐通过 systemctl edit 配置,配合 memoryhigh(如 384m)缓释压力,并用 systemctl show 或 systemd-cgtop 验证。

在 Linux 系统中,用 systemd 限制单个服务的最大内存,核心是通过 MemoryMax 参数配合 cgroup v2 内存控制器实现。它不是“限流”或“警告”,而是硬性上限——超限后进程会被内核 OOM Killer 立即终止。
确认系统支持 cgroup v2 内存控制
这是前提,否则所有内存限制参数都不生效:
- 运行
cat /proc/cgroups | grep memory,确保enabled列为 1 - 运行
mount | grep cgroup,确认有type cgroup2挂载项 - 若不满足,需在内核启动参数中添加
systemd.unified_cgroup_hierarchy=1并重启
为服务配置 MemoryMax(推荐方式)
不要直接修改原始 unit 文件(如 /usr/lib/systemd/system/nginx.service),避免被包管理器覆盖:
- 执行
sudo systemctl edit nginx.service(把nginx.service换成你要限制的服务名) - 填入以下内容(示例限制为 512MB):
[Service]
MemoryAccounting=yes
MemoryMax=512M - 保存后执行:
sudo systemctl daemon-reloadsudo systemctl restart nginx.service
可选:搭配 MemoryHigh 实现缓冲机制
MemoryHigh 不会杀死进程,但会在接近阈值时触发内核主动回收页缓存、减缓内存分配,降低突兀中断风险:
- 在相同 override 配置中追加一行:
MemoryHigh=384M - 建议设为
MemoryMax的 70%–80%,例如MemoryMax=512M对应MemoryHigh=384M - 注意:
MemoryAccounting=yes必须启用,MemoryHigh才有效
验证是否生效
三种快速检查方法:
-
systemctl show nginx.service | grep -E "Memory(High|Max|Current)"—— 查看配置值与当前用量 -
cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max—— 直接读取 cgroup 设置(单位字节) -
systemd-cgtop -m | grep nginx—— 实时查看 RSS 占用(按m切换内存视图)











