systemd 服务单元可通过 CPUQuota 和 MemoryMax 直接限制 CPU 与内存,无需额外工具;CPUQuota=40% 表示每 100ms 最多用 40ms,MemoryMax=768M 为硬上限,超限触发 OOM;需 cgroups v2 启用 memory controller,组合设置 TasksMax、LimitNOFILE 可增强防护。

直接通过 systemd 的服务单元配置就能限制最大内存和 CPU 占用,无需额外工具或手动操作 cgroup。核心是使用 CPUQuota 和 MemoryMax 两个参数,写入服务的覆盖配置中,重启即生效。
设置 CPU 使用上限(CPUQuota)
该参数限制服务在单位时间内最多能使用的 CPU 时间比例,基于内核 cgroups v2 的带宽控制,精准且稳定。
- 语法示例:CPUQuota=40% 表示最多占用 1 个逻辑 CPU 的 40%,即约 0.4 核;若系统有 4 核,它最多可用 1.6 核等效时间
-
操作步骤:运行 sudo systemctl edit nginx.service,在编辑器中输入:
[Service]
CPUQuota=40% - 保存后执行 sudo systemctl daemon-reload && sudo systemctl restart nginx.service
- 验证:查看 cat /sys/fs/cgroup/system.slice/nginx.service/cpu.max,应显示类似 40000 100000(每 100ms 最多用 40ms)
设置内存硬上限(MemoryMax)
这是真正的硬限制,超出后内核会触发 OOM killer 终止该服务进程,防止内存耗尽拖垮整机。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 语法示例:MemoryMax=768M 或 MemoryMax=1G,单位支持 K/M/G/B,不区分大小写
- 注意前提:系统必须启用 cgroups v2 的 memory controller(检查 cat /proc/cgroups | grep memory,enabled 列为 1)
- 操作同上:在 systemctl edit 中加入 MemoryMax=768M,重载并重启服务
- 验证:运行 systemctl show nginx.service | grep MemoryMax,或读取 cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max
组合设置多个资源限制
生产环境中建议同时约束 CPU、内存、进程数和文件描述符,形成基础防护层。
- 在同一个 systemctl edit 文件中可并列设置:
[Service]
CPUQuota=35%
MemoryMax=512M
TasksMax=64
LimitNOFILE=2048 - 这些参数互不冲突,全部由 systemd 自动映射到底层 cgroup 控制器
- TasksMax 可防 fork 炸弹类失控,LimitNOFILE 能缓解高并发连接打满句柄的问题
验证与注意事项
配置不是写完就完事,必须验证是否真正加载并起效。
- 用 systemd-cgtop 实时观察 /system.slice/nginx.service 的 CPU% 和 MEM% 列
- 模拟压力(如 ab -n 10000 -c 200 http://localhost/)后检查 journal:journalctl -u nginx -n 50 --no-pager,留意是否出现 “OOM killed” 或 “tasks limit exceeded”
- MemoryMax 是所有 worker 进程共享的总上限,不是每个 worker 独立限制
- 若服务使用模板实例(如 httpd@site1.service),需单独对其实例配置,不能只改模板

















