跳至主要內容

Klustron 资源隔离

Klustron大约 4 分钟

Klustron 资源隔离

在多租户的环境下,资源的有效隔离是保证用户实例可用性的重要保障。本文会对 Klustron 的资源隔离机制及使用方式进行介绍

1. 工作原理

资源隔离是确保不同的用户的实例只工作在预设的资源池内,以达到不同用户实例互不影响的目标。这里说的系统资源,具体来说包括 CPU ,IO,以及物理磁盘的使用。

在 Klustron-1.1.1 版本中,实现了对 CPU 的资源隔离,IO 及物理磁盘空间的隔离会在后续版本实现。下面对 cpu 资源隔离的原理进行简要的介绍。

1.1 Cgroup 机制

Linux 对进程的资源利用,提供了 cgroup 机制来机型约束。cgroup 的全称是 control group,每一个 group 包含了一组进程及后续派生出的所有子进程。计算机内所有的资源隔离都是对 control group 进行的。

不同的 control group 间构成一个继承关系。子 group 的资源集成父 group 的资源,并在父 group 的资源上进行再分配。

Linux 提供了文件系统接口(/sys/fs/cgroup/**)用于设置 cgroup 相关设施,Klustron 也是基于这样的接口来实现实例级别的资源隔离。其中 cluster_mgr 负责接受用户资源隔离相关请求,并下发到对应的物理设备上的 node_mgr 上,由 node_mgr 调用 cgroup2kunlun 工具进行隔离参数的下发。

1.2 CPU 相关 cgroup 配置

下面对 CPU 资源隔离的关键参数进行介绍

cpu.cfs_period_us

指定 cpu 资源重置周期,单位是微妙。指定一个时间周期,每一个新的周期开始,相关 cgroup 的针对 cpu 资源的使用配额都会被重新分配。

例如,如果需要设置一个 cgroup 对单个 cpu 的访问配置为:每秒钟,有 0.2 秒的时间供当前 cgroup 使用,那么相关参数配置为:

cpu.cfs_quota_us=200000 cpu.cfs_period_us=1000000

其中 cfs_quota_us 的取值范围是 1000 us 到 1 s。

cpu.cfs_quota_us (quota mode)

指定一个 cgroup 内的所有任务可以在一直 cpu 周期内实际使用 cpu 的时间配额。

一旦任务的时间配额在当前的 cpu 时间周期内耗尽,则在当前周期的剩余时间内,该任务都不会再次被分配 cpu 资源,直到下一个新的时间周期开始。

cpu.shares (share mode)

该指标的值由一个整形的值标识,表示了当前 cgroup 相对整机能够获得的 CPU 时间的占比。例如,有两个 cgroup ,各自的 cpu.shares 的值分别为 100,200. 则当两个 cgroup 中的任务都 cpu 忙时,所能占用的整机的cpu 配额分别是%30 和 %60

这里有两点需要明确:

  1. 当只有一个 cgroup 忙,其他 cgroup 处于 idle 状态时,当前忙的 cgroup 可以吃满整个设备。

  2. 随着新增的 cgroup 的 share 值的加入,已有的 cgroup 的配合占比可能会被稀释。因此在实际的使用中,整个资源池最好是能规定上限,不能无限制的增加 cgroup 的组数,从而影响已有的 cgroup 组的资源分配。

多线程

  • 需要将进程 id 写入 cgroup.procs 文件,这样操作系统才能追踪到该进程下的线程创建从而控制资源化利用
  • 在删除 cgroup 控制组的时候,需要将已有的 cgroup.procs 内容写入到全局的 cgroup.procs 文件中,如果不这样做的话,操作系统会报 device are busy,也就是说所有的存活的进程都需要在一个 cgroup 组下工作,不能遗漏。

2. Klustron 相关配置及使用方法

在 Klustron 中,有两种方式可以对实例的 CPU 资源隔离进行设置。

第一种就是在购买实例的时候,给定初始化的 CPU 资源配置,如果不指定,则默认 4 个核的 quota mode 配置。

第二种就是在实例运行期间,动态对资源进行调整。可以用过 API 下发,也可以直接通过 XPanel 手动调整。具体使用方式参见 Klustron API 说明文档Xpanel 使用手册

END