본문 바로가기
Concepts/OS

Introduction to Control Group

by ocwokocw 2025. 3. 17.

- 출처: https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/6/html/resource_management_guide/ch01

 

Chapter 1. Introduction to Control Groups (Cgroups) | Red Hat Product Documentation

FormatMulti-pageSingle-pageView full doc as PDF

docs.redhat.com

 

- Control Group 이란

cgroup은 CPU 시간, 시스템 메모리, 네트워크 대역폭 혹은 이런 리소스들을 조합해서 할당한다. cgroup 을 사용하면 시스템 운영자는 자원 할당, 우선순위, 거부, 관리, 시스템 리소스 모니터를 하는데 있어서 세밀한 제어가 가능하다. 하드웨어 리소스를 작업과 사용자간에 적절히 배분하여 전반적인 효율성을 높일 수 있다.


- Cgroup의 구성

cgroup 은 프로세스 처럼 계층 구조로 되어 있으며, 자식 cgroup 은 부모의 몇몇 속성을 상속받는다. 하지만 프로세스와 cgroup 간의 모델에는 차이점이 존재한다.

 

프로세스 모델은 리눅스 시스템의 모든 프로세스들은 공통 부모의 자식 프로세스들이다. init 프로세스는 부팅 시간에 커널에 의해 실행되고 다른 프로세스들을 실행시킨다. 모든 프로세스는 하나의 부모로부터 파생되기 때문에 리눅스 프로세스 모델은 단일 계층 구조이다.

 

cgroup 모델은 프로세스 모델과 계층 구조인점, 자식 cgroup 이 부모 cgroup 으로 부터 특정 속성들을 상속받는다는 점이 비슷하다.

 

하지만 차이점이 존재하는데 그중 가장 기본적인 차이점은 시스템상에 다양한 계층구조가 존재한다는것이다. cgroup 모델은 1개 이상의 연결되지 않는 작업들의 트리이다.

 

cgroup 의 여러 개별 계층구조가 필요한 이유는 각 계층구조가 1개 이상의 subsystem 에 연결되기 때문에 필요하다. subsystem 은 CPU 시간이나 메모리등의 단일 자원을 표현한다. Read Hat Enterprise Linux 6 의 경우 10 개의 cgroup subsystem 이 존재한다.

  • blkio: 물리 드라이버와 같은 블록 장치로(부터) 접근하거나 가져올 때 입력과 출력의 상한을 설정
  • cpu: cgroup 작업들이 CPU에 접근하는 스케줄러 제공
  • cpuacct: cgroup 에서 작업들에 의해 사용되는 CPU 자원의 자동화된 리포트 생성
  • cpuset: cgroup 에서 작업들에 개별 CPU와 메모리 노드 할당
  • devices: cgroup 에서 작업들의 접근 허용 및 거부
  • freezer: cgroup 에서 작업들의 중지 및 재개
  • memory: cgroup 에서 작업들에 의해 사용되는 메모리 상한 설정 및 이런 작업들이 사용하고 있는 메모리 자원에 대한 자동화된 리포트 생성
  • net_cls: 네트워크 패킷에 클래스 식별재를 태깅하여 리눅스 트래픽 컨트롤러(tc)가 특정 cgroup 작업에서 발생한 패킷인지를 식별할 수 있도록 함
  • net_prio: 네트워크 인터페이스당 네트워크 트래픽의 우선순위를 동적으로 설정
  • ns: 네임스페이스 subsystem
  • perf_event: 작업의 cgroup 멤버십을 식별하고 성능 분석을 위해 사용

- subsystem, 계층구조, cgroup, 작업 간의 관계

cgroup 에서 "작업" 이라 함은 시스템 프로세스라고 생각하면 된다.

 

규칙1: 하나의 단일 구조는 1개 이상의 subsystem 을 갖는다.

 

아래 그림에서 cpu와 memory subsystem (혹은 더 많은 subsystem) 은 각 subsystem이 이미 다른 subsystem이 연결된 다른 계층구조에 연결되어 있지 않는 한 단일 계층 구조에 연결될 수 있다.

 

규칙2: 어떤 subsystem(ex - cpu) 도 하나 계층 구조에 이미 다른 subsystem이 연결되어 있다면 1개 이상의 계층구조에는 연결될 수 없다. 

 

아래 그림에서 cpu subsystem 은 이미 계층 구조중 하나가 memory subsystem 이 연결되어 있기 때문에 두 개의 다른 계층구조에 연결될 수 없다. 하지만 만약 두 계층 구조가 하나의 해당 subsystem 만 연결되어 있을 경우 하나의 subsystem 은 두 계층구조에 연결될 수 있다.

 

규칙3: 특정 시점에 새로운 계층구조가 시스템 상에 생성되면 모든 작업은 root cgroup 이라는 계층 구조의 기본 cgroup 초기 멤버가 된다. 생성한 하나의 계층구조를 위해 시스템 상의 각 작업은 정확히 해당 계층구조내의 하나의 cgroup의 멤버가 될 수 있다. 하나의 단일 작업은 각 cgroup이 서로 다른 계층구조에 있는 한 여러 cgroup에 속할 수 있다. 작업이 같은 계층구조에서 2번째 cgroup의 멤버가 되면 곧바로 해당 계층구조내의 1번째 cgroup 에서 해당 작업이 제외된다. 어떤 작업이 같은 계층구조에서 서로 다른 2개의 cgroup 내에 속하는 시점은 존재하지 않는다.

 

아래 그림에서 만약 cpu와 memory subsystem 이 cpu_mem_cg 라는 이름의 계층구조에 연결되고, net_cls subsystem이 net 이라는 이름의 계층 구조에 연결된 상태에서 httpd 프로세스는 cpu_mem_cg 내의 하나의 cgroup 멤버이면서 net 내의 cgroup 멤버가 될 수 있다.

 

httpd 프로세스가 멤버인 cpu_mem_cg 내의 cgroup 은 다른 프로세스에 할당된 CPU 시간의 절반으로 제한할 수 있으며, 메모리 최대 사용량을 1024MB 로 제한할 수 있다. 또한 httpd 프로세스가 멤버인 net 내의 cgroup은 전송속도를 30MB/s 로 제한할 수 있다.

 

처음 계층구조가 생성되면 시스템상의 몯느 작업은 적어도 하나의 cgroup (root cgroup) 멤버가 된다. 그러므로 cgroup을 사용할 때 모든 시스템 작업은 적어도 하나의 cgroup에 속한다.

 

규칙4: 시스템상에서 자기자신을 fork 한 프로세스는 자식 작업을 생성한다. 모든 자식 작업은 자동으로 부모의 cgroup 멤버십을 상속받지만 필요에 따라 다른 cgroup 으로 옮길 수 있다. 한번 fork 되면 부모와 자식 프로세스는 완전 독립적이다.

 

아래 그림에서 httpd 작업은 cpu_and_mem 계층구조내의 half_cpu_1gb_max 라는 이름의 cgroup 멤버이고, net 계층구조 내의 trans_rate_30 이라는 cgroup 의 멤버라고 가정해보자. httpd 프로세스가 자기자신을 fork 하면 그의 자식 프로세스는 자동으로 half_cpu_1gb_max cgroup과 trans_rate_30 cgroup의 멤버가 된다. 부모 작업과 정확하 같은 cgroup을 상속받는다.

 

그 이후로 부모와 자식 작업은 서로 완전히 독립적이다. 하나의 작업이 속한 cgroup의 변화는 다른 작업에게 영향을 주지 않는다. 부모 작업의 cgroup을 변경해도 그 자식의 자식들(손자)에 아무런 영향을 미치지 않는다. 요약하면 모든 자식은 처음에 부모작업과 동일 cgroup 멤버십을 상속받지만 나중에 이런 멤버십을 변경 및 삭제할 수 있다.

'Concepts > OS' 카테고리의 다른 글

Memory management concepts  (0) 2025.02.02
File System  (0) 2024.11.03
Limited Direct Execution  (0) 2024.05.25
Process API  (0) 2024.05.15
Process Abstraction  (0) 2024.05.05

댓글