---
title: "开启基于 cgroups 的租户工作线程的 CPU 隔离 | OceanBase 文档中心"
description: 开启基于 cgroups 的租户工作线程的 CPU 隔离 cgroup 概述 cgroups （Control Groups）是 Linux 内核提供的一种机制，这种机制可以根据特定的行为，将一系列系统任务及其子任务整合（或分隔）到按资源划分等级的不同组内，从而为系统资源管理提供一个统一的框架。 OoceanBase…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.4 企业版 LTS

# 开启基于 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 上都需要配置。

1. 使用 `admin` 用户登录到 OBServer 服务器所在的机器。
 2. 执行以下命令，挂载 `/sys/fs/cgroup` 目录。

   > **说明**
   >
   >  
   >
   > 如果已经存在 `/sys/fs/cgroup` 目录，则可忽略该步骤。

   ```shell
   [admin@xxx /]$ sudo mount -t tmpfs cgroups /sys/fs/cgroup

   ```

   其中，`cgroups` 为自定义名称，用于在查看 Mount 信息时进行标识。

   挂载结果如下所示。

   ```shell
   $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

   ```
 3. 创建 `/sys/fs/cgroup/cpu` 目录并修改 Owner 后，挂载 CPU 子系统。

   #### 说明

   如果已经存在 `/sys/fs/cgroup/cpu` 目录，则可忽略该步骤。

   ```shell
   [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` 目录。

   ```shell
   [admin@xxx /]$ sudo mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu

   ```
 4. 创建名为 `oceanbase` 的子目录，并修改其 Owner 为 `admin`。

   ```shell
   [admin@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu/oceanbase

   [admin@xxx /]$ sudo chown admin:admin -R /sys/fs/cgroup/cpu/oceanbase

   ```
 5. 为 `oceanbase` 目录分配 CPU 和 Memory 资源。

      1. 执行以下命令，查看机器上 cpu、cpuacct、cpuset 三个子系统的挂载情况。

        ```shell
        [admin@xxx /]$ ll /sys/fs/cgroup

        ```
      2. 根据子系统的挂载情况，选择合适的操作：

             - cpuset 子系统与 cpu、cpuacct 等子系统一起挂载

              该场景下，通常是三个子系统挂载在同一目录下，例如，挂载结果如下所示：

              ```shell
              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 资源。

              ```shell
              [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 机型较多），其挂载结果如下所示：

              ```shell
              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

              ```

              对于该场景，不需要执行额外操作，直接进行下一步即可。
 6. 执行以下命令，为 `oceanbase` 目录设置子目录的继承属性。

   ```shell
   [admin@xxx /]$ sudo sh -c "echo 1 > /sys/fs/cgroup/cpu/oceanbase/cgroup.clone_children"

   ```

   命令执行成功后，在 `oceanbase`目录下创建的 cgroup 子目录，其属性均会继承父目录。

cgroup 系统目录配置成功后，即可部署 OceanBase 数据库。 OceanBase 数据库的详细安装操作请参见 [部署数据库](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000943776)。

## 与 OceanBase 数据库建立软链接

OceanBase 数据库安装成功后，需要建立 OceanBase 数据库软件的安装目录与 cgroup 系统目录的软链接。

1. 使用 `admin` 用户登录到 OBServer 服务器所在的机器。
 2. 手动建立 OceanBase 数据库软件的安装目录与 cgroup 系统目录的软链接。

   ```shell
   [admin@xxx /home/admin]$ cd /home/admin/oceanbase/

   [admin@xxx /home/admin]
   $ ln -sf /sys/fs/cgroup/cpu/oceanbase/ cgroup

   ```

   其中：`/home/admin/oceanbase/` 为 OceanBase 数据库软件的安装路径。

   执行成功后，结果如下所示。

   ```shell
   [admin@xxx /home/admin/oceanbase]
   $ll cgroup
   lrwxrwxrwx 1 admin admin 29 Dec  8 11:09 cgroup -> /sys/fs/cgroup/cpu/oceanbase/

   ```
 3. 重新启动 observer 进程。

   您需要停止 observer 进程后再重新启动 observer 进程，具体操作请参见 [停止或启动 OBServer](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000946238)。

   observer 进程在启动时，检测到之前已经建立的软链接，就会在 `/sys/fs/cgroup/cpu/oceanbase/` 目录下继续创建 OceanBase 数据库 cgroup 目录。

   重启成功后，可以在 OceanBase 数据库软件的安装目录 `/home/admin/oceanbase` 下看到 cgroup 的目录结构如下：

   ```shell
   [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 功能。

1. 使用 `root` 用户登录到数据库的 `sys` 租户。
 2. 执行以下命令，开启 cgroup 功能。

   ```sql
   obclient> ALTER SYSTEM SET enable_cgroup=true;

   ```

   或者

   ```sql
   obclient> ALTER SYSTEM SET enable_cgroup=1;

   ```

   或者

   ```sql
   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% 的时间，配置示例如下。

  ```shell
  [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 的时间，配置示例如下。

  ```shell
  [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 /sys/fs/cgroup/cpu/oceanbase/tenant_1001]
  $ echo 1024 > cpu.shares

  ```

  租户 `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。

## 相关文档

[清除 cgroup 配置](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-0000000001300981)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
