cgroup(Control Groups)

리눅스에서 cgroup(Control Groups)은 프로세스의 리소스 사용을 제어하고 모니터링하기 위한 기능입니다.

cgroup은 CPU, 메모리, 디스크 I/O, 네트워크 대역폭과 같은 시스템 리소스를 프로세스 그룹 단위로 관리할 수 있게 해줍니다.

이를 통해 시스템 리소스를 보다 효율적으로 관리하고, 리소스가 부족한 상황에서 특정 프로세스나 프로세스 그룹이 다른 프로세스에 영향을 주지 않도록 할 수 있습니다.

 


cgroup의 주요 기능:

  1. 리소스 제한
    : cgroup을 사용하면 특정 프로세스 그룹이 사용할 수 있는 리소스를 제한할 수 있습니다.
    : 예를 들어, 메모리 사용량을 제한하거나 CPU 사용량을 제한할 수 있습니다.
  2. 리소스 할당
    : 여러 프로세스 사이에서 시스템 자원을 효율적으로 분배할 수 있습니다.
    : 예를 들어, 중요한 작업에 더 많은 CPU 시간을 할당할 수 있습니다.
  3. 리소스 계량(Monitoring)
    : cgroup은 프로세스의 리소스 사용을 추적할 수 있는 기능을 제공합니다.
    : 이를 통해 시스템 성능을 모니터링하고, 문제가 발생했을 때 어떤 프로세스가 리소스를 과도하게 사용하는지 파악할 수 있습니다.
  4. 리소스 격리
    : 컨테이너와 같은 환경에서 프로세스가 서로 격리된 상태에서 실행되도록 할 수 있습니다.
    : 이렇게 하면 각 프로세스 그룹이 독립적으로 실행되고 서로의 리소스에 영향을 주지 않습니다.

cgroup의 구조

cgroup은 hierarchy(계층 구조)를 기반으로 동작합니다.
계층 구조는 여러 개의 subsystem(서브시스템)으로 구성되며, 각 서브시스템은 특정한 리소스(예: CPU, 메모리)를 관리합니다.

  • cgroup hierarchy
    : 프로세스가 속한 cgroup은 트리 구조로 구성되며, 리소스 제한은 상위 cgroup에서 하위 cgroup으로 상속됩니다.
  • subsystems:
    • cpu: 프로세스의 CPU 사용량을 제어.
    • memory: 프로세스의 메모리 사용량을 제어.
    • blkio: 블록 장치(I/O 디스크)의 입출력 제어.
    • net_cls, net_prio: 네트워크 대역폭을 제어.

cgroup 버전

  • cgroup v1
    : 초기 버전으로 각 서브시스템이 독립적으로 관리됩니다.
  • cgroup v2
    : 개선된 버전으로 통합된 계층 구조를 사용하여 보다 효율적인 리소스 관리가 가능합니다.
    : cgroup v2는 프로세스에 대해 더욱 정교한 제어를 제공합니다.

cgroup 사용 예시

다음은 CPU 사용을 제한하는 간단한 cgroup 설정 예시입니다:

  1. cgroup 디렉토리 생성
    : sudo mkdir /sys/fs/cgroup/cpu/my_group
  2. 특정 CPU 사용량 제한 설정 (예: 50% CPU)
    : echo 50000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_quota_us
  3. 프로세스를 cgroup에 추가
    : echo <PID> > /sys/fs/cgroup/cpu/my_group/tasks

이와 같이 cgroup을 사용하면 특정 프로세스의 리소스 사용량을 제어할 수 있습니다.


코어파일 VS 인터페이스파일

  • 코어 파일
    : cgroup 환경에서 코어 파일은 프로그램이 비정상적으로 종료될 때 생성되며, cgroup의 리소스 제한으로 인해 발생한 충돌을 디버깅하는 데 사용될 수 있습니다.
  • 인터페이스 파일
    : cgroup에서 인터페이스 파일은 /sys/fs/cgroup 디렉토리에 위치한 파일들로, CPU, 메모리, 디스크 I/O와 같은 리소스의 제어 및 관리를 위해 사용됩니다.
# 특정 cgroup에 메모리 사용량을 제한하는 경우
echo 512M > /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes

# CPU 사용량을 제한하는 경우
echo 20000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us

컨테이너와 cgroup

cgroup은 컨테이너 기술(예: Docker, LXC)의 핵심 구성 요소 중 하나입니다.
컨테이너는 cgroup을 사용해 각 컨테이너가 시스템 리소스를 고립된 환경에서 사용할 수 있도록 합니다.

cgroup을 통해 여러 프로세스가 동시에 실행되더라도 각각의 프로세스가 서로의 리소스 사용에 영향을 주지 않게 제어할 수 있는 것입니다.