Cloud/Docker

Docker) cgroup (Control Group) 실습해보기

Adım Kim 2022. 9. 27. 22:53
실습 환경 : AWS Console (2022/09), Visual Studio Code, Xshell 7
실습 목적 : 리눅스 컨테이너 기술기반인 cgroup에 대해 알아보고 cgroup 명령을 익혀본다.

cgroup

  • 시스템 자원의 사용정보를 수집 및 제한시키는 Linux 커널 기능을 한다.
  • 모든 프로세스에 대해 리소스 사용정보를 수집한다.
  • 제한 가능한 자원 - CPU, Memory, Network, Device, Block I/O



cgroup 종류



cgroup 에서 사용 가능한 서브 시스템

  • blkio : 블록 장치(storage)에 대한 입/출력 제한
  • cpu : 스케쥴러를 이용해 해당 cgroup에 속한 프로세스 CPU 사용시간 제한
  • cpuacct : cgroup에 속한 CPU 자원정보 생성
  • cpuset : 개별 CPU 및 메모리로드에 대한 cgroup 할당
  • devices : cgroup 작업 단위로 장치에대한 액세스 허용/거부
  • freeze : cgroup 작업 일시정지 또는 다시시작
  • memory : cgroup에 속한 프로세스의 메모리 사용 제한
  • net_cls : 네트워크 태그 지정
  • ns : namesapce 서브 시스템


cgroup을 통해 cpu 사용량 제한해보기


1. cpu 사용량 테스트를 위해 stress와 cgroup-tools 설치
sudo apt update
sudo apt install -y stress
sudo apt install -y cgroup-tools

2. cgcreate 명령으로 자원제한 그룹 생성

sudo cgcreate -a ubuntu -g cpu:mygroup
# sudo cgcreate -a [소유자ID] -g cpu:[그룹이름]

3. CPU 사용량을 30%로 제한한다
    -  cgset에서 -r 옵션은 자원 제한속정을 지정하는 옵션이다.

sudo cgset -r cpu.cfs_quota_us=30000 mygroup
# sudo cgset -r cpu.cfs_quota_us=30000 [그룹이름]

# 위 명령에서 에러가 나면 아래 내용으로 설정한다.
    
sudo cgset -r cpu.max=30000 mygroup
# sudo cgset -r cpu.max=30000 [그룹이름]

4. CPU 사용량 테스트

sudo cgexec -g cpu:mygroup stress -c 1
# sudo cgexec -g cpu:[그룹이름] [stress 명령]

5. 다른 터미널에서 top 명령을 통해 CPU 사용량이 제어되는지 확인



프로세스 생성개수 제한으로 forkbomb 방지하기


1. 관리자 계정으로 전환 후, cgroup 디렉토리로 이동
sudo su
cd /sys/fs/cgroup​

2. 실습을 위한 임시 디렉토리 생성 및 이동

mkdir utils
cd utils

3. utils 디렉토리에서 자동 생성된 pids.max 파일 내용을 수정하여 생성 가능한 프로세스 수 설정

echo 20 > pids.max

4. forkbomb 공격 상황을 구현

:(){:|:&};:
# 위 코드를 입력하면 프로세스가 무한히 생성하려함

5. 결과
    -  forkbomb 으로 프로세스가 무한히 생성하려 하더라도 pids.max에 설정된 값만큼만 프로세스가 제한된다.
    -  EC2 instance를 재기동 하여 복구한다.