Skip to main content

Cgroup

Control Group

cgroup은 리눅스 커널의 기능입니다.

Cgroup을 통해 사용자는 CPU 시간, 시스템 메모리, 네트워크 대역폭과 같은 자원이나 이러한 자원의 조합을 시스템에서 실행 중인 사용자 정의 작업 그룹 (프로세스) 간에 할당할 수 있습니다.
또한 설정한 cgroup을 모니터링하거나 특정 자원으로의 cgroup 액세스를 거부하는 것 이외에 실행 중인 시스템에서 cgroup을 동적으로 다시 구성할 수 있습니다.
cgconfig (“control group config”) 서비스는 부팅시 시작 및 사전 정의된 cgroup을 다시 구성하도록 설정하여 재부팅 후에도 구성된 사항이 지속되도록 설정할 수 있습니다.

cgroup을 사용하여 시스템 관리자는 시스템 자원 할당, 우선 순위 지정, 거부, 관리, 모니터링과 같은 세밀한 제어가 가능합니다. 하드웨어 자원은 작업 및 사용자 간을 신속하게 분배하여 전체적인 효율성을 향상시킬 수 있습니다.

출처: Red Hat 컨트롤 그룹 (Cgroups) 문서


MemoryNetworkDisk
System20%-20%
Professors50%5%50%
Student30%15%30%
  • cg1cg2는 각 컨테이너에 할당된 리소스 그룹
  • Top cpuset은 최상위 cgroup 계층을 의미하며, 시스템 전체 리소스를 관리
  • system작업은 topcpuset에 연결되어 있으며, 시스템 전체 리소스를 사용할 수 있습니다. (20% 할당)

Cgroup의 주요 서브시스템

리눅스 커널은 여러 서브시스템(subsystem) 또는 리소스 컨트롤러를 통해 cgroup 기능을 제공합니다.
각 서브시스템의 특성을 간략히 알아보겠습니다:

  • cpu: CPU 시간 할당을 제어. CPU 스케줄러를 통해 프로세스 그룹에 CPU 시간을 분배
    • CFS(Completely Fair Scheduler) 기반으로 CPU 시간을 공정하게 분배
    • cpu.shares를 통해 상대적 CPU 시간 비율 설정 가능
  • cpuset: 특정 CPU 코어와 메모리 노드를 프로세스 그룹에 할당
    • NUMA(Non-Uniform Memory Access) 시스템에서 특히 유용
    • 멀티코어 시스템에서 CPU 친화성(affinity) 설정
  • memory: 메모리 사용량을 제한하고 모니터링
    • 프로세스 그룹의 메모리 사용량 상한선 설정
    • OOM(Out Of Memory) 발생 시 특정 그룹의 프로세스만 종료 가능
    • memory.limit_in_bytes로 메모리 제한 설정
  • blkio: 블록 디바이스(디스크)의 I/O 대역폭 제어
    • 읽기/쓰기 속도 제한 설정
    • I/O 우선순위 조정 가능
  • devices: 디바이스 접근 권한 제어
    • 특정 프로세스 그룹이 접근할 수 있는 디바이스 제한
  • net_cls, net_prio: 네트워크 트래픽 분류 및 우선순위 설정
    • 네트워크 패킷에 클래스 ID 태깅
    • 트래픽 제어(tc)와 연동하여 대역폭 제한
  • freezer: 프로세스 그룹을 일시 중지하거나 재개
    • 컨테이너 마이그레이션 시 유용
  • pids: 프로세스 수 제한
    • fork bomb 공격 방지
    • 프로세스 생성 개수 제한

Cgroup 버전

리눅스는 두 가지 버전의 cgroup을 제공합니다:

Cgroup v1 (Legacy)

  • 각 서브시스템마다 독립적인 계층 구조를 가짐
  • /sys/fs/cgroup/{subsystem} 형태로 마운트
  • 유연하지만 복잡한 구조

Cgroup v2 (Unified Hierarchy)

  • 단일 계층 구조로 모든 서브시스템 통합
  • /sys/fs/cgroup/ 하나의 루트로 통합
  • 더 간단하고 일관된 인터페이스 제공
  • 리눅스 커널 4.5부터 안정화
# cgroup 버전 확인
mount | grep cgroup
# 또는
stat -fc %T /sys/fs/cgroup/
# cgroup2fs 출력 시 v2, tmpfs 출력 시 v1

cgroup-1


Cgroup Commands

  • cgcreate : 새로운 cgroup 생성
  • cgset : cgroup의 파라미터 설정
  • cgexec : 특정 cgroup에서 프로세스 실행
  • cgclassify : 실행 중인 프로세스를 cgroup으로 이동
  • cgdelete : cgroup 삭제
  • lscgroup : 현재 시스템의 cgroup 목록 확인

Docker와 Cgroup

도커는 컨테이너별로 자동으로 cgroup을 생성하여 리소스를 관리합니다.

# 도커 컨테이너 실행 시 리소스 제한
docker run -d --name test-cgroup \
--cpus="1.5" \
--memory="512m" \
--memory-swap="1g" \
nginx

# 컨테이너의 cgroup 확인
docker inspect test-cgroup | grep -i cgroup

# cgroup 도구 설치 (Debian/Ubuntu)
sudo apt-get install cgroup-tools

# CPU 제한 cgroup 생성
sudo cgcreate -g cpu:/test_cpu_limit

# cgroup 리스트 확인
lscgroup

cg-2 cg-3 cg-4


Namespace와 Cgroup의 차이

구분NamespaceCgroup
목적격리 (Isolation)자원 제한 (Resource Limiting)
기능"무엇을 볼 수 있는가""얼마나 사용할 수 있는가"
예시독립적인 PID, 네트워크 뷰CPU 50%, 메모리 512MB 제한
도입 시기2002년 (mount ns)2008년 (커널 2.6.24)

Namespace = What You Can See
Cgroup = How Much You Can Use

두 기술은 컨테이너 기술의 핵심을 이루며, Docker, Kubernetes 등 현대 컨테이너 플랫폼의 기반이 됩니다.


참고 자료