默认情况下,runc 会自行创建 cgroup 并设置 cgroup 限制(称为 fs cgroup 驱动程序).
当给出 -systemd-cgroup全局选项时
(如 runc --systemd-cgroup run ...),runc 将切换到 systemd cgroup 驱动程序。
本文档将介绍其特性和特殊性。
systemd 单元名称和占位符
创建容器时,runc 会请求 systemd(通过 dbus)为容器创建一个瞬时单元,并将其放置在指定的片段(slice)中。单元和所含片段的名称从容器的 运行时规范中得出:
-
如果设置了
Linux.CgroupsPath,则其形式应为[slice]:[prefix]:[name]。 这里的slice是容器所在的 systemd slice。 如果使用了 cgroup v2 并创建了rootless容器,为user.slice。其他情况下就默认为system.slice请注意,
slice可以包含破折号来表示子片段 (例如,"user-1000.slice "是一个正确的符号,表示 "user.slice "的子片。 ),但不能包含斜线(例如user.slice/user-1000.slice无效)。-slice代表根切片。接下来,"prefix"和 "name"被用来组成单元名称,即 是
<前缀>-<名称>.scope,除非name有后缀.slice,在这种情况下,prefix在这种情况下,prefix将被忽略,name则按原样使用。 -
如果
Linux.CgroupsPath未设置或为空,其工作方式等同于设置为:runc:<container-id>。请参阅上面的说明,了解它将转换成什么。
如上所述,创建的单元可以是一个 scope 或一个 slice。 对于scope,runc 通过 Slice= systemd 属性指定其父切片、 并设置 Delegate=true。对于slice,runc 会通过_Wants_属性指定对父分片的弱依赖关系。
资源限制
无论设置了任何限制,runc 始终会启用所有控制器的会计功能。 这意味着它会无条件地为systemd单元创建如下属性:
- CPUAccounting=true
- IOAccounting=true (对于 cgroup v1,为 BlockIOAccounting)
- MemoryAccounting=true
- TasksAccounting=true
runc 通过将运行时规范资源转换为 systemd 单位资源,来设置 systemd 单位的资源限制。
这种转换并不完全,因为有些 cgroup 属性 无法通过 systemd 设置。 因此,runc systemd cgroup 驱动程序是 由 fs 驱动程序支持(换句话说,cgroup 限制首先转换为 systemd 单元属性,然后再写入 cgroupfs 文件)。
由 runc 转换为 systemd 单位属性的运行时规范资源集取决于内核 cgroup 版本(v1 或 v2),以及所运行的 systemd 版本。如果使用较旧的 systemd 版本(不支持某些资源),runc 不会设置这些资源。
下表概述了哪些属性需要翻译。
cgroup v1
| runtime spec 资源 | systemd 属性名称 | systemd最低版本 |
|---|---|---|
| memory.limit | MemoryLimit | |
| cpu.shares | CPUShares | |
| blockIO.weight | BlockIOWeight | |
| pids.limit | TasksMax | |
| cpu.cpus | AllowedCPUs | v244 |
| cpu.mems | AllowedMemoryNodes | v244 |
cgroup v2
| runtime spec 资源 | systemd 属性名称 | systemd最低版本 |
|---|---|---|
| memory.limit | MemoryMax | |
| memory.reservation | MemoryLow | |
| memory.swap | MemorySwapMax | |
| cpu.shares | CPUWeight | |
| pids.limit | TasksMax | |
| cpu.cpus | AllowedCPUs | v244 |
| cpu.mems | AllowedMemoryNodes | v244 |
| unified.cpu.max | CPUQuota, CPUQuotaPeriodSec | v242 |
| unified.cpu.weight | CPUWeight | |
| unified.cpu.idle | CPUWeight | v252 |
| unified.cpuset.cpus | AllowedCPUs | v244 |
| unified.cpuset.mems | AllowedMemoryNodes | v244 |
| unified.memory.high | MemoryHigh | |
| unified.memory.low | MemoryLow | |
| unified.memory.min | MemoryMin | |
| unified.memory.max | MemoryMax | |
| unified.memory.swap.max | MemorySwapMax | |
| unified.pids.max | TasksMax |
有关 systemd 单元资源属性的文档,请参阅 systemd.resource-control(5)` 手册页面。
辅助属性
systemd 单元的辅助属性(如创建容器后通过 systemctl show <unit-name>显示)可以添加注释到容器运行时规范 (config.json)来设置(或覆盖)。
示例:
"annotations": {
"org.systemd.property.TimeoutStopUSec": "uint64 123456789",
"org.systemd.property.CollectMode":"'inactive-or-failed'"
},
上述操作将设置以下属性:
TimeoutStopSec为 2 分 3 秒;CollectMode为 "inactive-or-failed"。
这些值必须是 gvariant 文本格式,详见 gvariant 文档 中所述。
要想知道 systemd 期望某个参数使用哪种类型,请 查阅 systemd 资料。