直接在 systemd 单元配置中设置 memorymax 参数是最标准可靠的方式,通过 systemctl edit 创建覆盖配置、重载重启服务并验证生效,需确保 cgroup v2 及 memory controller 已启用。

直接在服务的 systemd 单元配置里加 MemoryMax 参数即可,这是最标准、最可靠的方式。
一、用 systemctl edit 创建覆盖配置
不修改原始 unit 文件,避免被包管理器覆盖:
- 运行 sudo systemctl edit your-service-name.service(把 your-service-name 换成你的服务名,如 myapp.service)
- 在打开的编辑器中输入:
[Service] MemoryMax=1G
支持单位:K、M、G、B(大小写不敏感),例如 512M、2G、1024K
二、重载并重启服务
保存退出后执行:
- sudo systemctl daemon-reload —— 重新加载所有 unit 配置
- sudo systemctl restart your-service-name.service —— 重启服务使限制生效
三、验证是否生效
检查配置是否被读取:
- systemctl show your-service-name.service | grep MemoryMax → 应输出 MemoryMax=1073741824(即 1G 的字节数)
- 查看 cgroup 实际值:cat /sys/fs/cgroup/memory/system.slice/your-service-name.service/memory.max → 同样应返回对应字节数
注意:该限制是硬上限,超限后内核会触发 OOM killer 杀掉整个服务进程,不是仅拒绝新请求。
四、关键前提与注意事项
- 系统必须启用 cgroup v2 且 memory controller 已激活(检查 cat /proc/cgroups | grep memory,enabled 列为 1)
- MemoryMax 是针对整个 service 进程组的总内存,不是每个 worker 或子进程单独限制
- 若服务启动方式为 Type=forking(如传统守护进程),确保主进程 PID 被正确识别,否则限制可能未作用到实际工作进程上
- 建议搭配 MemoryHigh 使用(如 MemoryHigh=800M),可在接近上限时触发内核主动回收页缓存,减少突兀 OOM











