精读笔记(RHCA 英文教材)· RH442 Chapter 5 Managing Resource Limits with Control Groups
大约 5 分钟
精读笔记(RHCA 英文教材)· RH442 Chapter 5 Managing Resource Limits with Control Groups
教材原文:RHCA 官方英文教材(PDF 第 172~194 页)(OCR 整书版已从本站移除,本页为章节精读) 关联中文笔记:
02-09-性能调优RH442(RHCA).md(内存/cgroups 资源限制);本章=资源限制三层次:ulimit/PAM → systemd 资源控制 → cgroups(含 v2 预览)。 结构:2 个 Section(5.1 管理资源限制+GE cgroups-limits;5.2 定制 cgroups+GE cgroups-customize)+ Lab(lab: cgroups-review)。
Chapter Goal / Objectives(原文+译)
- GOAL: Manage resource contention in a multitasking environment.(管理多任务环境中的资源争用。)
- OBJECTIVES: ① 为单个/成组服务、应用与用户配资源设置控制共享;② 用自订 cgroups slice 精细管理。
5.1 Managing Resource Limits(ulimit → systemd → cgroups)
ulimit / PAM(登录级)
- ulimit:BASH 内建,限制 shell 及其子进程资源(系统级、登录会话时由 PAM 强制)。对防失控进程够用,但对"资源争用"不够(无权重/无按组区分)。
- 持久 ulimit:
pam_limits模块(/etc/pam.d/system-auth 会话里调用)在登录时解析/etc/security/limits.conf与/etc/security/limits.d/*.conf。语法见 limits.conf(5)。例:限制 managers 组最多 3 个并发登录 → limits.d/managers.conf 写@managers - maxlogins 3。
systemd 资源控制(服务级,推荐)
- unit 属性:
CPUQuota=(百分比,25%=最多 1 核 25% 时间;>100% 可跨多核)、MemoryLimit=(硬限,OOM 动作)、BlockIO*(读写权重/每设备最大读写)等(完整 Limit*/属性见 systemd.exec(5)/systemd.resource-control(5))。 - drop-in 不直接改 /usr/lib/systemd(包升级覆盖):在
/etc/systemd/system/<unit>.service.d/*.conf覆盖。例example.service.d/io-cpulimits.conf写[Service] LimitCPU=30;改后systemctl daemon-reload+ 重启服务。
cgroups 基础
- cgroups(control groups):内核细粒度资源控制机制。资源放进控制器(controller):cpu(CPU 时间)、memory、blkio(磁盘 I/O)…;控制器可分层成树(slice→cgroup),每个 cgroup 绑 0+ 进程;默认均分、可按权重/限额。
- systemd 三大顶层 slice:
system.slice(systemd 起的服务默认子组)、user.slice(每登录用户一个子 slice、每会话再子分)、machine.slice(libvirt VM 与 Linux 容器;第一台 VM 启动才建)。 - 查看/运行:
systemd-cgtop:top 式 cgroup 概览(默认只报任务数,除非该 slice 开了 CPU/内存/I/O 记账——给服务开可能连带同 slice 其他服务)。systemd-cgls:树形列 slice/cgroup/进程;可带路径只看局部。systemd-run --slice=example.slice sleep 100:把交互命令放进指定 slice 跑(默认 system.slice 下 run-XXXX 单元)。
5.1 GE(lab: cgroups-limits)
给某服务(如 httpd)加 systemd drop-in 限制(MemoryAccounting=yes、MemoryLimit=128M 等)→ daemon-reload + restart → systemd-cgtop/systemd-cgls 验证限额生效;对比 ulimit 与会话级限制。
5.2 Customizing Control Groups
- 自订 slice 文件:
/etc/systemd/system/example.slice:
[Unit]
Description=Example Custom slice
[Slice]
CPUShares=2048
MemoryAccounting=true- 子 slice 命名:要成为 system.slice 的子 slice 必须命名为
system-<名>.slice;多级嵌套system-a-b-c-d.slice会自动补建各级(system-a.slice、system-a-b.slice…)。⚠️ slice 直到有服务/进程分配进去才会实例化。 - 改完新 unit/drop-in 后
systemctl daemon-reload,服务改动一般还要重启。 - cgroups v2(RHEL8 技术预览):
- v1:控制器各自挂载独立层级,同一 cgroup(如 web)在 memory、blkio 各控制器层级里重复出现;限制文件如 memory.limit_in_bytes、blkio.throttle.write_bps_device、pids.max。
- v2:单一统一层级,cgroup 先创建、再经
cgroup.subtree_control把控制器加进来(web/dbase 只出现一次);改名:v1 cpu.shares→v2 cpu.weight、MemoryLimit→memory.max、BlockIOWeight→io.weight(io.max="wbps=1MiB/s")。 - ⚠️ v1/v2 同时挂载不支持/不推荐;启用 v2 需加内核引导参数(systemd.unified_cgroup_hierarchy 等)。
5.2 GE(lab: cgroups-customize)
serverb:建自订 slice(如 web/slice 与 db 子 slice、CPUShares 分配)、把服务或 systemd-run 进程放进去、用 cgtop/cgls 验证 CPU/内存按权重分配与限额生效。
Lab 概要(lab: cgroups-review)
serverb:为指定服务建 drop-in(CPU/Memory 限制与记账)、建/嵌套自订 slice、systemd-run 放进程、观察 systemd-cgtop 输出验证 → lab grade cgroups-review。
命令速查表
| 用途 | 命令/文件 |
|---|---|
| 会话级限制 | /etc/security/limits.conf、/etc/security/limits.d/*.conf(pam_limits) |
| 服务级限制 | /etc/systemd/system/<u>.service.d/*.conf:[Service] CPUQuota=25% / MemoryLimit=128M / LimitCPU=30 |
| 重载/重启 | systemctl daemon-reload;systemctl restart <u> |
| 查看 cgroup | systemd-cgtop;systemd-cgls [路径] |
| 放进 slice 跑 | systemd-run --slice=<name>.slice <命令> |
| 自订 slice | /etc/systemd/system/<name>.slice:[Slice] CPUShares=2048 / MemoryAccounting=true |
| 子 slice | 命名 parent-child.slice(如 system-flops.slice),多级自动建 |
| 实验/评分 | lab start cgroups-limits|cgroups-customize|cgroups-review;lab grade cgroups-review |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| ulimit / PAM | 会话级限制 | pam_limits 读 limits.conf |
| drop-in | 覆盖片段 | /etc/systemd/system/<u>.d/*.conf |
| CPUQuota / MemoryLimit | CPU 配额/内存硬限 | systemd unit 属性 |
| cgroup / controller | 控制组/控制器 | cpu、memory、blkio、pids |
| slice | 切片 | system/user/machine.slice 顶层 |
| systemd-cgtop / -cgls | cgroup 查看 | top 式/树形式 |
| systemd-run --slice | 跑进 slice | 临时命令入组 |
| CPUShares | CPU 份额 | 相对权重 |
| cgroups v1 | 多层级 | 每控制器一层,组重复 |
| cgroups v2 | 统一层级 | cgroup.subtree_control 加控制器 |
| cpu.weight / memory.max / io.weight | v2 新名 | 替代 shares/limit/BlockIOWeight |
自测 10 题
- ulimit 局限是什么?(防失控够用,不能处理资源争用/无分组权重)
- pam_limits 读哪些文件?(/etc/security/limits.conf + limits.d/*.conf,登录时)
- systemd 服务限制为什么用 drop-in?(别改 /usr/lib/systemd,包更新覆盖)
- 顶层三大 slice?(system.slice/user.slice/machine.slice;machine=VM+容器)
- systemd-cgtop 看不到 CPU/内存数据可能为什么?(没开记账,如 MemoryAccounting=yes)
- 怎么把命令临时放进某 slice?(systemd-run --slice=<名>.slice <cmd>)
- 子 slice 命名规则?(parent-child.slice;system-flops.slice 是 system.slice 的子级)
- slice 何时实例化?(有服务/进程分配进去时)
- cgroups v2 相对 v1 最大变化?(单一路径+subtree_control 统一层级)
- v2 中 cpu.shares/memory.limit/blkio 换成什么?(cpu.weight/memory.max/io.weight)
