Docker를 통한 cgroup분석: CPU 코어제한 / 메모리 제한

hyuckhoon.ko·2024년 3월 10일
0

코어 제한

사용할 수있는 cpu 코어 갯수 확인

root@ubuntu-20-04:~# nproc
2

CPU 코어 1개로 제한

0번째 코어만 사용하고 1번째 코어는 사용하지 않을 거다.

docker run --cpuset-cpus=0 -it ubuntu:18.04 /bin/bash

다른 터미널에서 확인해보자.

sudo apt install -y htop
htop

첫 번째 터미널에서 실행한 도커 컨테이너에 부하를 줘보자.
다시 첫 번째 터미널로 돌아온다.

apt update && apt install sysbench htop
sysbench --test=cpu run

그리고 다시 두 번째 터미널에서 htop를 입력하여 코어 변화를 보자.

쓰레드 3개 사용하도록 테스트하면 어떻게 될까?

root@e01e3e8300db:/# sysbench --test=cpu --num-threads=3 run

1개만 사용하도록 애초에 도커 컨테이너를 제한하여 실행시켰기에 무시된다.

cgroup 설정값 확인하기

ls /sys/fs/cgroup/cpuset/docker/e01e3e8300db4f5d220ccaa94654776398f2b2f5946373b563fe5799994655d1

cgroup.clone_children  cpuset.effective_mems   cpuset.memory_spread_page        notify_on_release
cgroup.procs           cpuset.mem_exclusive    cpuset.memory_spread_slab        tasks
cpuset.cpu_exclusive   cpuset.mem_hardwall     cpuset.mems
cpuset.cpus            cpuset.memory_migrate   cpuset.sched_load_balance
cpuset.effective_cpus  cpuset.memory_pressure  cpuset.sched_relax_domain_level

여기서 e01e3e8300db4f5d220ccaa94654776398f2b2f5946373b563fe5799994655d1는 도커 컨테이너 ID다.

cpuset.cpus 파일을 확인해보자.

e5799994655d1# cat cpuset.cpus
0

도커에서만 적용되는 내용이 아니다.

도커 컨테이너를 종료하고(exit)

exit
nproc
2

sysbench --test=cpu --num-threads=2 run
htop

메모리 제한

메모리를 사용하는 파이썬 스크립트

f = open("/dev/urandom", "rb")
data = b""

i = 0
while 1:
    data += f.read(10000000)
    i += 1
    print(f"{i*10}dmb")

메모리 제한 설정이 없으니 계속 올라가는 모습이다.

도커 메모리 제한

물리 메모리가 100MB에 스왑을 사용하지 않는 제한하기
(스왑 비활성화: 메모리 공간이 부족할 때 디스크 공간을 사용하는 설정을 해제하는 것임)

root@ubuntu-20-04:~# sudo docker run --memory=100M --memory-swappiness 0 -it ubuntu:18.04 /bin/bash
root@33f3a91888f0:/# apt update && apt install vim python

다시 mem_eater 스크립트를 만들어주고 실행한다.

root@33f3a91888f0:/# python mem_eater.py
10mb
20mb
30mb
40mb
50mb
60mb
70mb
80mb
Killed

cgroup 설정값 확인하기

4d0b3b41ff753# cd /sys/fs/cgroup/memory/docker/5bd10300d4eb74dbf6e867e57ebdcc1d96a214f1a319d0860c5
4d0b3b41ff753/

4d0b3b41ff753# cat memory.limit_in_bytes
104857600

우리가 제한한 100MB가 잘 적용 돼 있음을 알 수있다.
(1024 1024 100 = 104857600)

0개의 댓글