基于CGroup的CPU隔离配置过程记录

2024年 6月 28日 56.8k 0

背景

OB 3.1版本引入了基于CGroup的CPU隔离特性,这里基于官方文档进行实践并记录了配置过程,内容描述如果有误劳烦指正。

官方文档中有对cgroup配置步骤做简单描述,但实操发现还存在如下几个点需要自己解决:

    • /sys/fs/cgroup目录默认通常都是已经挂载好cgroup的,例如CentOS7/8,它是在操作系统启动时由systemd调用mount_cgroup_controllers挂载的,如果按官方文档中的步骤进行操作,会遭遇一些报错
    • 官方文档中提到,OB不支持cpu、cpuset、cpuacct 三个子系统挂载在不同目录,但目前CentOS 7/8默认都是分两个目录挂载的,其中cpu和cpuset挂载在/sys/fs/cgroup/cpu,cpuacct目录并软链接到/sys/fs/cgroup/cpu,cpuset挂载在/sys/fs/cgroup/cpuset目录。为满足OB的配置要求,需要解决将这三个子系统挂载到一起的问题
    • cgroup配置持久化问题,例如手动在cgroup目录下创建的oceanbase子目录及属组配置,它们会在操作系统重启后丢失

测试环境

CentOS 7.7

OB 4.3.1社区版

配置过程

CGroup配置一般使用cgconfig工具,其安装配置并不复杂,它可以使CGroup配置持久化生效

## 安装并设置自启动
yum install -y libcgroup-tools
systemctl enable cgconfig

例如这里要在/cgroup/cpuset目录上挂载cpuset子系统,并在该子系统中创建oceanbase子目录,目录属组为admin:admin,同时将oceanabse子目录中的cgroup.clone_children置为1

## 关闭SELinux已关闭:编辑/etc/selinux/config,修改如下配置
SELINUX=disabled


## 创建目录及用户,为测试做准备
mkdir -p /cgroup/cpuset
useradd admin


## 在/etc/cgconfig.conf中追加如下内容
mount {
        cpuset = /cgroup/cpuset;
}
group oceanbase {
  perm {
    task {
        uid = "admin";
        gid = "admin";
    }
    admin {
        uid = "admin";
        gid = "admin";
    }
}
  cpuset {
    cgroup.clone_children = "1";
  }
}


## 重启操作系统,然后确认挂载状态及日志信息
reboot
lssubsys -aM
journalctl -xefu cgconfig

上述配置方式在一般场景中通常是可用的,但是如果尝试将多个不同的cgroup子系统挂载在同一个目录上时,服务便会报错。例如/etc/cgconfig.conf内容如下,这里尝试将cpu、cpuacct和cpuset同时挂载到/cgroup/cpu目录上

mount {
        cpu = /cgroup/cpu;
        cpuacct = /cgroup/cpu;
        cpuset = /cgroup/cpu;
}
group oceanbase {
  perm {
    task {
        uid = "admin";
        gid = "admin";
    }
    admin {
        uid = "admin";
        gid = "admin";
    }
}
  cpu {
    cpu.shares = "400";
  }
  cpuset {
    cgroup.clone_children = "1";
  }
}

重启操作系统或cgconfig服务后,便会遭遇"Device or resource busy"报错,究其原因大概是因为cgconfig在按hierarchy顺序挂载cpu,cpuacct和cpuset到/cgroup/cpu目录上时,后挂载的子系统发现挂载点已被占用所致。因此,使用cgconfig虽然可以解决cgroup配置持久化的问题,但用它来统一cpu,cpuacct和cpuset的挂载点貌似不行

[root@centos7 ~]# systemctl status cgconfig
● cgconfig.service - Control Group configuration service
   Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2024-06-26 11:01:55 CST; 1 day 12h ago
  Process: 497 ExecStart=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf -L /etc/cgconfig.d -s 1664 (code=exited, status=101)
 Main PID: 497 (code=exited, status=101)

Jun 26 11:01:55 centos7 cgconfigparser[497]: /usr/sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup mounting failed
Jun 26 11:01:55 centos7 cgconfigparser[497]: Error: cannot mount cpu,cpuacct,cpuset to /cgroup/cpu: Device or resource busy

[root@centos7 ~]# cat /proc/cgroups 
#subsys_name    hierarchy       num_cgroups     enabled
cpuset          9               1               1
cpu             4               53              1
cpuacct         4               53              1
memory          6               53              1
devices         3               53              1
freezer         8               1               1
net_cls         7               1               1
blkio           10              53              1
perf_event      2               1               1
hugetlb         5               1               1
pids            11              53              1
net_prio        7               1               1

不使用cgconfig,回到最朴素的文件系统挂载命令上来,先把cgconfig的配置回退掉:

systemctl disable cgconfig
reboot

然后使用下面命令可以将cpu,cpuacct和cpuset挂载到一起:

umount /sys/fs/cgroup/cpu,cpuacct
umount /sys/fs/cgroup/cpuset
mount -t cgroup -o cpuset,cpu,cpuacct cgroup /sys/fs/cgroup/cpu

[root@centos7 ~]# mount -t cgroup | grep cpu
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,relatime,seclabel,cpuacct,cpu,cpuset)

解决了挂载点冲突的问题,接下来需要解决配置持久化的问题。想到一个办法,将下面命令追加到/etc/rc.d/rc.local文件中

umount /sys/fs/cgroup/cpu,cpuacct
umount /sys/fs/cgroup/cpuset
mount -t cgroup -o cpuset,cpu,cpuacct cgroup /sys/fs/cgroup/cpu
mkdir /sys/fs/cgroup/cpu/oceanbase
chown -R admin:admin /sys/fs/cgroup/cpu/oceanbase
echo `cat /sys/fs/cgroup/cpu/cpuset.cpus` > /sys/fs/cgroup/cpu/oceanbase/cpuset.cpus
echo `cat /sys/fs/cgroup/cpu/cpuset.mems` > /sys/fs/cgroup/cpu/oceanbase/cpuset.mems
echo 1 > /sys/fs/cgroup/cpu/oceanbase/cgroup.clone_children

确保/etc/rc.d/rc.local文件具有执行权限

chmod +x /etc/rc.d/rc.local

然后重启操作系统,挂载点冲突和配置持久化的问题都得到解决。

接下来便可以部署OB,假设OB软件部署在/home/admin/ob_test/oceanbase目录中,在该目录中创建软链接指向cgroup目录

su - admin
cd /home/admin/ob_test/oceanbase
ln -sf /sys/fs/cgroup/cpu/oceanbase/ cgroup


## 确认结果
[admin@node6 oceanbase]$ ll
total 12
drwxrwxr-x 2 admin admin 4096 Jun 27 15:06 admin
drwxrwxr-x 2 admin admin 4096 Jun 27 15:52 audit
drwxrwxr-x 2 admin admin   95 Jun 27 15:06 bin
lrwxrwxrwx 1 admin admin   29 Jun 27 15:23 cgroup -> /sys/fs/cgroup/cpu/oceanbase/
drwxrwxr-x 2 admin admin 4096 Jun 27 15:51 etc
drwxrwxr-x 2 admin admin   64 Jun 27 15:51 etc2
drwxrwxr-x 2 admin admin   64 Jun 27 15:51 etc3
drwxrwxr-x 2 admin admin  109 Jun 27 15:07 lib
drwxrwxr-x 2 admin admin  310 Jun 27 15:55 log
drwxrwxr-x 2 admin admin   84 Jun 27 15:08 log_obshell
drwxrwxr-x 2 admin admin  150 Jun 27 15:52 run
drwxrwxr-x 5 admin admin   45 Jun 27 15:06 store

然后在OB中启用cgroup

ALTER SYSTEM SET enable_cgroup=true;

最后重启OBServer,之后便可以在/sys/fs/cgroup/cpu/oceanbase/目录中发现多了几个以"tenant_"为前缀的子目录,说明cgroup隔离已启用

[admin@node6 oceanbase]$ cd /sys/fs/cgroup/cpu/oceanbase/
[admin@node6 oceanbase]$ ll
total 0
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cgroup.clone_children
--w--w--w-  1 admin admin 0 Jun 27 15:48 cgroup.event_control
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cgroup.procs
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpuacct.stat
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuacct.usage
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpuacct.usage_percpu
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpu.cfs_period_us
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpu.cfs_quota_us
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpu.rt_period_us
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpu.rt_runtime_us
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.cpu_exclusive
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.cpus
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpuset.effective_cpus
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpuset.effective_mems
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.mem_exclusive
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.mem_hardwall
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.memory_migrate
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpuset.memory_pressure
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.memory_spread_page
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.memory_spread_slab
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.mems
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.sched_load_balance
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpuset.sched_relax_domain_level
-rw-r--r--  1 admin admin 0 Jun 27 15:48 cpu.shares
-r--r--r--  1 admin admin 0 Jun 27 15:48 cpu.stat
-rw-r--r--  1 admin admin 0 Jun 27 15:48 notify_on_release
drwxrwxr-x  2 admin admin 0 Jun 27 15:52 other
-rw-r--r--  1 admin admin 0 Jun 27 15:48 tasks
drwxrwxr-x 10 admin admin 0 Jun 27 15:52 tenant_0001
drwxrwxr-x  3 admin admin 0 Jun 27 15:52 tenant_0508
drwxrwxr-x  3 admin admin 0 Jun 27 15:52 tenant_0509
drwxrwxr-x  9 admin admin 0 Jun 27 15:52 tenant_1002

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论