회고/Today I Learned

리눅스와 도커 - Cgroups

Understand 2021. 6. 20. 22:14

배경

도커와 같은 컨테이너 기술은 namespace와 Cgroup 이라는 리눅스 커널의 기능을 사용한다.
namespace는 프로세스를 격리하는 기술이다. 이번에는 Cgroup에 대해서 알아보았다.

요약

Cgroups는 하나 혹은 복수개의 프로세스의 시스템 자원의 사용을 격리하는 기술이다.
컨테이너 기술은 namespace와 프로세스를 격리하고, 해당 프로세스가 사용할 수 있는 자원은 Cgroup으로 격리하는 방식으로 동작한다.
즉, 프로세스들이 각각 다른 머신을 운영하는 것과 같이 사용할 수 있다.

Cgroups (Control Groups)

리눅스 매뉴얼 페이지에서 Cgroups의 정의를 다음과 같이 하고 있다.

Control groups, usually referred to as cgroups, are a Linux kernel feature which allow processes to be organized into hierarchical groups whose usage of various types of resources can then be limited and monitored.

Cgroups는 프로세스들의 시스템 자원의 사용을 제한하고 격리하는 리눅스커널의 기능이다.
Cgroup은 시스템 자원이 제한된 프로세스들의 집합을 가리킨다. 시스템 자원의 제한 정도는 Cgroupfs (Cgroup filesystem)이라는 pseudo-filesystem에 의해 지정된다. Cgroupfs는 계층구조로 되어 있다. Cgroupfs의 각 레벨마다 attribute(e.g. limit)을 정의하고, high level에서 지정한 자원 가용량은 low level에서 지정된 자원 가용량을 초과할 수 없다.
Subsystem은 Cgroup 내의 프로세스의 동작을 컨트롤하는 커널 컴포넌트이다. Subsystem은 프로세스가 사용가능한 CPU Time, Memory available등을 조절할 수 있고, 프로세스 실행을 잠시 중단하거나(freezing) 재시작할 수 있다(Resuming). Subsystem은 Resource controller 또는 Controller라고도 한다.

Cgroup v1과 Cgroup v2

Cgroup은 linux 2.6.24 부터 지원했다. 하지만 이 당시에 개발되던 cgroup은 매우 복잡했다. 따라서 이를 개선하고자 Cgroup v2를 구현했다. 하지만 아직 Cgroup v2는 Cgroup v1의 기능의 일부만을 지원하기 떄문에, 두 구현 모두 리눅스에 남아 있다. 따라서 같은 Controller가 Cgroup v1과 Cgroup v2에 동시에 사용되지 않는한 둘 모두를 사용해 프로세스의 시스템 자원을 제한할 수 있다.

아직 모르는 것

  • Cgroup v2의 subsystem
  • Cgroup 의 구체적인 동작방법

참고자료