개발/가상화
-
Virtio Block 성능 세부 분석개발/가상화 2019. 5. 20. 20:28
예전 포스트에서는 iozone을 이용해 Virtio block 드라이버의 성능을 간단하게 측정해봤다면 이번 글에는 범용적으로 사용되는 스토리지 벤치마크인 fio를 이용해 Virtio Block의 성능을 좀더 디테일하게 분석해보려고 한다. 실험의 큰 단위를 Sequential, Random으로 나누고 각각의 I/O size를 바꿔봤을 때 Host와 VM의 성능 차이가 어느 정도 나오는지를 분석 해봤다. 1. Seq 512K, Rand 4K Host VM Ratio Random Read 7705MB/s 5184MB/s 67% Random Write 120MB/s 69.9MB/s 58% Sequential Read 13.5GB/s 12.4GB/s 91% Sequential Write 501MB/s 346MB/..
-
Virtio Block 성능 벤치마크개발/가상화 2018. 12. 23. 14:08
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 는 읽고 쓸 데이터..
-
QEMU를 이용해 커널 이미지 바꿔서 부팅해보기개발/가상화 2018. 12. 20. 22:20
전가상화를 지원하는 QEMU는 게스트 커널을 수정하지 않고 띄울수 있다는 장점이 있지만 virtio 같은 최적화 옵션을 사용하려면 커널의 일부 수정이 필요하다. 기존에 게스트 이미지에 내장된 커널을 수정하는 방법으로 가장 쉽게 떠올릴 수 있는 것은 게스트를 띄운 다음 이 안에서 커널 코드를 수정하고 빌드하는 것인데 답답한 게스트의 성능때문에 오래 걸리고 답답하다. QEMU에서는 이런 점을 고려해서 파라미터를 이용해 사용할 커널 이미지를 지정할 수 있도록 만들었다. 개발자는 호스트 PC 환경에서 게스트에서 사용할 커널 이미지를 빌드한 후 스크립트에 -kernel 파라미터로 지정하면 된다. #!/bin/bash DISK_PATH=. qemu-system-x86_64 \ -cpu host \ -smp 8 \ ..
-
kvm ioeventfd개발/가상화 2018. 8. 11. 23:10
* 개인 공부용으로 정리한 것이라 부정확한 내용이 있을 수 있으니 참고용으로만 사용하길 바랍니다. IOEVENTFD eventfd를 응용해서 guest에 interrupt를 보낼 수 있는 기능을 만든 irqfd것과 비슷하게 ioeventfd도 eventfd를 이용해서 guest에게 mmio 기능을 전달 할 수 있는 매커니즘을 만들었다. 초기화 작업도 irqfd와 거의 비슷하다. 1. QEMU에서 kvm으로 mmio 값 전달. QEMU에서 장치가 사용할 주소 값과 flag, eventfd 값을 세팅하고 kvm에 ioctl 을 날린다. 이때 전달인자 fd는 MemoryRegionIoeventfd 라는 구조체의 EventNotifier 값을 뽑아낸 것이다. 구조체 이름이 매우 와닿지 않는다. // qemu/a..
-
kvm irqfd개발/가상화 2018. 8. 11. 14:02
* 개인 공부용도로 정리한 것이라 부정확한 정보가 있을 수도 있으니 참고용으로만 사용하세요. IRQFD irqfd는 QEMU에서 정의한 eventfd와 GSI(Global System Interrupt) 값을 이용해서 Guest에 바로 interrupt를 바로 쏘아 줄 때(irqfd_inject) 사용하는 kvm interrupt 라이브러리다. 간단한 event를 만들 때 사용하는 eventfd 메커니즘을 응용한 대표적인 예다. 좀더 디테일한 동작 내용을 이해하기 위해 초기화 코드를 순서대로 분석해보자. 1. QEMU 장치 정보 세팅 후 kvm으로 ioctl 전달 QEMU에서는 장치가 사용하려는 GSI(Global system interrupt)와 상태에 대한 정보를 저장하는 flag 값 그리고 qemu..
-
vhost개발/가상화 2018. 7. 8. 14:19
Vhost는 Virtio를 이용한 장치 가상화의 성능을 개선하는 모듈이다. 일반적으로 Virtio를 이용하는 장치들은 모두 virtqueue 기반의 킥 메커니즘으로 backend와 frontend가 통신한다. 그런데 이때 virtqueue를 처리하는 주체는 QEMU에서 만든 유저 프로세스이기 때문에 다른 우선순위가 높은 작업들이 처리 될 때 까지 연기되며 실제 Host의 장치 드라이버를 사용하기까지 오랜 시간이 걸린다. 이것 뿐만아니라 장치를 에뮬레이션 하는 작업 또한 유저 스페이스에서 이뤄지기 때문에 커널내의 작업보다 미뤄게되고 실제로 장치를 사용하는 Native 드라이브와 통신하기 위해선 여러번 context switch가 일어나게돼 오버헤드가 발생한다. 그림 1. virtio 장치 구조 이런 오버헤..
-
virtio개발/가상화 2018. 7. 8. 12:12
QEMU를 이용해서 Full virtualization으로 VM을 돌릴 경우 Guest OS에 별다른 수정 사용 할 수 있다는 장점이 있으나 매번 Guest의 명령어를 트랩해서 장치를 에뮬레이션 해줘야 하므로 느리다는 단점이 있다. 그래도 과거와 달리 요즘에는 하드웨어가 좋아져서 마우스나 키보드를 사용할 때 버벅거리지 않아 거의 성능에 문제가 없어 보이는 착각이 들지만 실제로 벤치마크 툴을 이용해 Guest 장치의 성능을 Host와 비교해보면 심각할 정도로 낮다. 이런 문제를 해결하고자 가상화 개발자는 virtio라는 구조를 창안해냈다. 이 구조의 주요 개념은 일부 장치에 대해서는 매번 트랩해서 emulation 하지 말고 Hypervisor와 Guest가 바로 통신 할 수 있는 채널을 만들어 불필요한 ..
-
VFIO, Passthrough개발/가상화 2018. 6. 30. 13:40
VFIO (Virtual Function I/O) 일반적으로 유저 애플리케이션에서 특정 장치를 이용하기 위해선 먼저 Host OS에서 해당 장치를 전담하는 유저 서비스(안드로이드는 surface flinger 같은게 있다)에게 요청하고, 유저 서비스는 커널 단의 장치 드라이버에 작업을 전달하며 장치 드라이버는 전달 받은 요청에 따라 장치를 실제로 움직이게 된다. 이러한 형태는 유저 앱의 입장에서 꽤 단순한 작업을 해도 커널 단의 장치드라이버에 불필요한 작업이 많다면 이에 비례해서 처리하는 시간이 늘어나게돼 유저앱의 성능이 저하되는 일이 발생한다. 이를 해결하고자 리눅스 커널에서는 유저 영역에서 직접 장치에 접근 할 수 있는 플랫폼을 만들었다. 간단히 말해 장치 드라이버를 커널에 두지 않고 유저 영역에 드..