제한 가능한 자원: CPU, Memory, Network, Device, Block I/O (Block Device(SSD, USB 등의 일반적인 storage)로 내려가는 속도,성능 제한)
활용 사례
runc(OCI를 준수하며 컨테이너를 실행하는 container runtime 툴)
YARN (Hadoop 리소스 관리)
Android
사용자 편의를 위해 분리해 구성되어 있어 foreground / backgroud로 나뉜다. (foreground 의 작업에는 리소스를 더 할당하는 등)
cgroup의 버전
v1 : control하는 대상의 리소스에 대해 개별적으로 cgroup을 만들어줘야 한다.
대부분은 v1을 사용한다. (Docker, k8s 등)
v2 : 사용자 편의를 위해, bg(background)로 도는 어플리케이션, adhoc 작업을 분리해 제약을 걸 수 있다.
adhoc 분석 : 특별한 목적을 위해 만들어진 데이터를 다양한 측면에서의 심측 분석을 통해 보다 깊은 통찰을 지닌 결과를 이끌어 내는 것
짧게, "어떤 목적을 가지고 데이터 분석을 요청하는 경우" adhoc분석이라고 한다.
사용 가능한(Control 가능한) 서브시스템
cpu : 스케줄러(CFS scheduler)를 이용해 해당 cgroup 에 속한 프로세스 CPU 사용 시간을 제어
예) 해당 그룹의 CPU사용량 10%로 제한 → 10% 초과 사용 시
애초에 스케줄러에게 10%만 할당 받기 때문에 그 이상 요청을 하더라도 사용이 불가하다.
memory : 해당 cgroup에 속한 프로세스의 메모리 사용량에 대한 제어
예) 해당 그룹의 메모리 사용량을 128MB로 제한 → 128MB 초과 사용 시
메모리의 경우 어플리케이션이 요청하는 만큼 할당되기 때문에 OOM 발생하게 된다. (oom_control로 OOM 관련 제어 가능)
freezer : cgroup의 작업을 일시 중지하거나 다시 시작 → docker pause
blkio : cgroup에 block device에 대한 입력/출력 제한을 설정 (저장공간 제한 개념 아님)
net_cls : 이 서브시스템은 Linux 트래픽 컨트롤러 (tc)가 특정 cgroup 작업에서 발생하는 패킷을 식별하게 하는 클래식 식별자(classid)를 사용하여 네트워크 패킷에 태그를 지정
cpuset : 개별 CPU 및 메모리 노드를 cgroup에 할당 (성능이 중요한 경우, 캐시 히트를 높이고 싶은 경우 활용할 수 있다.)
CPU 코어 별로 원하는 task들을 할당할 수 있어 코어 간 스위칭되는 로드를 감소시킬 수도 있다.
cpuacct : cgroup이 사용한 CPU 자원에 분석 통계를 생성 및 제공
devices : cgroup의 작업 단위로 장치에 대한 액세스를 허용하거나 거부
ns : namespace 서브시스템
추가 활용 사례
case 1. Web 서비스 (Facebook)
core는 중요하기에 제한 없고, non-core, debugging 을 위한 경우는 제한을 둔다.
case 2. Kubernetes Pod
Docker에서는 OCI 표준을 준수하는 containerd라는 Container Runtime을 만들고, Kubernetes에서는 OCI 표준을 준수하는 이미지들을 실행할 수 있는 Container Runtime Interface, 이하 CRI 스펙을 버전 1.5부터 제공함으로써 Docker 버전과 무관하게 OCI 표준을 준수하기만 하면 어떤 컨테이너 이미지도 Kubernetes에서 실행가능한 환경이 만들어지게 되었다.
컨테이너를 구성하는 3가지 주요 리눅스 기술
cgroups (Control Groups)
추가 활용 사례
실습
cgroup으로 Anti Virus 앱 CPU사용 제한하기
top
명령어로 확인해보면 CPU 점유율이 10%인 것을 확인할 수 있다.cpu.cfs_quota_us
의 값을 변경해 CPU 사용량을 5%로 제한해보자.실습
cgroup으로 fork bomb 막기
시나리오
:(){ :|:& };:
실습