이 문서는 Docker CPU, Memory 리소스 제한 및 부하 테스트 내용을 공유하기 위해 작성되었다.
| 도구명 | docker-compose |
|---|---|
| 버전 | 2.16.0 |
| OS | centOS 8 |
| 비고 |
docker-compose CPU 제한 및 부하 테스트
1. 목표 설정
Docker Compose에서 실행되는 컨테이너의 CPU 사용률과 메모리 사용률 테스트
2. 테스트 구성
docker-compose upgrade
- docker-compose deploy의 resource를 사용하기 위해 docker-compose upgrade
docker-compose 버전이 1.X 일 경우 해당 부분 지원하지 않음
#docker-compose 버전 확인
docker-compose -v
sudo rm /usr/local/bin/docker-compose
# curl + grep
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')
# curl + jq
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
DESTINATION=/usr/local/bin/docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION
sudo chmod 755 $DESTINATION
docker-compose.yml 예시
services:
service_name:
...
deploy:
resources:
limits:
cpus: '0.5' # half a CPU
memory: 256M # 256 MB of RAM
reservations:
cpus: '0.25' # a quarter of a CPU
memory: 128M # 128 MB of RAM
docker-compose 실행 명령어
docker-compose -f do-limits.yml up -d
docker 상태 확인
docker stats [OPTIONS] [CONTAINER...]
3. 테스트
컨테이너 내부 접속 및 필요 command 설치
#접속 docker exec -it [Name 및 Container ID] /bin/bash #종료 exit #OS 버전 확인 후 필요한 패키지 설치 cat /etc/*-release apt-get update && apt-get -y install vim && apt-get -y install stress
Container 내부 bash 접속 후 shell script 부하 테스트
docker container 내부에 접속, 해당 스크립트 작성 후 실행
cpu 부하주는 bash 스크립트
#vi cpu_stress.sh
#chmod 777 cpu_stress.sh
#!/bin/bash
# Function to check if a number is prime
is_prime() {
local number=$1
for ((i=2; i<=$((number/2)); i++)); do
if [ $((number%i)) -eq 0 ]; then
return 1
fi
done
return 0
}
# Infinite loop to calculate prime numbers
while true; do
for ((i=2; i<=100000; i++)); do
if is_prime $i; then
echo $i
fi
done
done
memory 부하주는 bash 스크립트
#vi mem_stress.sh
#chmod 777 mem_stress.sh
#!/bin/bash
# Run the memory stress test loop
while true
do
#head -c ${memory}k </dev/zero> /dev/null
</dev/zero head -c 512m | tail
#</dev/zero head | tail
#(</dev/zero head -c 512m) <(sleep 300) | tail
done
Container 내부 bash 접속 후 stress 명령어 부하 테스트
docker container 내부 접속 후 stress 명령어 실행
#CPU 부하 stress --cpu 2 --timeout 20s #Memory 부하 stress --verbose --vm 1 --vm-bytes 512M --timeout 20s
docker-compose.yml entrypoint, command 부하 테스트
entrupoint, command: container 실행 시 실행되는 명령어(entrypoint > command)
version: "3"
services:
web1:
container_name: test_1
image: nginx
#command: sh -c "apt update&&apt-get install vim -y&&apt-get install stress -y&&stress --verbose --vm 1 --vm-bytes 512M"
entrypoint: sh -c "apt update&&apt-get install vim -y&&apt-get install stress -y&&stress --verbose --vm 1 --vm-bytes 512M"
ports:
- "8083:8080"
deploy:
resources:
limits:
cpus: '1' # half a CPU
memory: 256M # 256 MB of RAM
reservations:
cpus: '0.5' # a quarter of a CPU
memory: 256M # 128 MB of RAM
db:
image: postgres:12
container_name: postgres12
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
deploy:
resources:
limits:
cpus: '1.5' # half a CPU
memory: 1024M # 256 MB of RAM
reservations:
cpus: '0.6' # a quarter of a CPU
memory: 256M # 128 MB of RAM
web3:
container_name: test_3
image: nginx
ports:
- "8082:8080"
deploy:
resources:
limits:
cpus: '1.5' # half a CPU
memory: 1024M # 256 MB of RAM
reservations:
cpus: '0.6' # a quarter of a CPU
memory: 256M # 128 MB of RAM
4. 부하 테스트 수행 결과
4-1. Container 내부 bash 접속 후 shell script 부하 테스트
- CPU 부하 스크립트 결과-1(docker stats)
- CPU 부하 스크립트 결과-2(htop - 호스트)
- Memory 부하 스크립트 결과-1(docker stats)
- Memory 부하 스크립트 결과-2(htop-호스트)
- 부하에 따른 script 부하 kill
4-2. Container 내부 bash 접속 후 stress 명령어 부하 테스트
- CPU 부하 command:
stress --cpu 2 --timeout 20s
- Memory 부하 command:
stress --verbose --vm 1 --vm-bytes 512M
- 부하에 따른 stress 명령 kill #stress무한루프 :
stress --verbose --vm 1 --vm-bytes 512M
4-3. docker-compose.yml entrypoint, command 부하 테스트
- docker-compose.yml entrypoint, command 부하 테스트
- while true;do timeout 2s bash -c "docker stats" >> test.txt;done #test.txt 파일
5. 결과 분석
cpu의 경우
- cpu의 경우 컨테이너 종료 없이 풀 차지
memory의 경우
- memory의 경우 단순 stress 명령어나 스크립트로 부하를 줄 경우 limit 설정한 임계 값에 도달 할 시 stress 명령이나 스크립트가 종료처리 됨(kill)
- 컨테이너는 종료되지 않음
- docker-compose.yml에 entrypoint로 stress 명령을 줄 경우 임계 값에 도달 시 stress 명령이 종료 처리되면서 컨테이너가 종료됨
- stress명령 및 스크립트로 postgresql에 계속적인 부하를 준 경우 postgresql 성능은 매우 느려지나 컨테이너는 안꺼짐
참조
docker-compose 버전 upgrade
memory script
stress 명령어










