systemd 资源控制
systemd 通过资源控制指令在单元级别限制资源:CPUQuota 限 CPU 带宽、CPUWeight 设相对权重、AllowedCPUs 限定可用核、TasksMax 限制任务数、MemoryMax 限制内存。systemctl set-property 修改后默认生成 drop-in 文件、重启后仍然生效,加 --runtime 则只对本次启动有效。查看实际生效值用 systemctl show 或 systemd-cgtop。systemd 的限额最终落在 cgroup 上,与内核接口是同一机制的两种表达。
基本信息
| 设置方式 | systemctl set-property 单元 指令=值 |
|---|---|
| 临时生效 | 加 --runtime 参数 |
| 查看 | systemctl show 或 systemd-cgtop -m |
| 常用指令 | CPUQuota、CPUWeight、AllowedCPUs、TasksMax、MemoryMax |
| 落地位置 | 对应的 cgroup 控制组文件 |
典型使用场景
- 防止单个服务打满整机 CPU
- 多服务部署时按重要性分配份额
- 限制单元任务数,避免线程泄漏拖垮机器
- 与容器编排的限额配合规划
- 排查「设置了但看着没生效」的问题
设置与核对
设置与核对
systemctl set-property mysqld.service CPUQuota=200%
systemctl set-property mysqld.service CPUWeight=200
systemctl set-property mysqld.service TasksMax=4096
systemctl set-property --runtime mysqld.service CPUQuota=50% # 仅本次启动有效
systemctl show mysqld.service -p CPUQuotaPerSecUSec -p CPUWeight
systemd-cgtop -m # 各控制组实时资源占用
systemctl cat mysqld.service # 查看单元文件与已生成的 drop-in常用指令读法
| 指令 | 含义 | 注意 |
|---|---|---|
| CPUQuota= | CPU 带宽上限,200% 表示两核额度 | 按单核理解会少算一半 |
| CPUWeight= | 相对权重 | 只在竞争 CPU 时生效 |
| AllowedCPUs= | 允许使用的核集合 | 对应 cgroup 的 cpuset |
| TasksMax= | 单元内任务数上限 | 与内核 threads-max 属于不同层次 |
CPUQuota=200% 表示两核额度,按单核理解会少算一半,常见于限额设错一倍的场景。
限制只对单元内进程生效:脱离单元派生出去的进程不受约束,需要额外的隔离手段。
与内核接口的对应
- CPUQuota 落到 cgroup 的 cpu.max,内容为配额与周期两个数值
- CPUWeight 落到 cpu.weight,默认值为 100
- AllowedCPUs 落到 cpuset.cpus 与 cpuset.mems 两个文件
- TasksMax 落到 pids.max,限制单元内的任务数量
- 排查「设置没生效」时直接读对应的 cgroup 文件与 systemctl show 对照
设置未生效的排查
- 先读 systemctl show 的对应属性,确认 systemd 已接受该值
- 再读该单元对应的 cgroup 文件,确认数值确实落到内核层
- 确认单元是否需要重启才能完整生效,部分属性修改后不会立即作用
- 检查是否被更高层的 slice 限制覆盖,实际额度以更紧的一层为准