首页/系统/Linux 运维命令速查/systemd 资源限制(LimitNOFILE 等)
systemd 与服务42 条

systemd 资源限制(LimitNOFILE 等)

服务级资源限制都在单元里声明:LimitNOFILE、LimitNPROC、MemoryMax、CPUQuota;systemd 服务不吃 limits.conf,别配错地方。

Linux 运维命令速查系统更新于 2026-10-13

资源限制是什么

由 systemd 拉起的服务,资源限制写在单元文件的 [Service] 段,而不是 /etc/security/limits.conf——后者只对登录会话(PAM 体系)生效,对 systemd 服务不起作用。这里有两类机制:LimitNOFILE、LimitNPROC 这类是进程 rlimit,由内核在 fork 时设定;MemoryMax、CPUQuota、TasksMax 属于 cgroup 控制器,按控制组整体计量与强制。

基本信息

用途限制或放开单个服务的文件描述符、进程数、内存与 CPU
语法在 [Service] 段写 Limit* / Memory* / CPU* / Tasks* 指令
所属systemd(systemd.exec 与 systemd.resource-control 定义)
生效方式daemon-reload 后 restart 服务;cgroup 类限制对已在运行的进程需重启才生效

典型使用场景

  • 高并发服务报 Too many open files:把 LimitNOFILE 调大,这是最常见的调整
  • 防单服务吃满内存:给服务设 MemoryMax,避免拖垮整台机器
  • 限制 CPU 争抢:给次要服务设 CPUQuota,保证关键业务有算力
  • 限制进程数:防止 fork 泄漏把进程表耗尽,用 TasksMax 封顶
  • 排查 OOM 原因:确认是 cgroup 内存上限触发还是整机内存不足

常用限制示例

常用限制示例
[Service]
LimitNOFILE=65535        # 单进程可打开的文件描述符上限
LimitNPROC=4096          # 该服务的进程/线程数上限
MemoryHigh=1800M         # 软限制:超过后内核回收更积极
MemoryMax=2G             # 硬限制:超过即触发 OOM 处理
CPUQuota=200%            # 最多用满两个核
TasksMax=512             # 控制组内任务数上限

验证生效情况

验证生效情况
systemctl show myapp -p LimitNOFILE -p MemoryMax -p TasksMax
cat /proc/$(systemctl show -p MainPID --value myapp)/limits | grep -i 'open files'
systemd-cgls --no-pager -u myapp | head            # 看控制组里有哪些进程
cat /sys/fs/cgroup/system.slice/myapp.service/memory.events 2>/dev/null   # 看 oom 计数

常用指令对照

指令约束对象说明
LimitNOFILE进程 rlimit文件描述符上限,高并发服务常需调大
LimitNPROC进程 rlimit该用户的进程总数上限,注意是用户级口径
LimitCORE进程 rlimit核心转储大小,排查崩溃时可能需临时放开
MemoryHigh / MemoryMaxcgroup 内存软限制引发回收,硬限制触发 OOM 处置
CPUQuotacgroup CPU按百分比配额,200% 表示两个核的算力
TasksMaxcgroup pids控制组内任务数上限,防 fork 炸弹
LimitNOFILE 有继承关系:单元没写时用 Manager 的 DefaultLimitNOFILE。只调 systemd 这一层还不够,应用自身的连接池与文件上限配置也要同步调整,否则瓶颈只是换了个地方。
MemoryMax 设得过小时,服务会被周期性杀死,而 journal 里往往只有一条简短的 OOM 记录,很容易被误判成应用崩溃。调小上限后要留意 cgroup 的 oom 计数。

易错点

  • 把限制写在 /etc/security/limits.conf 里指望对 systemd 服务生效:该文件只影响登录会话,服务必须写进单元配置
  • 只调 systemd 层不调应用层:数据库或 JVM 自带的句柄上限没变,问题会以另一种形式复现
  • 调小 MemoryMax 后不做回归测试,服务在内存高峰被 OOM-kill,表现为周期性重启而日志线索很少
  • 误以为 cgroup 限制对已在运行的进程即时生效:改动需要重启服务,仅 daemon-reload 只更新配置不重设控制组

数据来源与参考

  • man 5 systemd.resource-control
  • man 5 systemd.exec(Limit*)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌