Настройка групп ресурсов

Проверьте версию cgroup, настроенную в вашей системе, посмотрев файловые системы, монтируемые по умолчанию при загрузке:

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

Для cgroup v1 вывод будет tmpfs. Для cgroup v2cgroup2fs.

Если изменение версии 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
    # добавьте или измените: 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
    # добавьте или измените: GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"
    update-grub

Если вы планируете продолжать использовать cgroup v1, убедитесь, что в файлах memory.limit_in_bytes внутри /sys/fs/cgroup/memory/gpdb/ не установлены ограничения. Это касается как /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.

  1. Включите службу cgroup на каждом узле кластера YMatrix:
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"
  1. Перезагрузите систему, чтобы применить изменения:
reboot now
  1. Создайте каталог /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

При выполнении этих команд может возникнуть ошибка «invalid argument». Она появляется, потому что cgroup v2 не поддерживает управление процессами реального времени, если не все такие процессы находятся в корневой cgroup. В этом случае найдите все процессы реального времени, переместите их в корневую cgroup, а затем повторно включите контроллеры.

Убедитесь, что у пользователя mxadmin есть право записи в /sys/fs/cgroup/cgroup.procs. Это позволяет процессам YMatrix после запуска кластера перемещаться из пользовательского среза (user slice) в /sys/fs/cgroup/matrixdb6.service/, обеспечивая управление процессом postmaster и его вспомогательными процессами:

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

Поскольку группы ресурсов управляют файлами cgroup вручную, это разрешение будет утеряно после перезагрузки системы. Чтобы сделать его постоянным, настройте systemd на автоматический запуск скрипта при загрузке. Выполните следующие действия от имени root:

  1. Создайте файл юнита matrixdb6.service:

    vim /etc/systemd/system/matrixdb6.service
  2. Добавьте в 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