Linux Tech

cgroup 으로 시스템 자원 제한 걸기

로빈09 2021. 12. 30. 17:12

CGROUP은 커널의 기본  기능으로 시스템의 자원(CPU,MEMORY등)을 관리하고 할당하는 기능 임. 

RHEL 7 버전까지는 CGROUP V1 버전.
RHEL 8은 CGROUP V1과 CGROUP V2 두가지 버전을 제공하고 있습니다. 

 

RHEL 8의 기본사용은 CGROUP V1입니다.

 RHEL 8은 CGROUP V1 이 기본으로 되어있으나, 향후 SYSTEMD의 버전이 241 버전 이상으로 업데이트될 경우 CGROUP V2를 기본으로 사용할 예정입니다.


RHEL 8 버전에서 CPU와 같은 자원을 사용자별 혹은 특정사용자에게 사용 제한을 두려고 할 경우에는 

CGROUP V2을 기본으로 사용하게끔 설정을 바꾸어주고 몇가지의 설정이 이루어져야 합니다.


- 테스트 환경

실행 환경 : Vmware
O/S : RHEL 8.4

 1. Grub 설정 

grub2 부트파라미터 내용 추가후 Rebuilding 실행 (CGROUP V1의 비활성화와 CGROUP V2의 활성화)

- Legacy 환경에서 리눅스가 설치된 경우)

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"
# grub2-mkconfig -o /boot/grub2/grub..cfg
# reboot

- UEFI 환경에서 리눅스가 설치된 경우)

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet  systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# reboot

2. rtkit 비 활성화

rtkit-daemon 비활성화 (rtkit-daemon이 활성화 되어 있을 경우 CGROUP 속성 Write error 발생)

# systemctl stop rtkit-daemon
# systemctl disable rtkit-daemon
# systemctl mask rtkit-daemon


3. Cgroup 속성 관련 스크립트 

 

CGROUP V2 마운트 및 속성값 설정 내용이 포함된 스크립트 생성 (guest 사용자에 대해 cpu 30% 사용제한의 예)

# vi /usr/bin/configure_cgroups.sh


#!/bin/bash
touch /var/tmp/configure_cgroups.sh.ok
mkdir -p /mnt/cgroupv2
if [ ! -f /mnt/cgroupv2/cgroup.subtree_control ]
then
    mount -t cgroup2 none /mnt/cgroupv2
    echo "+cpu" > /mnt/cgroupv2/cgroup.subtree_control
fi
mkdir -p /mnt/cgroupv2/user.guest
echo "30000 100000" > /mnt/cgroupv2/user.guest/cpu.max

for pid in $(ps -ef |  grep -i "^guest" | awk '{print $2}')
        do
        grep $pid /mnt/cgroupv2/user.guest/cgroup.procs >/dev/null
                if [ $? != 0 ]
                then
                echo $pid > /mnt/cgroupv2/user.guest/cgroup.procs
                fi
        done


4. 작성한 스크립트 퍼미션 변경 

# chmod 755  /usr/bin/configure_cgroups.sh



5. 서비스 등록 작업 

작성한 스크립트를 시스템 부팅시 실행되어 영구적/실시간 적용될수 있도록 SYSTEMD 서비스에 2개의 실행 서비스 등록 

# vi /usr/lib/systemd/system/configure-cgroupsv2.service
[Unit]
Description=Configure CGroups V2

[Service]
Type=oneshot
ExecStart=/usr/bin/configure_cgroups.sh

 


# vi /usr/lib/systemd/system/configure-cgroupsv2.timer

[Unit]
Description=Configure CGroups V2 Timer

[Timer]
OnUnitActiveSec=10s   ## Timer 가 동작하는 시간 (추후 변경 할것) 
OnBootSec=10s

[Install]
WantedBy=timers.target

 

 6. 서비스 시작 및 확인 

최종 서비스 상태 확인시  configure-cgroupsv2.timer는 Active (running)이며,  

configure-cgroupsv2.timer 서비스는  configure-cgroupsv2.timer에서 설정된 시간  10초마다  acvating과 inactive로

변환됩니다. 이러한 동작을 통해  설정 내용을 점검하고 변경된점이 있을 경우 재적용합니다.)

# systemctl daemon-reload
# systemctl enable configure-cgroupsv2.timer
# systemctl start configure-cgroupsv2.timer

# systemctl list-timers --all| grep configure

# systemctl start configure-cgroupsv2.service
# systemctl status configure-cgroupsv2.service
# journalctl -xe




7. guest 사용자의 cpu 사용제한을 30%에서 50%로 변경하기

# cd /mnt/cgroupv2/user.guest
# cat cpu.max
# vi  /usr/bin/configure_cgroups.sh
.
.
echo "50000 100000" > /mnt/cgroupv2/user.guest/cpu.max
.
.

# systemctl restart  configure-cgroupsv2.service

configure-cgroupsv2.timer 서비스로부터  10초간 기다리면  configure-cgroupsv2.service 자동 재시작