linux中配置systemd服务资源限制需区分层级:单服务用limitnofile=65535:65535等参数设软硬限,memorymax=1g为内存硬上限,limitnproc与cpuquota控进程和cpu,全局默认值通过defaultlimit*在system.conf中配置。

Linux 中配置 systemd 服务的资源限制,关键在于区分“软限制”和“硬限制”的实际含义——systemd 本身不使用 ulimit 那套软/硬概念,而是通过 Limit* 参数直接设置生效值(等效于 ulimit 的软限制),并由内核或 cgroup 强制执行(等效于硬限制边界)。真正需要分层控制的,是整个系统的资源管控链条:从内核参数、systemd 全局默认、服务单元级覆盖,到进程运行时行为。
以下是最常用且必须掌握的几类配置方式:
直接为单个服务设文件描述符上限(最常见场景)
这是 Web 服务器(如 Nginx)、数据库(如 Redis)等高并发服务的刚需。
systemd 不读 /etc/security/limits.conf,必须在服务单元中显式声明:
-
运行命令创建覆盖配置:
sudo systemctl edit nginx.service
-
输入内容(支持软硬分离写法):
[Service] LimitNOFILE=65535:65535
前一个数是软限制(当前生效值),后一个是硬限制(最大允许值)。若只写
LimitNOFILE=65535,则软硬值相同。 -
生效步骤:
sudo systemctl daemon-reloadsudo systemctl restart nginx.service
-
验证是否加载:
systemctl show nginx.service | grep LimitNOFILE # 或查看运行中进程的实际限制 cat /proc/$(pgrep -f "nginx: master")/limits | grep "Max open files"
为服务设内存硬上限(防 OOM 杀死)
适用于内存敏感型服务,比如 Java 应用或长期运行的后台任务:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
-
编辑服务:
sudo systemctl edit redis-server.service
-
添加:
[Service] MemoryMax=1G
注意:
MemoryMax是强制硬限,超限会触发 OOM killer 终止进程,不是限流或降级。 同样需 reload + restart,并确认 cgroup v2 已启用(
cat /proc/cgroups | grep memory第四列应为1)。
控制进程数与 CPU 使用率
防止服务 fork 过多子进程或持续霸占 CPU:
- 在
override.conf中可加:[Service] LimitNPROC=4096 CPUQuota=50%
LimitNPROC限制该服务所有进程线程总数;CPUQuota=50%表示最多占用半个 CPU 核心的等价时间(按 100% 为一整核计)。
全局默认值(影响所有未显式覆盖的服务)
若多数服务都需要统一 baseline,可在系统级配置:
- 编辑主配置:
sudo systemctl edit --system
- 写入:
[Manager] DefaultLimitNOFILE=65535:65535 DefaultLimitNPROC=4096:4096
- 执行:
sudo systemctl daemon-reload sudo systemctl daemon-reexec # 重启 systemd manager 本身(谨慎操作,生产环境建议安排维护窗口)
不复杂但容易忽略










