Skip to main content

11/23/2025

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%
  • cg1과 cg2는 각 컨테이너에 할당된 리소스 그룹
  • 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 등 현대 컨테이너 플랫폼의 기반이 됩니다.


참고 자료​