Search

Virtio Block 성능 벤치마크

컴퓨터공부/가상화기술 2018.12.23 14:08 Posted by 아는 개발자

QEMU와 KVM환경에서 띄운 Ubuntu VM의 스토리지 성능을 Virtio Block을 사용할 때와 아닐 때를 각각 나누어서 측정을 해보았고 최적화 옵션을 적용할 때 Host대비 얼마정도의 성능을 내는지도 실험 해봤다.


1. 실험 방법


벤치마크툴은 iozone을 사용했고 적용한 옵션은 다음과 같다.

iozone -e -I -a -s 100M -r 4k -r 4096k -r 16384k -i 0 -i 1 -i 2


여기서 주목해야할 옵션 항목만 짚고 넘어가자.

  • -r 은 record할 사이즈를 말하며 여러개의 인자를 전달하면 인자의 개수만큼 측정한다.
  • -i 는 측정할 실험 항목을 의미한다. (0=write/rewrite, 1=read/re-read, 2=random-read/write)
  • -s 는 읽고 쓸 데이터의 크기를 의미한다.

2. 실험환경


Host 환경


- CPU: Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz

- Memory: 8G

- Storage: SSD


Guest VM 환경


- CPU: Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz

- Memory: 4G

- Storage: VirtioBlock(1) / Qemu Storage(2)


3. 측정결과 및 분석


(1) Record Size: 4K


4K

write

rewrite

read

reread

R/Read

R/Reread

Host

108531

140209

130116

149202

41372

108057

VM(VirtioIO)

56260

76539

74808

76864

33816

73393

VM(QEMU Storage)

10231

13252

11558

15289

13324

17782


(2) Record Size: 4096K


4096K

write

rewrite

read

reread

R/Read

R/Reread

Host

475827

493225

500618

506168

506449

491150

VM(VirtioIO)

381458

385537

406131

403043

408653

387712

VM(QEMU Storage)

254328

260574

261297

268813

254842

259518


(3) Record Size: 16384K


16384K

write

rewrite

read

reread

R/Read

R/Reread

Host

495826

502281

524808

521351

520112

502445

VM(VirtioIO)

394283

431118

423213

417768

435611

418307

VM(QEMU Storage)

276397

269190

273982

288246

288831

268841


* 결과 단위는 KB/S이다.


- 측정 단위가(Record Size) 작을수록 VirtioBlock과 QEMU Storage의 성능차이가 많이 나며 커질 수록 어느정도 좁혀지나 40~60% 정도 Virtio Block의 성능이 더 우수한 것으로 수렴한다.


- QEMU Storage 일때는 Host의 절반 정도(53%~55%)이지만  Virtio Block 옵션을 적용하면 Host 대비 80% 정도의 성능을 낸다. Host의 Storage 성능이 워낙 빠르기 때문에 (SSD) 20% 정도의 성능을 손해보더라도 불편함없이 사용할 수 있을 것 같다.


- SSD로 띄운 VM은 최적화 옵션을 넣지 않아도 HDD로 띄운 Host보다 성능이 우수하게 나온다. 성능 구린 PC를 하나 더 사는 것 보다는 성능 좋은 PC에 Virtual Machine을 띄우는게 경제적으로나 성능적으로나 우수해보인다.


16384K

write

rewrite

read

reread

R/Read

R/Reread

Host(HDD)

135480

126629

155426

168672

136012

126976

VM (Virtio based SSD)

394283

431118

423213

417768

435611

418307

VM(QEMU Storage)

276397

269190

273982

288246

288831

268841


'컴퓨터공부 > 가상화기술' 카테고리의 다른 글

Virtio Block 성능 세부 분석  (0) 2019.05.20
Virtio Block 성능 벤치마크  (0) 2018.12.23
QEMU를 이용해 커널 이미지 바꿔서 부팅해보기  (0) 2018.12.20
kvm ioeventfd  (0) 2018.08.11
kvm irqfd  (0) 2018.08.11
vhost  (0) 2018.07.08

전가상화를 지원하는 QEMU는 게스트 커널을 수정하지 않고 띄울수 있다는 장점이 있지만 virtio 같은 최적화 옵션을 사용하려면 커널의 일부 수정이 필요하다. 기존에 게스트 이미지에 내장된 커널을 수정하는 방법으로 가장 쉽게 떠올릴 수 있는 것은 게스트를 띄운 다음 이 안에서 커널 코드를 수정하고 빌드하는 것인데 답답한 게스트의 성능때문에 오래 걸리고 답답하다.


QEMU에서는 이런 점을 고려해서 파라미터를 이용해 사용할 커널 이미지를 지정할 수 있도록 만들었다. 개발자는 호스트 PC 환경에서 게스트에서 사용할 커널 이미지를 빌드한 후 스크립트에 -kernel 파라미터로 지정하면 된다. 


#!/bin/bash
DISK_PATH=.

qemu-system-x86_64 \
        -cpu host \
        -smp 8 \
        -enable-kvm -m 2048 \
        -kernel ./bzImage \
        -append "root=/dev/vda1 console=ttyS0" \
        -drive file=${DISK_PATH}/ubuntu.qcow2,cache=none,if=virtio \
        -display gtk \


위 스크립트에서 -append라는 옵션이 보이는데 이건 커널의 커맨드라인(cmdline)으로 들어갈 스트링을 지정할 수 있는 파라미터다. 새로 빌드한 커널에는 CONFIG_VIRTIO_BLK 옵션을 넣었기 때문에 커널에서 마운트할 디바이스의 이름(/dev/vda1)를 이곳에 기입했고 console로 시리얼 값을 보기 위해 ttyS0 옵션을 넣었다. 이게 없으면 따로 커널 코드에 넣지 않는 이상 마운트하다가 죽는다.


위의 올린 스크립트를 이용해 실행해보니 부팅이 정상적으로 된다. VIRTIO_BLK 옵션이 들어가서 그런지 예전보다 부팅이 조금 빨라진 것 같았다. 그래도 커널이 정상적으로 바뀌었는지 'uname -r' 명령어로 확인해봤다. Makefile에 넣은 EXTRAVERSION 값이 내 아이디로 들어간 것으로 보아 커널이 바뀐 것을 확인할 수 있었다.




'컴퓨터공부 > 가상화기술' 카테고리의 다른 글

Virtio Block 성능 세부 분석  (0) 2019.05.20
Virtio Block 성능 벤치마크  (0) 2018.12.23
QEMU를 이용해 커널 이미지 바꿔서 부팅해보기  (0) 2018.12.20
kvm ioeventfd  (0) 2018.08.11
kvm irqfd  (0) 2018.08.11
vhost  (0) 2018.07.08

QEMU와 KVM - 2

컴퓨터공부/가상화기술 2017.11.11 11:03 Posted by 아는 개발자

KVM(Kernel-based Virtual Machine)


그림1. KVM 공식 로고다. 펭귄이 던지고 있는 공은 VM을 의미하는 것 같다.


"KVM은 리눅스 커널을 하이퍼바이저로 변환하기 위한 가상화 인프라스트럭처의 하나이다"라고 위키 백과에선 설명하는데 이것만 가지곤 KVM의 제공하는 기능을 이해하긴 힘들다. KVM을 공부하기 전에 같이 사용되는 하이퍼바이저, QEMU에 대해 먼저 공부해보면 KVM의 사용 목적에 대해서 더 쉽게 이해할 수 있다. QEMU 포스트 읽어보기


Intel과 ARM같은 하드웨어 개발 회사들은 컴퓨터 내에서 가상화 기술을 지원하기 위한 장치들(Intel VT 또는 AMD-V )을 넣어뒀다. 이런 장치들은 가상화 기술의 고질적인 성능 저하 문제를 해결 하기 위해 만들어졌는데 이 장치들을 적절히 이용한 하이퍼바이저는 장치를 Emulation 해서 만든 방식보다 뛰어난 성능을 보였다(몇몇 기능은 Host OS와 거의 동일한 성능을 내기도 했다). 하지만 유저영역에서 동작하는 가상화 소프트웨어는 가상화 지원용 하드웨어를 직접 사용 할 수 없다. 하드웨어에 접근하는 일은 모두 커널을 거쳐야 하기 때문이다.


그림2. KVM 사용시 시스템 구조


KVM은 제조사에서 만든 가상화 하드웨어 기능을 범용성 있게 사용할 수 있도록 최적화하고 유저영역에서 동작하는 소프트웨어가 최적화한 기능을 쉽게 사용할 수 있도록 인터페이스를 제공한다. 인터페이스 접근은 간단하게 입출력 제어 함수(ioctl)를 호출해서 할수 있다. QEMU 소스 코드를 보면 실제로 kvm에 ioctl 함수를 보내는 코드들을 볼 수 있다.


지금까지는 하드웨어 제조사의 가상화 솔루션을 사용하기 위해 KVM이 사용되고 있다고 설명했는데 이것 말고도 다양한 기능을 제공하고 있다. 여기서 KVM이 제공하는 기능들 중 중요한 것 두가지만 살펴보자.


1. Virtual Machine 생성 및 관리


VM 생성 및 관리하는 작업을 하이퍼바이저가 아니라 KVM에서 관리 하기도 한다. 이런 경우 VM들이 커널내에서 관리되기 때문에 유저 영역에서 동작 할 때 보다 상대적으로 안정적이며 생성된 VM들은 커널 프로세스의 형태로 존재하기 때문에 유저프로세스로 존재할 때보다 전반적인 성능도 향상된다.


2. 장치 Emulation


CPU, Memory, Interrupt Handler처럼 VM 성능에 결정적인 장치들을 Emulation 해준다. 앞서 설명한 VM 생성 관리 작업처럼 이 장치들도 유저 영역에서 존재 할때보단 커널 영역에 있을 때 더 좋은 성능을 보이며 뿐만 아니라 하드웨어장치를 컨트롤 할 수 있는 함수를 호출 할 수 있는 장점이 있다. 여기서 Emulation 된 장치들은 제조사에서 추가한 가상화 솔루션을 지원하는 장치들이다.


이외에도 KVM이 제공하는 기능들을 적절하게 사용한다면 유저영역 하이퍼바이저에서 할 일은 "생성할 VM의 파라미터를 잘 받고 KVM 모듈의 함수를 잘 호출 하는 것"과 "KVM에서 제공하지 못한 장치들을 Emulation 하는 것"이다. 그래픽같은 경우 가상화 기술을 상용화 할 때 가장 크리티컬한 요소인데 아쉽게도 KVM에선 따로 지원하지 않는다. 이런 경우엔 하이퍼바이저에서 그래픽 관련 요소들을 처리 할 수 있는 솔루션을 제공해야한다.


사진 출처


- https://sort.veritas.com/public/documents/vie/7.3/linux/productguides/html/infoscale_virtualization/ch01s03.htm (그림 2)

'컴퓨터공부 > 가상화기술' 카테고리의 다른 글

QEMU 성능 문제 - 개론  (0) 2018.05.30
KVM - ARM  (0) 2018.01.01
QEMU와 KVM - 2  (0) 2017.11.11
QEMU와 KVM - 1  (0) 2017.11.01
6. XenStore, Xenbus  (0) 2017.01.22
5. 이벤트 채널 소개  (0) 2017.01.07