配置资源组

通过检查系统启动期间默认挂载的文件系统来验证您的环境中配置的 cgroup 版本:

stat -fc %T /sys/fs/cgroup/

对于 cgroup v1,输出是 tmpfs。对于 cgroup v2,输出是 cgroup2fs

如果不需要更改 cgroup 的版本,只需跳到配置 cgroup v1配置cgroup v2 完成配置操作。

如果需要从 cgroup v1 切换到 v2,请以 root 身份运行以下命令:

  • Red Hat 8/Rocky 8/Oracle 8
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=1"
  • Ubuntu
vim /etc/default/grub
# add or modify: GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"
update-grub

如果需要从 cgroup v2 切换到 v1,请以 root 身份运行以下命令:

  • Red Hat 8/Rocky 8/Oracle 8
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=0 systemd.legacy_systemd_cgroup_controller"
  • Ubuntu
vim /etc/default/grub
# add or modify: GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"
update-grub

如果您想继续使用 cgroup v1,请确保 /sys/fs/cgroup/memory/gpdb 下的每个 memory.limit_in_bytes 文件(包括 /sys/fs/cgroup/memory/gpdb/memory.limit_in_bytes/sys/fs/cgroup/memory/gpdb/[OID]/memory.limit_in_bytes)没有极限值。如果是,请运行:

echo -1 >> memory.limit_in_bytes

之后,重新启动主机以使更改生效。

配置 cgroup v1

  1. 在集群中的每个节点上操作:

注意!
需使用超级用户或具有 sudo 访问权限的用户才能编辑此文件。

vi /etc/cgconfig.conf

在配置文件中添加以下信息。

group gpdb {
     perm {
         task {
             uid = mxadmin;
             gid = mxadmin;
         }
         admin {
             uid = mxadmin;
             gid = mxadmin;
         }
     }
     cpu {
     }
     cpuacct {
     }
     cpuset {
     }
     memory {
     }
} 

此内容配置了由 mxadmin 用户管理的 CPU 带宽控制、CPU 使用统计、CPU 核心数以及内存限制。

  1. 为 YMatrix 集群每一个节点开启 cgroup 服务。
cgconfigparser -l /etc/cgconfig.conf 
systemctl enable cgconfig.service
systemctl start cgconfig.service
  1. 确定节点的 cgroup 目录挂载点
grep cgroup /proc/mounts 
  • 第一行输出为 cgroup 目录挂载点 /sys/fs/cgroup
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0                                                             
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0                                                                                                      
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0                                           
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0                         
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0                                                 
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0                                           
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0                                   
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0                                     
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0                                           
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0                                             
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0                                             
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0  
  1. 检验是否正确配置
ls -l <cgroup_mount_point>/cpu/gpdb
ls -l <cgroup_mount_point>/cpuset/gpdb
ls -l <cgroup_mount_point>/memory/gpdb

如果目录存在,并且属主是 mxadmin:mxadmin,说明成功配置 cgroup 对 YMatrix 数据库的资源管理。

配置 cgroup v2

  1. 将系统配置为在系统启动时默认挂载 cgroups-v2,通过 systemd 系统和服务管理器以 root 用户身份实现。
    grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
  2. 重新启动系统,使更改生效。
    reboot now
  3. 创建目录 /sys/fs/cgroup/matrixdb6.service,添加所有必要的控制器,并确保 mxadmin 用户对其具有读写权限。
    mkdir -p /sys/fs/cgroup/matrixdb6.service
    echo "+cpuset +io +cpu +memory" | tee -a /sys/fs/cgroup/cgroup.subtree_control
    chown -R mxadmin:mxadmin /sys/fs/cgroup/matrixdb6.service

    运行上述命令后,您可能会遇到错误无效参数。这是因为 cgroup v2 不支持控制实时进程,只有当所有实时进程都在根 cgroup 中时才能启用 cpu 控制器。在这种情况下,请找到所有实时进程并将它们移动到 root cgroup,然后再重新启用控制器。

确保 mxadmin/sys/fs/cgroup/cgroup.procs 具有写入权限。这是在集群启动后将 YMatrix 进程从用户移动到 /sys/fs/cgroup/matrixdb6.service/ 以管理 postmaster 服务及其所有必需的辅助进程。

chmod a+w /sys/fs/cgroup/cgroup.procs

由于资源组手动管理 cgroup 文件,系统重启后上述设置将失效。为 systemd 添加以下 bash 脚本,使其在系统启动期间自动运行。以 root 用户身份执行以下步骤:

  1. 创建 matrixdb6.service
vim /etc/systemd/system/matrixdb6.service
  1. 将以下内容写入 matrixdb6.service,如果用户不是 mxadmin,则替换为相应的用户。
[Unit]
Description=Greenplum Cgroup v2 Configuration Service
[Service]
Type=simple
WorkingDirectory=/sys/fs/cgroup/matrixdb6.service
Delegate=yes
Slice=-.slice

# set hierarchies only if cgroup v2 mounted
ExecCondition=bash -c '[ xcgroup2fs = x$(stat -fc "%%T" /sys/fs/cgroup) ] || exit 1'
ExecStartPre=bash -ec " \
chown -R mxadmin:mxadmin .; \
chmod a+w ../cgroup.procs; \
mkdir -p helper.scope"
ExecStart=sleep infinity
ExecStartPost=bash -ec "echo $MAINPID > /sys/fs/cgroup/cgroup.procs;"
[Install]
WantedBy=basic.target
  1. 重新加载 systemd 守护程序并启用服务:
systemctl daemon-reload
systemctl enable matrixdb6.service