启用 MemoryAccounting=yes 后,MemoryHigh 和 MemoryMax 才生效;需确认 cgroup v2 内存控制器已启用(/proc/cgroups 中 memory enabled 为 1,mount 显示 cgroup2);通过 systemctl edit 创建覆盖配置设置限制值;MemoryMax 是硬上限,超限即被 OOM Killer 终止,MemoryHigh 提供缓冲回收机制。

直接在 systemd 服务配置里加 MemoryMax 和 MemoryHigh 就能限制内存占用,关键是要配对启用 MemoryAccounting=yes,否则限制不生效。
确认系统支持 cgroup v2 内存控制器
这是前提。运行以下命令检查:
-
cat /proc/cgroups | grep memory—— 确保enabled列为1 -
mount | grep cgroup—— 应看到挂载类型为cgroup2
如果没启用,需在内核启动参数中加入 systemd.unified_cgroup_hierarchy=1 并重启。
设置服务级内存限制(推荐方式)
不要直接改原始 unit 文件,用 systemctl edit 创建覆盖配置:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 执行
sudo systemctl edit rsyslog.service(把rsyslog换成你要限制的服务名) - 填入以下内容:
MemoryAccounting=yes
MemoryHigh=16M
MemoryMax=64M
保存后执行:sudo systemctl daemon-reload && sudo systemctl restart rsyslog.service
验证限制是否生效
三种快速验证方法:
-
systemctl show rsyslog.service | grep -E "Memory(High|Max|Current)"—— 查看配置值和当前用量 -
cat /sys/fs/cgroup/memory/system.slice/rsyslog.service/memory.max—— 直接读 cgroup 值(单位字节) -
systemd-cgtop -m | grep rsyslog—— 实时监控 RSS 占用
注意硬限制的触发行为
MemoryMax 是硬上限,一旦突破会立刻被内核 OOM Killer 终止进程,不会限流或降级。所以:
- 建议先观察服务常态内存(如
watch -n 1 'ps -o pid,rss,comm -C rsyslogd'),再设上限,留出 2–3 倍余量 - MemoryHigh 可作为缓冲:超限时系统会主动回收页缓存、减缓分配,避免突兀中断
- 多进程服务(如 nginx)的 MemoryMax 是所有 worker 进程共享的总上限,不是单个进程限额

















