Cgroup 이란 ?

Yang HyunIl·2024년 2월 1일
0

Container

목록 보기
1/1

0. 컨테이너를 구성하는 대표적인 리눅스 기술

  • Control groups : 리소스 사용량 결정
  • Namespaces : 자원을 격리(공개 범위를 결정)
  • Union mount file system : 컨테이너를 효율적으로 관리

1. Cgroup(Congrol Groups)이란?

  1. 리눅스 커널의 기능으로, 프로세스들의 그룹화 및 이들 그룹의 시스템 리소스(예: CPU 시간, 시스템 메모리, 네트워크 대역폭 등) 사용을 관리하고 제한하는 데 사용됨
  2. Cgroup은 프로세스들이 사용하는 시스템의 자원의 사용 정보를 수집하고, 제한시키고, 격리시키는 리눅스 커널 기능(모든 프로세스에 대해 리소스 사용 정보를 수집함)을 한다.

cgroup을 사용하면 시스템 관리자는 다양한 시스템 리소스를 더 세밀하게 제어 가능

  • cgroup의 주요 기능

    1. 리소스 제한: cgroup을 사용하면 특정 프로세스 그룹에 할당된 CPU 시간, 메모리 사용량, I/O 대역폭 등을 제한할 수 있습니다. 이를 통해 시스템의 안정성을 높이고 리소스 사용을 효율적으로 관리할 수 있습니다.
    2. 우선순위 할당: 다른 프로세스 그룹에 서로 다른 CPU 스케줄링 우선순위 또는 I/O 대역폭 우선순위를 할당할 수 있습니다. 이를 통해 중요한 작업에 더 많은 리소스를 할당하고, 덜 중요한 작업은 제한할 수 있습니다.
    3. 계정 및 보고: cgroup을 사용하면 시스템 리소스 사용에 대한 상세한 보고와 분석이 가능합니다. 이를 통해 시스템의 리소스 사용 패턴을 이해하고 필요한 조정을 할 수 있습니다.
    4. 프로세스 관리: cgroup은 프로세스를 그룹으로 관리할 수 있게 해줍니다. 예를 들어, 특정 그룹에 속한 모든 프로세스를 한 번에 중지시키거나 재시작하는 것이 가능합니다.
  • cgroup과 컨테이너의 관련 내용

    • CPU : 스케줄러를 사용하여 해당 cgroup에 속한 프로세스 CPU 사용 시간을 제어함
    • memory : 해당 cgroup에 속한 프로세스의 메모리 사용량을 제어함초과 시 oom 발생(oom_control로 관리할 수 있음)
    • freezer : cgroup의 작업을 일시중지하거나 다시 시작함마치 도커의 pause/unpause와 같은 역할
    • blkio : cgroup의 BlockI/O(Block device(SSD, USB, HDD 등)에 대한 제한을 설정
    • net_cls : 네트워크 패킷을 클래스 식별자(classid)로 태그하여 Linux 트래픽 컨트롤러 (tc)가 특정 cgroup에서 발생하는 패킷들을 식별할 수 있게 함
    • cpuset : 개별 CPU 및 메모리 노드를 cgroup에 바인딩 하기 위한 서브시스템. 리눅스의 testset 명령과 유사하게 CPU 코어를 할당 할 수 있는 서브시스템임.cpuacct : cgroup이 사용한 CPU 자원에 대한 보고서를 생성
    • devices : cgroup 작업 단위로 장치에 대한 엑세스를 허용하거나 거부ns : namespace 서브시스템…
    • 활용 사례
      • runc, YARN (Hadoop), Android 등
      • ex) Android에서는 cgroup을 이용해서 애플리케이션을 foreground / background로 나누고 background의 CPU 점유율을 낮추고 있음.
      • ex) 페이스북에서는 워크로드를 core workload, non-core services 등으로 나누고 cgroup을 지정하여 리소스를 관리(가장 중요한 core workload에 영향을 최소화시킴)
  • mount -t cgroup -o cpu,memory,blkio none /sys/fs/cgroup

  • mount -t cgroup none /sys/fs/cgroup (기본적 활성화)

  • none 의미: 실제로 파일 시스템이나 장치 이름을 지정하지 않을 때 사용 → 가상 파일 시스템을 마운트할 때 사용

cgroup v1은 /sys/fs/cgroup 디렉토리 내에 서브 시스템들이 있음

  • cgroup 관련 마운트 보기: mount | grep cgroup
  • ls /sys/fs/cgroup: /sys/fs/cgroup 디렉토리 내부에 개별 cgroup 서브시스템들이 있는지 확인하기
  • 각 서브시스템 디렉토리 내부를 확인하여, 관련 설정과 정보를 검토 가능
$ ls /sys/fs/cgroup/cpu
$ ls /sys/fs/cgroup/memory
$ ls /sys/fs/cgroup/blkio
....

  • 서브 시스템 디렉토리 내부에 아무 파일이 없다면 제대로 마운트 되지 않은 것

  • cgroup이 제대로 마운트 된 상태일 때:

  • /sys/fs/cgroup 에서 서브 시스템 디렉토리 목록 확인하기

  • mount | grep cgroup

(서브 시스템 디렉토리들이 마운트된 것을 확인할 수 있음)

  • 서브 시스템 디렉토리 내부 내용 확인하기

(아래의 이미지와 같이 관련 파일들 존재해야한다.)

master8 문제 상황:

  1. 컨테이너를 올릴 때, Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded. 관련 에러가 나오며, 컨테이너가 제대로 뜨지 못한다.
  2. cgroup 관련 마운트 설정들을 확인해본 결과,

/sys/fs/cgroup 디렉토리 내에 서브 시스템 내부에서 관련 파일들이 존재하지 않았다.

문제 해결 방법: 재부팅

재부팅 후 cgroup 관련 내용들을 확인했을 때, cgroup이 제대로 마운트 된 상태일 때 와 같아졌다.

(재부팅 후 cgroup 설정은 정상적이지만, 컨테이너가 잘 올라가지 않을때, 해당 이미지 삭제 후 컨테이너 up 재시도하기)

해당 log 내용 :

Error: creating container storage: the container name "sas-master" is already in use by fdc533baf9cf15d8d8f5fe9cd7a414c3933c8cc16f796fb2624be46502bd7b1b. You have to remove that container to be able to reuse that name: that name is already in use

ex) podman image rm -f [해당 Image ID]
해당 컨테이너 재기동

Cgroup v1 vs v2

Cgroup은 두 가지 버전으로 나눠지며, 두 버전은 위 그림처럼 계층 구조가 다르다.

  • cgroupv1 : control 대상이 되는 리소스들을 기준으로 control 그룹들을 나눔
  • cgroupv2 : control 대상이 되는 워크로드들을 기준으로 control 그룹들을 나눔
profile
ヾ(•ω•`)o

0개의 댓글

관련 채용 정보