리눅스

리눅스 Cgroup

@xftg77g 2022. 9. 30. 02:44

Cgroup 기본 개념

Cgroup은 Control Group의 약자로 다수의 Process가 포함되어 있는 Process Group 단위로 컴퓨팅 자원의 사용량을 제한하고 격리시키는 Linux의 기능입니다. 여기서 컴퓨팅 자원은 CPU, Memory, Disk, Network를 의미합니다. Cgroup은 주로 Container의 Resource 제어를 위해서 많이 사용됩니다.

 

 

위 그림은 Container와 Cgroup의 관계를 나타내고 있습니다. Container가 생성되면 Container의 Process들을 담당하는 Container Cgroup이 생성됩니다.

 

Container의 모든 Process들은 해당 Container Cgroup에 소속됩니다. Container 내부 Process들이 Fork System Call을 통해서 Child Process들을 생성해도 모두 Container Cgroup에 소속됩니다. 즉 Container가 점유하는 컴퓨팅 자원을 제어하기 위해서는 Container Cgroup을 제어하면 됩니다.

 

Systemd를 이용하여 Cgroup 제어하기

systemd는 Linux의 Init Process로써 Daemon Process 제어 역할과 더불어 Cgroup을 제어하는 역할도 수행합니다.

 

systemd의 Cgroup 제어 기능은 systemd가 제어하는 Unit의 일부 기능으로 포함되어 있습니다. 여기서 unit은 Daemon Process입니다. 즉 systemd의 Cgroup 제어 기능은 자신이 제어하는 Daemon Process의 컴퓨팅 자원을 제어하는 기능입니다.

(root)# systemd-run --unit=myunit sleep infinity # (1)
Running as unit: myunit.service 
(root)# ps -ef | grep sleep # (2)
5255
(root)# cd /sys/fs/cgroup/memory/system.slice # (3)
(root)# ls
...
myunit.service
...
(root)# cd myunit.service # (4)
(root)# cat cgroup.procs # (5)
5255

 

(1)

systemd-run 명령어는 systemd가 제공하는 API를 이용하여 Unit(Daemon Process)을 생성하고 실행하는 명령어입니다.

 

(2)

생성한 Unit의 PID를 얻습니다.

 

(3)

systemd는 생성한 Unit의 Cgroup을 기본적으로 /sys/fs/cgroup/memory/system.slice 경로의 하위에 생성합니다. 해당 경로 하위에 myunit.service라는 Cgroup이 생성된 것을 볼 수 있습니다.

 

(4)

또한 myunit.service라는 Cgroup에 5255 PID를 갖고 있는 sleep Process가 소속되어 있는 것을 확인할 수 있습니다. 

 

Subsystem?

Cgroup을 찾아보면 서브시스템이라는 개념도 나옵니다. 서브 시스템이란 Cgroup에 속한 프로세스의 동작을 조절하는 컴포넌트입니다. 다양한 서브시스템이 구현되어 있는데 Cgroup에 속한 프로세스가 사용할 수 있는 컴퓨팅 자원을 조절할 수 있는 컨트롤러 역할을 맡는다고 보시면 될 것 같습니다.

 

(즉, 자원 컨트롤러 == 서브시스템)

 

서브시스템은 계층 구조를 가지고 있어서 부모 계층의 속성(제한?)은 자식 계층으로 전파됩니다. 예를들어 자식 계층에서 부모 계층의 속성 이상을 설정하더라도 부모 계층의 속성에 의해서 제한됩니다. 

 

서브시스템의 일부를 나열해 보겠습니다.

  • blkio: 물리 드라이브와 같은 블록 장치에 대한 입/출력 액세스 제한을 설정합니다.
  • cpu: CPU에 Cgroup 작업 액세스를 제공하기 위해 스케줄러를 사용합니다.
  • cpuacct: Cgroup의 작업에 사용된 CPU 자원에 대한 보고서를 자동으로 생성합니다.
  • devices: Cgroup의 작업 단위로 장치에 대한 액세스를 허용하거나 거부합니다.
  • freezer: Cgroup의 작업을 일시 중지하거나 다시 시작합니다.
  • memory: Cgroup의 작업에서 사용되는 메모리에 대한 제한을 설정하고 이러한 작업에서 사용되는 메모리 자원에 대한 보고서를 자동으로 생성합니다.
  • net_cls: Linux 트래픽 컨트롤러(tc)가 특정 Cgroup 작업에서 발생하는 패킷을 식별하게 하는 클래식 식별자(classid)를 사용하여 네트워크 패킷에 태그를 지정합니다.
  • ns: namespace   

 

Ref

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/6/html/resource_management_guide/ch01

 

1장. 컨트롤 그룹 (Cgroups) 소개 Red Hat Enterprise Linux 6 | Red Hat Customer Portal

Access Red Hat’s knowledge, guidance, and support through your subscription.

access.redhat.com

https://man7.org/linux/man-pages/man7/cgroups.7.html

 

cgroups(7) - Linux manual page

cgroups(7) — Linux manual page CGROUPS(7) Linux Programmer's Manual CGROUPS(7) NAME         top cgroups - Linux control groups DESCRIPTION         top Control groups, usually referred to as cgroups, are a Linux kernel feature which allow processe

man7.org

https://tech.kakao.com/2020/06/29/cgroup-driver/

 

Cgroup Driver 선택하기

안녕하세요, 클라우드기술팀 ssup이라고 합니다. 카카오에서는 DKOS라고 불리는 Kubernetes 기반 Container Platform을 개발 & 운영하고 있습니다. DKOS를 안정적으로 운영하기 위해서 Kubernetes를 분석하는

tech.kakao.com