【华为云MySQL技术专栏】TaurusDB资源隔离技术,让资源利用率飙升
一、背景介绍
TaurusDB 的多租户管理特性,能够让数据库为多个租户服务,从而提高数据库资源利用率。
该特性不仅实现了租户间的数据隔离,确保了不同租户能够安全访问自己的数据,还支持租户级和用户级的资源隔离,避免资源浪费和性能干扰。同时,它还支持资源的动态调整,能够及时应对不同租户或用户的业务高峰和低谷。
本文将结合多租内部使用的 CGroups(Control Groups,控制组)技术和MySQL 8.0发布的资源组特性,来介绍 TaurusDB 内部资源隔离和限制的实现机制。
二、原理介绍
2.1 CGroups介绍
CGroups 是 Linux 内核提供的一种物理资源隔离机制,通过这种机制可以限制一组进程或者线程所使用的物理资源(CPU、Memory、IO等)。
CGroups 将一个或多个进程(或线程)组织成一个逻辑组(称为“CGroup”),然后对该组整体进行资源控制,每个控制组指明了资源的配额限制,一个进程/线程可以加入到某个控制组,也可以迁移到其他控制组。
CGroup 为每种可以控制的资源定义了一个子系统,即资源控制器,包含了不同的物理资源配置规则。在 Linux 系统中,CGroup 子系统位于以下目录下:
/sys/fs/cgroup/cpu:限制 CGroup 的 CPU 使用率。
/sys/fs/cgroup/cpuacct:统计 CGroup 的 CPU 使用率。
/sys/fs/cgroup/cpuset: 绑定 CGroup 到指定的 CPU 核心。
/sys/fs/cgroup/memory: 限制 CGroup 的内存使用率。
▲ 图1 cgroup树状继承关系
-
cpu_cgrp:具有cpu使用率的限制和统计能力。
-
memory_cgrp:具备内存使用率的限制能力。
同样,子控制组 cgrp1 和 cgrp2 的CPU资源配额之和不能超过父控制组 cpu_cgrp 的 CPU 额度。
mkdir -p .../cgroup/cpu_cgrp
mount –t cgroup –o cpu,cpuacct cpu_cgrp .../cgroup/cpu_cgrp
mkdir /sys/fs/cgroup/cpu_cgrp/cgrp1
mkdir /sys/fs/cgroup/cpu_cgrp/cgrp2
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us
cpu.shares notify_on_release tasks cgroup.procs
cpu.cfs_quota_us
cpu.rt_runtime_us cpu.stat release_agent
cpuacct.stat cpuacct.usage cpuacct.usage_percpu
上述提到的TaurusDB Worker Thread,正是通过这一特性修改文件 cpu.shares 、 cpu.cfs_period_us 和 cpu.cfs_quota_us 中的内容比例,从而完成对不同租户的CPU分配控制。
cpu.shares:控制组之间的CPU分配比例,缺省值1024。假设 group1 中的 cpu.shares 是1024,而 group2 中的 cpu.shares 是3072,那么 group1 : group2 =1:3。
在一台 4 个 CPU 的机器上,当 group1 和 group2 都需要 4 个 CPU 的时候,它们实际分配到的 CPU:group1 是 1 个,group2 是 3 个。只有在 CPU 资源争抢时才生效,决定了控制组 CPU 使用的下限。
无论 CPU 是繁忙还是空闲,cpu.shares 都会限制控制组 CPU 使用的上限。
cpu.cfs_quota_us 和 cpu.cfs_period_us 配合使用,用于控制租户内进程使用 CPU 的绝对值。如果 cpu.cfs_quota_us 是 cpu.cfs_period_us 的 2 倍,则表示该租户的进程在 2 个核上完全使用。
图 1 从整体结构上描述了进程与 cgroup 之间的关系。最下面的 P 代表一个进程。每个进程都指向一个辅助结构 css_set(cgroups subsystem set)。 指向某一个 css_set 的进程会被加入到当前 css_set 的进程链表中,隶属于同一 css_set 的进程将受到该 css_set 所关联的资源限制。
图 1 中的“M × N Linkage”说明了 css_set 通过辅助结构可以与 cgroups 节点进行多对多的关联。多租特性主要关注 CPU 子系统的限制使用。
2.2 资源组管理介绍
MySQL 8.0 新增了 resource group(资源组)的功能,旨在将一个或多个线程归属到一个资源组下,DBA们可以通过命令配置资源组的资源选项。
与 MySQL 8.0 resource group 特性一致,TaurusDB在现阶段仅提供了对 CPU 资源的设置,通过查看源代码 sql/resourcegroups/platform 文件夹下的 API,可以看出,资源组通过绑定 CPU 核心和设置优先级来实现对 CPU 资源的精准管控。
在 resource_group_sql_cmd.cc 中,继承自 Sql_cmd 类的Sql_cmd_create_resource_group,Sql_cmd_drop_resource_group,Sql_cmd_alter_resource_group 和 Sql_cmd_set_resource_group ,分别对应着创、删、改资源组,以及将其分配给对应的执行线程的操作。
以图 2 新建资源组流程为例:
▲ 图2 新建资源组流程
可以看出,配套资源组引入了两个新权限:
-
RESOURCE_GROUP_ADMIN:用于创、删、改资源组;
-
RESOURCE_GROUP_USER:用于指定线程到资源组中。
DD(数据字典)中新增了 resource_groups 表,负责持久化信息。从表的结构,可以清晰地看出一个 Resource_group 包括:
| resource_groups | CREATE TABLE `resource_groups` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`resource_group_name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`resource_group_type` enum('SYSTEM','USER') COLLATE utf8mb3_bin NOT NULL,
`resource_group_enabled` tinyint(1) NOT NULL,
`cpu_id_mask` varchar(1024) COLLATE utf8mb3_bin NOT NULL,
`thread_priority` int NOT NULL,
`options` mediumtext COLLATE utf8mb3_bin,
PRIMARY KEY (`id`),
UNIQUE KEY `resource_group_name` (`resource_group_name`)
在Sql_cmd_set_resource_group中绑定线程时,最终由Thread_resource_control 负责调用 apply_control ,并通过调用不同操作系统的 bind_thread 和 set_thread_priority 接口,来达成资源(CPU)的限制和管理。
实践中,TaurusDB 使用 taskset 命令完成指定线程和 CPU 的绑定,避免其他线程的竞争导致性能波动。
三、总结
本文介绍了 TaurusDB 多租特性中,使用 CGroups 技术和资源管理组特性来限制资源的方法。目前,这两种方法都集中限制了 CPU 资源。后续 TaurusDB 计划对诸如内存、 IOPS 等方面进行更细粒度的优化,从而实现更精细的资源管理,更好地支持多租户使用。
- 点赞
- 收藏
- 关注作者
评论(0)