RHEL 8에서 cgroup을 활용한 사용자 리소스 제한 방법

1. 개요

단일 서버에 여러 데이터베이스 인스턴스를 운영할 경우, 각각의 리소스 사용량을 제어해야 하는 요구사항이 발생한다. 이때 사용자 단위로 리소스를 분리하는 것이 효과적인 접근 방식이다. 그러나 RHEL/CentOS 8과 같은 최신 리눅스 배포판에서는 기존의 libcgroup-tools 패키지가 제공하던 cgred(cgrulesengd) 서비스가 제거되어 기존 방식으로는 구현이 어렵다.

2. 문제 상황

RHEL 8.5 환경에서 libcgroup 및 libcgroup-tools 패키지를 설치한 후에도 cgred 서비스가 존재하지 않는 문제가 발생한다:

[root@server ~]# systemctl status cgred
Unit cgred.service could not be found.

libcgroup changelog를 확인해보면 2014년에 cgred 서비스가 제거되었으며, 대신 systemd의 Control Group 인터페이스 사용을 권장하고 있다.

3. 해결 방안

3.1 systemd slice를 통한 제어

systemd의 user slice 기능을 활용하여 특정 사용자의 리소스를 제한할 수 있다.

예시: 사용자 'dbuser'의 CPU 사용률을 30%로 제한

# 사용자 UID 확인
[root@server ~]# id dbuser
uid=1003(dbuser) gid=1003(dbgroup) groups=1003(dbuser)

# CPU 할당량 설정
[root@server ~]# systemctl start user-1003.slice
[root@server ~]# systemctl set-property user-1003.slice CPUQuota=30%

# 설정 확인
[root@server ~]# systemctl cat user-1003.slice
# /etc/systemd/system/user-1003.slice.d/50-CPUQuota.conf
[Slice]
CPUQuota=30%

# 설정 적용
[root@server ~]# systemctl daemon-reload

3.2 이전 버전 libcgroup 패키지 설치

RHEL 7용 libcgroup 패키지를 다운로드하여 RHEL 8에 설치하는 방법도 가능하다.

# RHEL 7에서 패키지 다운로드
[root@rhel7 ~]# yum install --downloadonly --downloaddir=/tmp/ libcgroup libcgroup-tools

# RHEL 8에서 기존 패키지 제거
[root@rhel8 ~]# yum remove libcgroup libcgroup-tools

# RHEL 7 패키지 설치
[root@rhel8 ~]# rpm -i libcgroup-0.41-21.el7.x86_64.rpm
[root@rhel8 ~]# rpm -i libcgroup-tools-0.41-21.el7.x86_64.rpm

3.3 libcgroup 직접 컴파일

최신 libcgroup 소스코드를 직접 컴파일하여 설치하는 방법이다.

# 소스 다운로드 및 압축 해제
[root@server ~]# wget https://github.com/libcgroup/libcgroup/releases/download/v2.0/libcgroup-2.0.tar.gz
[root@server ~]# tar xzf libcgroup-2.0.tar.gz

# 빌드 환경 준비
[root@server ~]# yum install pam-devel
[root@server ~]# mkdir /opt/libcgroup

# 컴파일 및 설치
[root@server ~]# cd libcgroup-2.0
[root@server libcgroup-2.0]# ./configure --prefix=/opt/libcgroup
[root@server libcgroup-2.0]# make && make install

4. 주요 도구 설명

  • cgclassify: 실행 중인 프로세스를 cgroup으로 이동
  • cgrulesengd: 규칙 기반 cgroup 자동 할당 데몬
  • cgcreate/cgdelete: cgroup 생성 및 삭제
  • cgexec: 지정된 cgroup에서 프로세스 실행
  • cgset/cgget: cgroup 파라미터 설정 및 조회

5. 제한 사항

각 방법별 특성상 다음과 같은 제약이 존재한다:

  • systemd 방식은 지원 파라미터가 버전에 따라 제한됨
  • su 명령어를 통한 사용자 전환 시 리소스 제어가 적용되지 않음
  • RHEL 7 패키지 설치 방식은 cgroup v2 미지원
  • 직접 컴파일 방식은 복잡한 빌드 과정 필요

태그: cgroup systemd rhel8 resource-management libcgroup

7월 27일 15:10에 게시됨