首批通过分布式安全可靠测评,为关键业务系统打造
开启基于 cgroups 的租户工作线程的 CPU 隔离
更新时间:2026-05-29 10:49:31
cgroup 概述
cgroups (Control Groups)是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,将一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。 OoceanBase 数据库的当前版本中,由于租户工作线程和大部分后台线程均根据租户来区分,网络线程为共享线程,您可以通过配置 cgroup 来控制租户间 CPU 的占用。
注意事项
如果 OBServer 服务器重启,创建好的 cgroup 子目录(例如,本文档中 /sys/fs/cgroup/ 目录下的所有子目录)会被清除,需要重新配置 cgroup。
配置 cgroup 系统目录
注意
cgroup 系统目录的配置操作需要在 OceanBase 数据库软件安装前进行。
本节以在一台 OBServer 上配置 cgroup 系统目录为例,如果有多台 OBServer ,则每台 OBServer 上都需要配置。
使用
admin用户登录到 OBServer 服务器所在的机器。执行以下命令,挂载
/sys/fs/cgroup目录。说明
如果已经存在
/sys/fs/cgroup目录,则可忽略该步骤。[admin@xxx /]$ sudo mount -t tmpfs cgroups /sys/fs/cgroup其中,
cgroups为自定义名称,用于在查看 Mount 信息时进行标识。挂载结果如下所示。
$df Filesystem 1K-blocks Used Available Use% Mounted on / 293601280 28055472 265545808 10% / /dev/v01d 2348810240 2113955876 234854364 91% /data/1 /dev/v02d 1300234240 1170211208 130023032 91% /data/log1 shm 33554432 0 33554432 0% /dev/shm /dev/v04d 293601280 28055472 265545808 10% /home/admin/logs cgroups 395752136 0 395752136 0% /sys/fs/cgroup创建
/sys/fs/cgroup/cpu目录并修改 Owner 后,挂载 CPU 子系统。说明
如果已经存在
/sys/fs/cgroup/cpu目录,则可忽略该步骤。[admin@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu [admin@xxx /]$ sudo chown admin:admin -R /sys/fs/cgroup/cpu创建一个名为
cpu的层级,在该层级上附加 cpu 子系统,并且将层级挂载到/sys/fs/cgroup/cpu目录。[admin@xxx /]$ sudo mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu创建名为
oceanbase的子目录,并修改其 Owner 为admin。[admin@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu/oceanbase [admin@xxx /]$ sudo chown admin:admin -R /sys/fs/cgroup/cpu/oceanbase为
oceanbase目录分配 CPU 和 Memory 资源。执行以下命令,查看机器上 cpu、cpuacct、cpuset 三个子系统的挂载情况。
[admin@xxx /]$ ll /sys/fs/cgroup根据子系统的挂载情况,选择合适的操作:
cpuset 子系统与 cpu、cpuacct 等子系统一起挂载
该场景下,通常是三个子系统挂载在同一目录下,例如,挂载结果如下所示:
drwxr-xr-x 3 root root 0 Jul 24 2020 blkio lrwxrwxrwx 1 root root 33 Jul 24 2020 cpu -> /sys/fs/cgroup/cpuset,cpu,cpuacct lrwxrwxrwx 1 root root 33 Jul 24 2020 cpuacct -> /sys/fs/cgroup/cpuset,cpu,cpuacct lrwxrwxrwx 1 root root 33 Jul 24 2020 cpuset -> /sys/fs/cgroup/cpuset,cpu,cpuacct drwxr-xr-x 4 root root 0 Jul 24 2020 cpuset,cpu,cpuacct对于该场景,需要执行以下命令来为
oceanbase目录分配 CPU 和 Memory 资源。[admin@xxx /]$ sudo sh -c "echo `cat /sys/fs/cgroup/cpu/cpuset.cpus` > /sys/fs/cgroup/cpu/oceanbase/cpuset.cpus" [admin@xxx /]$ sudo sh -c "echo `cat /sys/fs/cgroup/cpu/cpuset.mems` > /sys/fs/cgroup/cpu/oceanbase/cpuset.mems"cpuset 子系统与 cpu、cpuacct 等子系统分开挂载
该场景下,cpuset 子系统与 cpu、cpuacct 等子系统为分开挂载(通常 ECS 机型较多),其挂载结果如下所示:
drwxr-xr-x 2 root root 40 2月 27 15:27 blkio lrwxrwxrwx 1 root root 11 2月 27 15:27 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 2月 27 15:27 cpuacct -> cpu,cpuacct drwxr-xr-x 2 root root 40 2月 27 15:27 cpu,cpuacct drwxr-xr-x 2 root root 40 2月 27 15:27 cpuset对于该场景,不需要执行额外操作,直接进行下一步即可。
执行以下命令,为
oceanbase目录设置子目录的继承属性。[admin@xxx /]$ sudo sh -c "echo 1 > /sys/fs/cgroup/cpu/oceanbase/cgroup.clone_children"命令执行成功后,在
oceanbase目录下创建的 cgroup 子目录,其属性均会继承父目录。
cgroup 系统目录配置成功后,即可部署 OceanBase 数据库。 OceanBase 数据库的详细安装操作请参见 部署数据库。
与 OceanBase 数据库建立软链接
OceanBase 数据库安装成功后,需要建立 OceanBase 数据库软件的安装目录与 cgroup 系统目录的软链接。
使用
admin用户登录到 OBServer 服务器所在的机器。手动建立 OceanBase 数据库软件的安装目录与 cgroup 系统目录的软链接。
[admin@xxx /home/admin]$ cd /home/admin/oceanbase/ [admin@xxx /home/admin] $ ln -sf /sys/fs/cgroup/cpu/oceanbase/ cgroup其中:
/home/admin/oceanbase/为 OceanBase 数据库软件的安装路径。执行成功后,结果如下所示。
[admin@xxx /home/admin/oceanbase] $ll cgroup lrwxrwxrwx 1 admin admin 29 Dec 8 11:09 cgroup -> /sys/fs/cgroup/cpu/oceanbase/重新启动 observer 进程。
您需要停止 observer 进程后再重新启动 observer 进程,具体操作请参见 停止或启动 OBServer。
observer 进程在启动时,检测到之前已经建立的软链接,就会在
/sys/fs/cgroup/cpu/oceanbase/目录下继续创建 OceanBase 数据库 cgroup 目录。重启成功后,可以在 OceanBase 数据库软件的安装目录
/home/admin/oceanbase下看到 cgroup 的目录结构如下:[admin@xxx /home/admin/oceanbase] $tree -d cgroup cgroup ├── other ├── tenant_0001 │ ├── OBCG_DEFAULT │ ├── OBCG_ELECTION │ └── OBCG_ID_SERVICE ├── tenant_0506 │ └── OBCG_DEFAULT ├── tenant_0507 │ └── OBCG_DEFAULT ├── tenant_0508 │ └── OBCG_DEFAULT ├── tenant_0509 │ └── OBCG_DEFAULT ├── tenant_0510 │ └── OBCG_DEFAULT ├── tenant_0512 │ └── OBCG_DEFAULT ├── tenant_0999 │ └── OBCG_DEFAULT ├── tenant_1001 │ ├── OBCG_DEFAULT │ ├── OBCG_ELECTION │ └── OBCG_ID_SERVICE └── tenant_1002 ├── OBCG_DEFAULT └── OBCG_ELECTION
开启 cgroup 功能
OceanBase 数据库通过集群级配置项 enable_cgroup 来控制 OBServer 是否开启 cgroup 功能。默认该功能为 true,表示开启。如果未开启,您可以参考以下操作,开启 cgroup 功能。
使用
root用户登录到数据库的sys租户。执行以下命令,开启 cgroup 功能。
obclient> ALTER SYSTEM SET enable_cgroup=true;或者
obclient> ALTER SYSTEM SET enable_cgroup=1;或者
obclient> ALTER SYSTEM SET enable_cgroup=ON;
通过 cgroup 控制租户资源
成功配置 cgroups 系统目录并开启 cgroup 功能后,您可以通过租户所在目录下的 cpu.cfs_period_us、cpu.cfs_quota_us 和 cpu.shares 三个文件来控制租户间的 CPU 占用。
通过
cpu.cfs_quota_us和cpu.cfs_period_us设置 CPU 使用周期的使用时间上限cpu.cfs_quota_us和cpu.cfs_period_us用于控制租户内进程使用 CPU 的绝对值。其中:cpu.cfs_period_us:用于设置单个 CPU 使用时间的周期,单位为微秒,默认值为100000,即 100 毫秒。系统总的 CPU 使用时间的周期为:CPU 核数 * cfs_period_us。cpu.cfs_quota_us:用于设置周期内允许占用 CPU 的时间,单位为微秒,默认值为100000。取值范围为 [1000,1000000]。
cpu.cfs_quota_us配合cpu.cfs_period_us,可以限制进程对单个 CPU 的使用时间上限:单个 CPU 的使用时间上限 = cfs_quota_us/cfs_period_us。如果
cpu.cfs_quota_us是cpu.cfs_period_us的 2 倍,则表示该租户的进程在 2 个核上完全使用。设置租户
tenant_1001的进程只能使用 1 个 CPU 的 20% 的时间,配置示例如下。[admin@xxx /]$ cd /sys/fs/cgroup/cpu/oceanbase/tenant_1001 [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1001/] $ echo 50000 > cpu.cfs_period_us [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1001/] $ echo 10000 > cpu.cfs_quota_us设置租户
tenant_1002的进程完全使用 4 个 CPU 的时间,配置示例如下。[admin@xxx /]$ cd /sys/fs/cgroup/cpu/oceanbase/tenant_1002 [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1002] $ echo 1000000 > cpu.cfs_period_us [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1002] $ echo 4000000 > cpu.cfs_quota_us通过 cpu.shares 文件实现按权重比例设置 CPU 的分配
cpu.shares用于控制租户进程使用 CPU 的相对值,并且是针对系统中所有的 CPU 核数,cpu.shares文件的默认值为1024。假设系统中有两个租户,分别是
tenant_1001和tenant_1002,tenant_1001的cpu.shares值为1024,tenant_1002的cpu.shares值为512。租户
tenant_1001中的设置如下:[admin@xxx /]$ cd /sys/fs/cgroup/cpu/oceanbase/tenant_1001 [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1001] $ echo 1024 > cpu.shares租户
tenant_1002中的设置如下:[admin@xxx /]$ cd /sys/fs/cgroup/cpu/oceanbase/tenant_1002 [admin@xxx /sys/fs/cgroup/cpu/oceanbase/tenant_1002] $ echo 512 > cpu.shares设置后,当两个租户中的进程都满负荷运行时,
tenant_1001将获得1024/(1024+512)=66%的 CPU 资源,而tenant_1002将获得 33% 的 CPU 资源。如果其他租户中的进程空闲,则另一个租户的进程可以用满全部 CPU。