DevOps/Docker

[ Docker #03 알아보기 3/5 ] - VM vs Docker 성능비교

도커를 공부다보면 Docker와 VM의 차이를 알게 됩니다.
하지만 실제 성능은 어느정도 차이가 있을까요?

 

이번 포스팅은 신빙성 있는 해외 논문 자료를 기반으로

Docker vs VM 성능비교에 대해 설명해 드리도록 하겠습니다.

 

먼저 비교하기에 앞서 정확하게 비교하려면 잘못 된 명칭부터 수정이 필요합니다.

우리가 흔이 Docker를 설명할 때 Docker Engine 전체 아키텍처 의미로 사용됩니다.
따라서 Docker VS VM 이 아닌 Container VS VM 의 성능비교라고 표현하도록 하겠습니다.


그렇다면 Virtual Machine과 Docker의 차이는 무엇일까요?

아래의 표를 보시면 각 차이를 명확하게 구분할 수 있습니다.

 

Container과 VM의 차이란?

Table 1

  컨테이너 형 가상화
(Docker)
하이퍼 바이저 형 가상화
(VMWare ESXi)
호스트 형 가상화
(Linux KVM)
가상머신 OS를 호스트 OS와 공유하기 때문에 VM 마다 OS를 설치 할 필요는 없다 VM마다 OS 설치 필요 VM마다 OS 설치 필요
격리 프로세스 운영체제 하드웨어 하드웨어
지원 OS - Linux
- Windows
- MacOS
- Linux
- Windows
- MacOS
- 일부 Unix도 지원
- Linux
- Windows
- MacOS
- 일부 Unix도 지원
생성시간 몇 초 이내 분 단위 분 단위
부팅시간 OS 설치 불필요하기 때문에 사용 시작까지의 시간이 매우 짧음 초기 구축 시에는 네트워크 OS 설치 등의 작업이 발생하기 때문에 이용 개시까지의 시간이 많이 필요 초기 구축 시에는 네트워크 OS 설치 등의 작업이 발생하기 때문에 이용 개시까지의 시간이 많이 필요
네트워크 호스트 측에 작성된 Docker 전용 NIC와 통신 - 네트워크의 생성이 가능
- VM에 임의의 숫자 vNIC를 붙여 가능
- 네트워크의 생성이 가능
- VM에 임의의 숫자 vNIC를 붙여 가능
자원 표준에서는 HDD 자원을 지정할 수 없다. CPU, 메모리에 대한 자원 할당 지정 가능 CPU, 메모리, HDD의 자원 할당을 지정 가능 CPU, 메모리, HDD의 자원 할당을 지정 가능
오버 헤드 컨테이너는 호스트 OS에서 하나의 프로세스이며, 오버 헤드는 거의 없음 VM에서 기기까지의 액세스 경로를 하이퍼바이저 뿐이므로 호스트 형 가상화에 비해 오버 헤드가 적음 VM에서 기기까지의 액세스 경로가 다른 가상화 기술에 비해 길기 때문에 비교했을 경우에는 가장 오버헤드가 높음

 

위의 내용을 보면 OS 설치여부 차이가 있어

부팅시간에 큰 영향이 있는 것으로 확인할 수 있습니다.

 

VM과 Docker Container 각각 어떠한 방식으로 App이 구동되는지

이전 포스팅에도 첨부하였으나 다시 확인하고 성능 테스트 비교로 넘어가도록 하겠습니다.

 

[이미지1] VM VS Docker

App Applications [실행 파일(서비스 서버 등)]
Bins/Libs 실행환경 [라이브러리 등]
Guest OS 가상머신을 통해 설치된 OS를 의미합니다.
Hypervisor 가상머신을 의미합니다.
Host OS Windows, Linux, MacOS 등 서버 운영체제를 의미합니다.
Server (usually physical) 물리적인 서버, 즉 하드웨어를 의미합니다.



Container VS VM 성능테스트

테스트 환경 하드웨어(공통) [해외논문 참조]

Server : HP
CPU : Intel Xenon E5-2620 v3 processors (2.40 GHz at a total of 12 cores )
RAM : 64 GB RAM

 

테스트 환경 시스템A

Host OS (window 10) 
guest OS (Ubuntu 16.04)

 

테스트 환경 시스템B

Host OS (Ubuntu 16.04)
guest OS (Docker Ubuntu 16.04)

 

벤치마킹 도구

Sysbench, Phoronix, Apache benchmark

성능 평가 종류

 

[이미지2] 테스트 종류

 

1. CPU 테스트

CPU 테스트는 주어진 시간 안에서 시스템이 수행 한 작업 수로 측정 할 수 있습니다.

결과는 주로 서버에 할당 된 가상 CPU 코어 수에 따라 다르므로 참고해주세요

CPU 성능 비교 테스트는 sysbench, Phoronix 및 Apache 벤치 마크 도구를 통해 수행되었습니다

 

 

1.1 최대 소수 연산

Sysbench 도구 테스트에서 최대 소수를 수행하는 데 필요한 시간 계산입니다.

Maximum Prime Numbe value for the operation

50000 with time of 60 seconds and 4 thread operations.
아래의 그림을 보면 도커 컨테이너는 작업을 실행하는 데 훨씬 적은 시간이 소요됨을 알 수 있습니다.
VM의 경우 가상 머신에 하이퍼 바이저가 존재하므로 실행에 더 많은 시간이 걸립니다.

[이미지3] CPU Comparison of Docker and Virtual Machine

 

 

1.2 Zip 압축 테스트

7-Zip은 오픈 소스 파일 아카이버로, 파일 그룹을 "아카이브"라고하는 컨테이너로 압축하는 서비스입니다.

아래의 그림은 LZMA benchmark를 통해 압축 및 압축 해제 두 가지 테스트를 진행한 결과입니다.
이 테스트는 7 개의 Zip 압축을 사용하여 파일을 압축하는 데 필요한 시간을 측정하였습니다.

압축 테스트에 사용되는 파일 크기는 약 10GB로 7 Zip 압축 테스트를 통한 CPU 성능 비교를 보여줍니다.

결과적으로 Docker Container 성능은 많은 양의 파일 압축으로 수행 할 때 VM보다 훨씬 좋음을 알 수 있습니다.

 

[이미지4] Compression Test for CPU performance

 

 

2. RAM Memory 테스트

RAM speed/SMP (Symmetric Multiprocessing)은

가상화 기술(예 : docker 및 Virtual Machine)의 RAM 속도 측정에 사용되는 캐시 및 메모리 벤치마킹 도구입니다.

RAM 속도를 테스트하는 동안 다음 두 가지 주요 매개 변수를 통해 측정됩니다.

INTmark 및 FLOATmark 구성 요소는 개별 데이터 블록을 읽고 쓰는 동안

가능한 최대 캐시 및 메모리 성능을 측정하는 RAM speed/SMP 벤치마킹 도구로 측정합니다.

 

INTmem 및 FLOATmem은 합성 시뮬레이션으로 메모리 성능 Copy, Scale, Add, Triad 총 4개 테스트를 진행합니다.

한 메모리 위치에서 다른 메모리 위치로의 데이터 전송은 복사 명령, i.e. (X = Y)에 의해 수행됩니다.

쓰기 전의 데이터 수정은 일정한 상수 값으로 곱해지며 스케일 명령, i.e. (X = n * Y)에 의해 수행됩니다.

첫 번째 메모리 위치에서 데이터를 읽은 다음 ADD 명령이 호출되면 두 번째 메모리 위치에서 데이터를 읽습니다.

그런 다음 결과 데이터가 3 위 (X = Y + Z)에 배치됩니다. Triad는 Add와 Scale의 조합입니다.

스케일링을 위해 첫 번째 메모리 위치에서 데이터를 읽은 다음

두 번째 위치에서 추가하여 세 번째 위치에 씁니다 (X = n * Y + Z).
위의 내용처럼 논문에는 복잡하게 적혀 있으나 Triad 조합에 대해 설명하고자 적혀 있는 부분입니다.
결과적으로 RAM Speed 테스트 결과도 Docker의 성능이 더 좋다고 확인할 수 있습니다.

"i.e."란 논문에서 많이 쓰이는 단어로 라틴어 id est의 약자로 “that is to say” 이나 “in other words” 즉 “다시 말해서” 의 의미

 

[이미지5] RAM Speed comparisons between virtualization technologies

 

 

 

3. DISK I/O 성능

하드 디스크 성능을 테스트하기 위해 IOzone benchmark 도구를 사용하였습니다.

시스템의 쓰기 및 읽기와 같은 작업을 테스트하기 위해 레코드의 크기 1MB와 파일 크기 4GB가 사용되었습니다.

디스크 역시 가상 머신과 비교할 때 Docker의 성능이 훨씬 더 우수하다는 것을 추론 할 수 있었고

VM의 디스크 쓰기 및 읽기 작업이 Docker Container의 절반 이상 (약 54 %) 감소됨을 확인할 수 있습니다.

[이미지6] IOzone Benchmark Disk Performance

 

 

 

4. 부하 테스트

부하 테스트 성능 비교를 위해 Apache Benchmark 도구를 사용하였습니다.

이 도구는 주어진 시스템이 허용 할 수있는 초당 요청 수를 측정합니다.
논문에서는 Python 프로그램으로 로드를 테스트 하였습니다.
아래의 그림을 통해 VM의 처리량 분석 결과는 Docker에 비해 훨씬 적다는 것을 알 수 있습니다.
이는 Docker보다 가상 머신의 네트워크 지연 시간이 더 길기 때문입니다. 
분석에 따르면 Docker 컨테이너는 초당 요청 수를 처리하는 데있어 가상 머신보다 낫습니다.

 

[이미지7] Load test comparison between Docker and Virtual Machine

 

 

 

5. 작동 속도 측정

5.1 Eight queens puzzle

Eight queens puzzle 를 통해 테스트를 진행하였습니다.

이 퍼즐 테스트는 8개의 퀸을 8 x 8 체스 판에 놓아서 서로 공격하지 않도록 합니다.
이 테스트는 문제를 해결하는 데 걸리는 시간을 측정하여 성능비교를 합니다.
이 프로그램은 파이썬으로 작성되었습니다. Docker와 Virtual 모두의 연산 성능을 보여줍니다.
퍼즐게임 결과를 통해 Docker Container보다 VM이 훨씬 더 오래 걸림을 확인할 수 있습니다.

 

[이미지8] Eight Queen Program Performance Comparison

 

5.2 Eight Puzzle test 테스트

Eight puzzle test  프로그램은 파이썬으로 개발되었으며

게임 방식은 1개의 빈 공간이있는 4x4 보드를 통해 진행합니다.
빈 공간을 사용하여 최종 구성과 일치하도록 타일 수를 배열하는 것이 주요 목표입니다. 
4개의 인접한 작업 (오른쪽, 왼쪽, 아래 및 위) 타일을 빈 공간으로 밀어 넣을 수 있습니다. 
이번 테스트 역시 위의 Eight queens puzzle과 동일하게 문제를 해결하는 데 걸리는 시간을 측정합니다.
이번 퍼즐게임 역시 Docker Container보다 VM이 훨씬 더 오래 걸림을 확인할 수 있었습니다.

 

[이미지9] Eight puzzle test performance comparison

 

 

 

6. T-TEST 분석

6.1 T-검정 분석

오른쪽, 왼쪽, 아래 및 위) 타일을 빈 공간으로 밀어 넣을 수 있습니다. 
-test 통계 측정은 두 그룹에 대한 방법 사이에 중요한 차이가 있는지 여부를 결정하는 데 사용됩니다.
통계적 추론 기술 t-test를 사용하여 docker 컨테이너가 가상 머신보다 훨씬 우수한 성능을 발휘 함을 입증했습니다.
또한 임계 값에 대한 신뢰 수준은 α 0.05로 간주됩니다. 

두 데이터 세트의 확률은 t-statistic, t-distribution values, degree of freedom를 사용하여 결정할 수 있습니다.
귀무 가설 (H0)과 대립 가설 (H1) 규칙이 분석 부분에 사용됩니다.
추가 통계 분석을위한 가정 인 귀무 가설을 참으로 고려하여 테스트 분석을 수행합니다.
테스트 결과는 H0이 참인 경우 가정이 잘못되었음을 증명할 수 있습니다.

 

귀무가설(영가설) : 모집단의 특성에 대해 옳다고 제안하는 잠정적인 주장

- 귀무가설은 "모집단의 모수는 OO과 차이가 없다"라고 가정하는 것
대립가설(대안가설) : 귀무가설이 거짓이라면 대안적으로 참이 되는 가설
- 대립가설은 귀무가설이 틀렸다고 판단했을 때(기각 되었을 때), 대안적으로 선택하는(채택되는) 가설

 

 

Table 2 - [통계결과 요약]

T-test Requirements Results
H₀(Null Hypothesis) Dockerₜᵢ = Virtual Machineₜᵢ
H₁(Alternative Hypothesis) Dockerₜᵢ ≤ Virtual Machineₜᵢ
Alpha( ἀ ) 0.05
No of samples(N) 10
∑x 879
∑d² 7275.4
87.9
Standard Deviation(sₓ) 85.29
Test statistic(t) -2.43
µL -2.26

 

 

left tailed t-test curve

 

Docker 컨테이너가 가상 머신보다 작업을 실행하는 데 걸리는 시간이 더 적은지 비교분석을 진행했습니다.
샘플 테스트는 소수 찾기 연산에 대한 10 개의 실험으로 구성되며
Table 3은 분석 부분에 대해 취한 10 개의 샘플을 보여줍니다. 
가상 머신의 작동을 수행하는 데 걸린 평균 시간은 153.5 초로 확인되었습니다. 
이제 도커 컨테이너에 걸린 평균 시간이 가상 머신보다 적은지 확인합니다.

 

t 통계량 (t)의 방정식

t = x−µ

S/√n

 

Table 2의 요약결과를 보시면

lower confidence limit (µL)이 test statistic(t)보다 작다는 것을 분명히 알 수 있습니다. 
-2.89 <-2.26이므로 H₀은 rejected. H₁은 accepted 입니다. 
위의 그림에서  test statistic(t)rejected 영역에 있음을 알 수 있습니다. 
따라서 가상 머신이 소수를 찾는 작업을 수행하는 데 걸리는 시간이 도커 컨테이너보다 많다고 할 수 있습니다. 

Table3은 최대 소수 계산과 관련하여 가상 머신 및 도커의 실행 시간을 설명합니다. 
이 작업을 수행하기 위해 다른 테스트 값을 사용했습니다. 

이 10 개의 샘플은 다음과 같이 간주됩니다.
다른 입력 값에서의 실행 시간. 여기서 N은 계산에 제공된 값의 수를 나타냅니다. 
주어진 값 집합에서 소수를 찾는 프로그램은 가상 머신과도 커가 설치된 머신에서 실행됩니다.

 

Table 3 - [가상 머신 및 도커의 실행 시간]

Test Input N Virtual Machines
Prime number program
(execution time in seconds)
Docker Containers
Prime number program
(execution time in seconds)
10 13 8
20 47 20
30 59 35
40 88 53
50 120 72
60 144 92
70 188 115
80 225 140
90 265 164
100 386 180

 

 

성능비교 결론

성능 평가는 CPU, 메모리 처리량, 디스크 I/O, 부하 테스트 및 작업 속도 등으로 측정을 하였습니다.

결과적으로 가상 머신에 QEMU 계층이 있으면 Docker Container보다 효율성이 떨어지기 때문에

Docker 컨테이너는 모든 테스트에서 VM보다 더 나은 성능을 발휘하는 것으로 결론을 지을 수 있었습니다. 

Docker Container는 새로운 경량 가상화 기술로 꼭 스터디해야하는 스킬입니다.

앞으로도 Docker 설치부터 사용방법을 정리하여 공유드릴 예정이니

많은 도움이 되었으면 좋겠습니다.

 

성능비교의 경우 논문을 기반으로 작업하였으나

번역 후 정리와 편집은 직접하였으며 모든 이미지는 재편집 되었으므로

저작권은DataArtist(Sammy,)개인에게 있음을 명시합니다.

사용시 꼭 댓글과 출처를 표기해주세요.

 

다음 포스팅부터는 사용법을 익힐 수 있는 스킬을 공유드리겠습니다.

장문의 글을 읽어주셔서 감사합니다.

 

 

다음 포스팅 : [ Docker #05 알아보기 4/5 ] - Docker HUB(도커허브) 활용하기