systemd服务资源限制需在unit文件中显式配置cgroups参数:limitnofile限制文件描述符、memorymax设内存硬上限、cpuquota控cpu使用率、tasksmax防fork炸弹;应通过systemctl edit创建override.conf覆盖,再daemon-reload生效,并用systemctl show和/proc/、/sys/fs/cgroup验证。

在 systemd 服务中配置资源限制,核心是通过 service 单元文件 显式声明控制参数,避免单个服务耗尽 CPU、内存或文件描述符导致系统卡死甚至宕机。这不是靠 ulimit 或 limits.conf 生效,而是基于 cgroups 的硬性隔离。
关键限制参数与作用
以下是最常用且对防宕机最有效的几项:
- LimitNOFILE=65536:限制服务可打开的文件描述符总数。缺省常为 1024,高并发服务(如 Nginx、MySQL)极易触发 “Too many open files” 错误并中断连接
- MemoryMax=512M:设置内存硬上限。超限时内核会直接 OOM kill 该服务进程,而非拖垮整个系统
- CPUQuota=75%:限制服务最多使用 75% 的单核等效 CPU 时间,防止 CPU 持续 100% 占用影响其他关键进程(如 SSH、监控 agent)
- TasksMax=200:限制最大进程/线程数,防御 fork 炸弹类异常行为
正确配置步骤(以 nginx.service 为例)
不建议直接改原始 unit 文件(会被包更新覆盖),应使用覆盖机制:
- 运行 sudo systemctl edit nginx.service,自动创建
/etc/systemd/system/nginx.service.d/override.conf - 写入如下内容(按需调整数值):
[Service]<br> LimitNOFILE=65536<br> MemoryMax=512M<br> CPUQuota=75%<br> TasksMax=200
- 执行 sudo systemctl daemon-reload && sudo systemctl restart nginx.service
验证是否真正生效
仅看配置文件不等于生效,必须检查运行时状态:
- 查 systemd 层面: systemctl show nginx.service | grep -E "(MemoryMax|CPUQuota|LimitNOFILE)"
- 查 cgroup 实际值: cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max(返回数字如 536870912 = 512MB)
- 查文件描述符限制: cat /proc/$(pgrep -f "nginx: master")/limits | grep "Max open files"
全局默认限制(适用于所有服务)
若多数服务都需要基础防护,可在 systemd 全局层面设兜底值:
- 编辑 /etc/systemd/system.conf
- 取消注释并修改:
DefaultLimitNOFILE=65536<br> DefaultMemoryMax=1G<br> DefaultCPUQuota=90%
- 执行 sudo systemctl daemon-reexec && sudo systemctl daemon-reload











