Cgroup 이란?
Cgroup(Control Group)은 프로세스들이 사용하는 시스템 자원의 사용 정보를 수집하고, 이를 제한할 수 있도록 해주는 리눅스 커널 기술입니다. 이를 통해 특정 프로세스 그룹의 CPU, 메모리, 네트워크, 디스크 I/O와 같은 리소스 사용량을 제어하고 관리할 수 있습니다.
Cgroup의 주요 기능
1. 자원 제한
cgroups를 사용하면 관리자는 프로세스 그룹이 사용할 수 있는 자원 양을 제한할 수 있습니다. 여기에는 CPU 사용량, 메모리, 블록 장치 I/O 등이 포함됩니다. 이러한 경계를 설정함으로써 시스템 리소스의 남용을 방지할 수 있습니다
2. 우선순위 지정
자원 제한과는 다르게, 우선순위 지정을 통해 특정 프로세스가 다른 프로세스보다 더 많은 시스템 시간을 갖도록 할 수 있습니다. 이를 통해 중요한 작업이 원활히 수행될 수 있습니다
3. 회계 처리
cgroups는 어떤 프로세스가 어떤 자원을 얼마나 사용하고 있는지 추적할 수 있습니다. 이는 주로 성능 모니터링과 자원 사용의 투명성을 제공하기 위해 사용됩니다
4. 프로세스 제어
cgroups의 freezer 기능을 통해 특정 프로세스의 스냅샷을 찍고 이동시킬 수 있습니다. 이는 프로세스 관리와 마이그레이션에 유용합니다
Cgroup의 구조
cgroups는 계층적으로 구성되어 있으며, 각 자원 컨트롤러는 트리 구조를 가집니다. 각 트리의 브랜치나 리프는 자체적인 가중치나 제한을 가질 수 있습니다. 이로 인해 자원 사용을 세밀하게 조정할 수 있습니다
주요 서브 시스템
Cgroup은 자원별로 다양한 서브 시스템을 통해 자원을 관리하고 제어합니다. 대표적으로 다음과 같은 서브 시스템이 있습니다
- cpu: CPU 사용량을 제한하거나 특정 프로세스 그룹이 사용할 수 있는 CPU 자원을 할당합니다.
- memory: 메모리 사용량을 제한하고 메모리 누수 등을 방지할 수 있습니다.
- cpuacct: CPU 사용량을 계정 단위로 수집하여 보고합니다.
- blkio: 블록 장치(예: HDD, SSD)의 I/O 속도를 제어합니다.
- devices: 특정 프로세스 그룹이 사용할 수 있는 디바이스(예: 특정 디스크나 네트워크 장치)를 제한합니다.
- freezer: 프로세스 그룹을 일시적으로 정지하거나 재개할 수 있습니다.
- net_cls: 네트워크 트래픽을 특정 클래스(Class)로 구분하여 QoS (Quality of Service)를 적용할 수 있습니다.
활용 사례
- 컨테이너 관리: Docker, runc, LXC와 같은 컨테이너 기술은 Cgroup을 이용하여 컨테이너별 리소스 사용량을 제어합니다.
- 클러스터 관리: YARN(Hadoop)과 같은 클러스터 리소스 관리 시스템도 Cgroup을 사용하여 리소스를 효율적으로 관리합니다.
- 모바일 OS: Android에서도 애플리케이션 간 리소스 관리에 Cgroup이 사용됩니다.
- 가상화 환경: 리소스를 분리하여 특정 가상 머신이나 애플리케이션이 과도한 자원을 점유하지 못하게 할 수 있습니다.
Cgroup 종류
Cgroups V1
cgroups의 초기 버전인 V1은 각 자원 컨트롤러가 독립적으로 작동하는 구조입니다. 이는 다양한 컨트롤러가 각각 별도의 트리 구조를 가지며, 이를 통해 프로세스 그룹의 자원 사용을 관리합니다 control 대상이 되는 리소스들을 기준으로 control 구룹들을 나눔
Cgroups V2
V2는 단일 계층 구조를 도입하여 자원 관리의 명확성과 효율성을 높였습니다. V2에서는 프로세스가 계층의 리프 노드에만 할당될 수 있으며, 모든 프로세스의 스레드는 동일한 cgroup에 있어야 합니다. 이는 자원 공유를 명확히 하고, 관리의 복잡성을 줄여줍니다 control 대상이 되는 워크 로드들을 기준으로 control 구룹들을 나눔
시스템에서 Cgroups 사용하기
1. 컨트롤러 마운트
/etc/cgconfig.conf 파일을 생성하고, 파일 시스템의 마운트 포인트를 설정합니다. 예를 들어, cpu 컨트롤러를 /dev/cgroups/cpu에 마운트할 수 있습니다
2. 그룹 생성
자원 사용 매개변수를 정의하는 그룹을 생성합니다. 예를 들어, virtual이라는 그룹을 생성하여 블록 장치 I/O에 대한 접근을 제한할 수 있습니다
Cgroups와 같이 쓰면 좋은 도구
1. Systemd와 Cgroup
- 서비스별 자원 제한 설정
- 서비스의 자원 사용 모니터링
- 부하 분산 및 성능 최적화
- 시스템 부팅 및 서비스 시작/중지 관리
2. Kubernetes와 Cgroup
- 컨테이너의 CPU, 메모리
- 디스크 I/O 제한 리소스 쿼터 설정 및 모니터링
- 자동화된 확장 및 자원 할당
3. Docker와 Cgroups
- 컨테이너의 자원 제한 설정
- 컨테이너 간 자원 격리
- 성능 모니터링 및 튜닝
4. 그외
- 자원 할당 및 격리 목적으로 가상화 환경에서 사용됨
- 보안 강화 목적으로 특정 프로세스의 자원 접근 제어에 사용됨
- 성능 모니터링 및 튜닝 목적으로 실시간 자원 사용 모니터링에서 사용됨(ex, Prometheus, Grafana)
- HPC 클러스터에서 작업 분배 및 자원 관리 목적으로 사용됨
- 데스크톱 환경에서 사용자 프로세스 자원 제한을 목적으로 사용됨
'Linux' 카테고리의 다른 글
[Linux] 리눅스에서 디렉토리를 분할하여 압축하는 방법 (0) | 2024.10.28 |
---|---|
[Linux_Ubuntu24.04] Module 설정(CUDA 설치 후 module 설정) (0) | 2024.10.25 |
[Rockylinux] 이더넷 명 바꾸기(네트워크 인터페이스 이름 바꾸기) (0) | 2024.09.11 |
[Ubuntu] PostgreSQL 수동 설치 (0) | 2024.08.28 |
[Rocky linux 8] Cmake 명령어 다운로드 및 설치(수동 설치) (0) | 2024.06.29 |