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

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

- 리눅스 커널의 기능으로, 프로세스들의 그룹화 및 이들 그룹의 시스템 리소스(예: CPU 시간, 시스템 메모리, 네트워크 대역폭 등) 사용을 관리하고 제한하는 데 사용됨
- Cgroup은 프로세스들이 사용하는 시스템의 자원의 사용 정보를 수집하고, 제한시키고, 격리시키는 리눅스 커널 기능(모든 프로세스에 대해 리소스 사용 정보를 수집함)을 한다.
cgroup을 사용하면 시스템 관리자는 다양한 시스템 리소스를 더 세밀하게 제어 가능
-
cgroup의 주요 기능
- 리소스 제한: cgroup을 사용하면 특정 프로세스 그룹에 할당된 CPU 시간, 메모리 사용량, I/O 대역폭 등을 제한할 수 있습니다. 이를 통해 시스템의 안정성을 높이고 리소스 사용을 효율적으로 관리할 수 있습니다.
- 우선순위 할당: 다른 프로세스 그룹에 서로 다른 CPU 스케줄링 우선순위 또는 I/O 대역폭 우선순위를 할당할 수 있습니다. 이를 통해 중요한 작업에 더 많은 리소스를 할당하고, 덜 중요한 작업은 제한할 수 있습니다.
- 계정 및 보고: cgroup을 사용하면 시스템 리소스 사용에 대한 상세한 보고와 분석이 가능합니다. 이를 통해 시스템의 리소스 사용 패턴을 이해하고 필요한 조정을 할 수 있습니다.
- 프로세스 관리: 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
....


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

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

master8 문제 상황:
- 컨테이너를 올릴 때,
Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
관련 에러가 나오며, 컨테이너가 제대로 뜨지 못한다.
- 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 그룹들을 나눔