为 systemd 服务设资源上限须在 unit 文件中配置 limit 参数,/etc/security/limits.conf 无效;推荐用 systemctl edit 创建覆盖配置,启用 cgroup v2 memory controller 后通过 memorymax 等参数控制。

为 systemd 服务设置资源使用上限,必须在 service 单元配置中显式声明,/etc/security/limits.conf 对它完全无效。systemd 启动的服务不经过 PAM 认证流程,因此用户会话级的 ulimit 配置不会继承。正确做法是通过 systemd 的 cgroup 机制,在 unit 文件中配置对应 Limit 参数。
配置单个服务的资源限制
推荐使用 systemctl edit 创建覆盖配置,避免直接修改原始 unit 文件(易被包管理器覆盖):
- 运行
sudo systemctl edit nginx.service,自动打开/etc/systemd/system/nginx.service.d/override.conf - 写入所需限制,例如:
[Service] LimitNOFILE=65536 LimitNPROC=4096 MemoryMax=1G CPUQuota=50%
- 保存后执行:
sudo systemctl daemon-reload && sudo systemctl restart nginx.service
验证限制是否生效
配置不是写完就起作用,需主动检查:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 查看 unit 解析后的参数:
systemctl show nginx.service | grep -E "(Limit|Memory|CPU)" - 查运行时 cgroup 值(以 MemoryMax 为例):
cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max(返回字节数,如 1073741824 = 1G) - 确认进程实际受限:
cat /proc/$(pgrep -f "nginx: master")/limits | grep "Max open files"
全局或批量设置方式
若需统一约束多个服务,可考虑以下两种路径:
-
系统级默认值:编辑
/etc/systemd/system.conf,取消注释并修改如DefaultLimitNOFILE=65536,然后执行sudo systemctl daemon-reexec && sudo systemctl daemon-reload -
用户级服务(user session):对
systemctl --user启动的服务,配置文件在/etc/systemd/user.conf或/etc/systemd/user.conf.d/下
关键注意事项
几个容易踩坑的细节必须注意:
-
MemoryMax是硬限制,超限会触发 OOM killer 杀死整个 service 进程,不是限流或报错 - cgroup v2 必须启用 memory controller,检查命令:
cat /proc/cgroups | awk '$1=="memory" {print $4}',输出为1才有效 -
LimitNOFILE控制的是该服务所有进程能打开的文件描述符总数,不是每个 worker 独立计算 - 若服务类型为
Type=forking(如传统 nginx),systemd 依赖PIDFile跟踪主进程,确保其与实际一致,否则 cgroup 无法正确挂载










