hotamul의 개발 이야기

cgroup으로 CPU 제한하기 본문

etc.

cgroup으로 CPU 제한하기

hotamul 2023. 3. 14. 00:11

cgroup이란?

cgroup은 Linux 운영 체제에서 프로세스 그룹을 관리하는 기능이다. cgroup은 Control Group의 줄임말로, 다수의 프로세스 그룹을 묶어서 리소스 제한, 우선순위 설정 등을 할 수 있도록 한다.

예를 들어, 여러 개의 웹 서버 프로세스가 있을 때, cgroup을 사용하면 CPU, 메모리, 디스크 등 리소스를 공정하게 분배하거나 우선순위를 지정하여 특정 프로세스 그룹이 우선적으로 리소스를 할당 받도록 설정할 수 있다.

또한, cgroup은 서버 가상화 기술인 컨테이너에서도 사용된다. 컨테이너는 cgroup을 사용하여 호스트 운영 체제에서 가상화된 환경에서 독립된 프로세스 그룹을 생성하고 리소스를 관리하여, 컨테이너 간의 Resource Contention을 방지하고, 각각의 컨테이너가 안정적으로 동작할 수 있도록 한다.

stress tool 설치

cgroup을 이용해서 CPU 사용량을 제한해보자.

stress는 리눅스에서 시스템의 안정성과 성능을 테스트하기 위한 도구로, 다양한 리소스 요구 사항을 시뮬레이션하여 리소스 사용량의 한계를 테스트할 수 있다.

테스트 하고자 하는 Linux OS는 Ubuntu이다.

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
NAME="Ubuntu"
...

먼저 stress tool을 설치해보자

$ sudo apt install -y stress

root 계정으로 전환

$ sudo su

test용 cgroup 생성

$ cd /sys/fs/cgroup/cpu && mkdir utils $$ cd utils
$ ll
total 0
drwxr-xr-x 2 root root 0 Mar 13 14:45 ./
dr-xr-xr-x 7 root root 0 Mar  9 14:51 ../
-rw-r--r-- 1 root root 0 Mar 13 14:45 cgroup.clone_children
-rw-r--r-- 1 root root 0 Mar 13 14:45 cgroup.procs
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.cfs_burst_us
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.idle
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.shares
-r--r--r-- 1 root root 0 Mar 13 14:45 cpu.stat
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.uclamp.max
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpu.uclamp.min
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_all
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Mar 13 14:45 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Mar 13 14:45 notify_on_release
-rw-r--r-- 1 root root 0 Mar 13 14:45 tasks

/sys/fs/cgroup/cpu에 디렉토리를 생성하면 자동으로 위와 같은 sudo file이 생성되는데 크기는 모두 0이다.

현재 process 생성한 cgroup에 등록

echo $$
50249
$ echo $$ > tasks

CPU 10%로 제한

cpu.cfs_perios_us: 100000 (default로 100ms)
cpu.cfs_quota_us: 10000 (10ms로 변경)

$ echo 10000 > cpu.cfs_quota_us

stress test 설정

$ stress -c 1

top으로 CPU 사용량 확인

$ top
top - 15:08:00 up 4 days, 16 min,  0 users,  load average:
Tasks: 117 total,   3 running, 114 sleeping,   0 stopped, 
%Cpu(s): 17.9 us,  3.0 sy,  0.0 ni, 78.7 id,  0.3 wa,  0.0
MiB Mem :    966.2 total,     70.4 free,    372.3 used,   
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU 
  51291 root      20   0    3864    100      0 R  10.0
...

CPU 5%로 변경

cpu.cfs_perios_us: 100000 (default로 100ms)
cpu.cfs_quota_us: 5000 (5ms로 변경)

$ echo 5000 > cpu.cfs_quota_us

top으로 CPU 사용량 확인

$ top
top - 15:11:03 up 4 days, 19 min,  0 users,  load average:
Tasks: 124 total,   2 running, 122 sleeping,   0 stopped, 
%Cpu(s):  8.0 us,  1.7 sy,  0.0 ni, 90.0 id,  0.3 wa,  0.0
MiB Mem :    966.2 total,     65.0 free,    377.1 used,   
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU 
  51291 root      20   0    3864    100      0 R   5.0 

...
Comments