默认情况下,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 资料。