背景
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