runc中文翻译系列四 systemd cgroup 驱动

默认情况下,runc 会自行创建 cgroup 并设置 cgroup 限制(称为 fs cgroup 驱动程序).当给出 -systemd-cgroup全局选项时(如 runc --systemd-cgroup run ...),runc 将切换到 systemd cgroup 驱动程序。本文档将介绍其特性和特殊性。

systemd 单元名称和占位符

创建容器时,runc 会请求 systemd(通过 dbus)为容器创建一个瞬时单元,并将其放置在指定的片段(slice)中。单元和所含片段的名称从容器的
运行时规范中得出:

  1. 如果设置了 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 则按原样使用。

  1. 如果 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.limitMemoryLimit
cpu.sharesCPUShares
blockIO.weightBlockIOWeight
pids.limitTasksMax
cpu.cpusAllowedCPUsv244
cpu.memsAllowedMemoryNodesv244
cgroup v2
runtime spec 资源systemd 属性名称systemd最低版本
memory.limitMemoryMax
memory.reservationMemoryLow
memory.swapMemorySwapMax
cpu.sharesCPUWeight
pids.limitTasksMax
cpu.cpusAllowedCPUsv244
cpu.memsAllowedMemoryNodesv244
unified.cpu.maxCPUQuota, CPUQuotaPeriodSecv242
unified.cpu.weightCPUWeight
unified.cpu.idleCPUWeightv252
unified.cpuset.cpusAllowedCPUsv244
unified.cpuset.memsAllowedMemoryNodesv244
unified.memory.highMemoryHigh
unified.memory.lowMemoryLow
unified.memory.minMemoryMin
unified.memory.maxMemoryMax
unified.memory.swap.maxMemorySwapMax
unified.pids.maxTasksMax

有关 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 资料。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值