virtio

기술/가상화 2018. 7. 8. 12:12 Posted by 아는 개발자

QEMU를 이용해서 Full virtualization으로 VM을 돌릴 경우 Guest OS에 별다른 수정 사용 할 수 있다는 장점이 있으나 매번 Guest의 명령어를 트랩해서 장치를 에뮬레이션 해줘야 하므로 느리다는 단점이 있다. 그래도 과거와 달리 요즘에는 하드웨어가 좋아져서 마우스나 키보드를 사용할 때 버벅거리지 않아 거의 성능에 문제가 없어 보이는 착각이 들지만 실제로 벤치마크 툴을 이용해 Guest 장치의 성능을 Host와 비교해보면 심각할 정도로 낮다.


이런 문제를 해결하고자 가상화 개발자는 virtio라는 구조를 창안해냈다. 이 구조의 주요 개념은 일부 장치에 대해서는 매번 트랩해서 emulation 하지 말고 Hypervisor와 Guest가 바로 통신 할 수 있는 채널을 만들어 불필요한 오버헤드를 줄이자는 것이다. 이를 위해 Guest에는 특정 장치가 Host와 통신하기 위한 frontend 드라이버가 있어야하고 마찬가지로 Hypervisor에도 Guest와 특정 장치가 통신 할 수 있는 backend 드라이버가 필요하다. 


그림 1. Virtio 구조.


그림 1의 왼쪽 구조는 기존에 Guest OS에 아무런 수정 없이 Full Virtualization을 사용 했을 때고 오른쪽 구조는 Guest OS와 Hypervisor에 front/backend 드라이버를 추가 했을 때다. 왼쪽 구조에서는 Guest가 장치를 사용하려는 경우 매번 트랩을 해야하는데 오른쪽 구조에서는 front/backend에서 직접 통신을 하기 때문에 별도의 트랩이 필요 없어 효율적이다. Virtio-Backend에서는 Frontend에서 받은 요청을 바로 Hypervisor에게 Emulation을 요청한다.


virtio는 Guest의 일부 수정이 필요하다는 단점이 있지만 채택시 얻게될 성능상 이득을 고려하면 이정도 불편함은 감수해야 할 것 같다. 다행히도 Linux인 경우에는 몇몇 장치들에 대해선 virtio frontend 드라이버 코드가 이미 커밋돼 있고 Windows도 주요 하이퍼바이저 커뮤니티에서는 드라이버 코드를 올려둔 상태니 적절히 찾아서 사용하면 될 것 같다.


참고문헌


1. Virtio: An I/O virtualization framework for Linux IBM Developer works

728x90

'기술 > 가상화' 카테고리의 다른 글

kvm irqfd  (0) 2018.08.11
vhost  (0) 2018.07.08
virtio  (0) 2018.07.08
VFIO, Passthrough  (0) 2018.06.30
QEMU 성능 문제 - 개론  (0) 2018.05.30
KVM - ARM  (0) 2018.01.01