컨트롤 그룹 (Control Groups, cgroups): 컨트롤 그룹은 리눅스 커널의 기능으로, 프로세스 그룹의 자원 사용량(메모리, CPU, 네트워크, 디바이스, 디스크 I/O, Block I/O 등)을 제한하고 격리하며 관리합니다. cgroups는 시스템 자원을 세밀하게 관리하고, 한 컨테이너가 호스트의 모든 자원을 독점하는 것을 방지하여 시스템의 안정성을 유지하도록 돕습니다.
특징:
이는 리소스 사용량을 제한하고, 프로세스를 격리하며, 여러 프로세스를 관리하는 Linux 커널 기능입니다.
서브시스템에는 blkio, cpu, cpuacct, cpuset, devices, freezer, memory, net_cls, ns 등이 있습니다.
cpu:
특정 cgroup에 할당된 프로세스가 사용할 수 있는 CPU 자원의 양을 제한(스케줄러를 이용해)할 수 있습니다. 예를 들어, CPU 사용을 10%로 제한하는 등의 설정이 가능합니다.
이 기능을 통해 시스템의 CPU 자원을 공정하게 분배하고, 시스템 오버로드를 방지할 수 있습니다.
memory:
cgroup에 할당된 메모리 사용량을 제한합니다. 메모리 사용량을 128MB로 설정하면, 해당 그룹은 그 이상의 메모리를 사용할 수 없습니다. 만약 메모리 사용량이 한계치에 도달하면, OOM(out-of-memory) 관리자가 작동할 수 있으며, 필요하다면 프로세스를 종료시키는 등의 조치를 취할 수 있습니다.
freezer:
cgroup의 프로세스를 일시 정지하거나 다시 시작할 수 있습니다. 이를 통해 도커와 같은 컨테이너 관리 도구에서 컨테이너를 일시 중지(docker pause)하거나 상태를 관리하는 데 사용됩니다.
blkio:
cgroup에 할당된 프로세스가 디스크 I/O에 접근하는 방법을 제어하고, I/O 대역폭을 제한할 수 있습니다. 이는 I/O 자원의 공정한 사용을 보장하고, 시스템 성능에 미치는 영향을 최소화하는 데 도움이 됩니다.
net_cls:
이 서브시스템은 Linux 트래픽 컨트롤러(TC)와 함께 작동하여 트래픽을 cgroup에 따라 분류합니다. 네트워크 트래픽의 classid를 설정하여 네트워크 패킷에 대한 처리 우선순위를 조정할 수 있습니다.
cpuset:
프로세스가 실행될 수 있는 특정 CPU 코어나 메모리 노드를 지정합니다. 이를 통해 시스템의 특정 리소스를 고정시켜 사용할 수 있으며, 멀티 프로세싱 환경에서 성능 최적화에 도움이 됩니다.
devices:
cgroup의 프로세스가 특정 디바이스에 접근할 수 있는 권한을 제어합니다. 필요한 디바이스만 사용할 수 있도록 제한함으로써 보안을 강화하고 시스템의 안정성을 높일 수 있습니다.
ns (namespace):
프로세스에 대한 격리를 제공하는 네임스페이스 기능으로, 시스템의 다른 부분으로부터 프로세스를 독립적으로 분리할 수 있습니다. 이는 프로세스 간의 리소스 충돌을 방지하고, 시스템의 여러 환경을 동시에 실행하는 데 사용됩니다.
이러한 cgroups와 네임스페이스 기능은 컨테이너 기술의 기반이 되며, 리눅스 시스템에서 강력한 리소스 관리와 격리를 가능하게 합니다. 컨테이너가 각기 독립적인 환경에서 실행되면서도 리소스를 효율적으로 사용할 수 있도록 지원합니다.
cgroups버전:
cgroupsv1은 개별 리소스 유형에 따라 별도의 계층적 관리를 제공합니다. 이는 각 리소스 유형에 대한 세밀한 제어를 가능하게 하지만, 관리의 복잡성을 증가시킵니다.
cgroupsv2는 단일 계층 구조를 가지고 있어 사용자가 시스템 리소스를 더 쉽게 관리할 수 있게 해줍니다. 또한, v2는 v1보다 향상된 기능과 효율성을 제공합니다.
장점:
시스템 리소스를 공정하게 분배하고 오버커밋(overcommit)을 방지합니다.
특정 애플리케이션의 리소스 사용을 제한하여 시스템의 안정성과 예측성을 향상시킵니다.
단점:
cgroups의 세부 설정은 복잡할 수 있고, 잘못 구성하면 성능에 부정적 영향을 줄 수 있습니다.
활용 사례:
1. runc
runc는 Open Container Initiative (OCI) 표준에 따른 컨테이너 런타임으로, Docker 및 다른 컨테이너화 플랫폼에서 널리 사용됩니다.
runc는 cgroups를 사용하여 각 컨테이너 프로세스에 필요한 리소스(예: CPU, 메모리)를 할당하고 제한합니다.
이를 통해 개별 컨테이너가 시스템의 리소스를 과도하게 사용하는 것을 방지하여 시스템의 안정성을 유지합니다.
2. YARN (Hadoop)
YARN은 Hadoop 데이터 처리를 위한 클러스터 리소스 관리 시스템입니다.
cgroups를 활용하여 각 작업(job)에 대한 리소스 사용량을 제한하고 관리합니다. 특히, 대규모 데이터 처리에 필요한 CPU와 메모리 자원을 효율적으로 분배합니다.
작업의 성능을 보장하면서도 다른 작업과 자원을 공정하게 공유할 수 있도록 합니다.
3. Android
Android는 애플리케이션의 Foreground 및 Background 작업 관리를 위해 cgroups를 사용합니다.
사용자 인터페이스와 상호 작용하는 애플리케이션에 대해 자원 사용에 제한을 거의 두지 않으며, 이를 통해 사용자 경험을 최적화합니다.
Background에서 실행되는 애플리케이션의 경우, 네트워크 사용, 스토리지 액세스 및 CPU 사용량에 제한을 두어 배터리 수명을 연장하고 시스템 성능을 유지합니다.
차이점:
네임스페이스가 격리를 제공한다면, cgroups는 이 격리된 환경에서의 리소스 사용을 관리합니다.
2. 네임스페이스 (Namespaces)
네임스페이스 (Namespaces): 네임스페이스는 리눅스 시스템 내에서 프로세스 그룹을 격리하여 각 그룹이 서로의 시스템 자원을 볼 수 없게 만드는 기술입니다. 네임스페이스는 파일 시스템, 네트워크, 사용자 ID 등 여러 시스템 자원을 격리하여 프로세스가 독립적인 환경에서 실행되는 것처럼 느낄 수 있게 합니다. 이를 통해 하나의 시스템에서 여러 개의 독립적인 컨테이너를 실행할 수 있습니다.
특징:
시스템 리소스를 프로세스 그룹 단위로 격리합니다.
PID, 네트워크, IPC, 마운트, 호스트 이름 등 다양한 유형의 네임스페이스가 있습니다.
장점:
각 컨테이너에 대해 독립적인 시스템 환경을 제공합니다.
한 컨테이너의 변경이 다른 컨테이너에 영향을 주지 않습니다.
단점:
근본적인 호스트 OS의 취약점에는 영향을 받을 수 있습니다.
네임스페이스를 너무 많이 만들 경우 관리가 복잡해질 수 있습니다.
활용 사례:
Docker, Podman과 같은 컨테이너화 플랫폼에서 각 컨테이너에게 별도의 호스트 이름, 네트워크 스택을 제공합니다.
차이점:
cgroups가 리소스 할당과 제한에 중점을 두는 반면, 네임스페이스는 프로세스 레벨의 격리에 중점을 둡니다.
3. 유니언 파일 시스템 (Union File Systems)
유니언 파일 시스템 (Union File Systems): 유니언 파일 시스템은 여러 파일 시스템 계층을 오버레이(overlay) 방식으로 합쳐서 하나의 파일 시스템으로 표현하는 기술입니다. 이를 통해 읽기 전용의 기반 이미지를 유지하면서도, 변경 사항을 쓰기 가능한 최상위 계층에 저장할 수 있습니다. 이 방식은 컨테이너의 스토리지 효율성을 높이고, 이미지 계층을 공유하여 다양한 컨테이너 이미지 사이의 중복을 줄일 수 있습니다.
특징:
여러 파일 시스템을 하나로 병합하여 단일 파일 시스템처럼 관리할 수 있게 합니다.
읽기 전용과 쓰기 가능 계층을 분리하여 효율적인 파일 시스템 관리를 가능하게 합니다.
장점:
컨테이너의 기본 이미지를 변경하지 않고도 수정 사항을 저장할 수 있습니다.
이미지 계층을 통해 중복을 줄이고 스토리지 효율성을 향상시킵니다.
단점:
유니언 파일 시스템의 성능은 사용하는 특정 구현에 따라 다를 수 있으며, 때로는 기본 파일 시스템보다 느릴 수 있습니다.
활용 사례:
Docker에서 컨테이너의 파일 시스템 계층을 관리하고, 공유 이미지를 통해 여러 컨테이너 간의 재사용성을 높입니다.
차이점:
네임스페이스나 cgroups와는 달리, 유니언 파일 시스템은 파일 레벨에서 격리와 리소스 관리를 수행합니다.
이 세 가지 기술은 함께 사용될 때 리눅스 기반 컨테이너의 강력한 격리, 리소스 관리 및 파일 시스템 효율성을 제공합니다.