-
Vhost는 Virtio를 이용한 장치 가상화의 성능을 개선하는 모듈이다. 일반적으로 Virtio를 이용하는 장치들은 모두 virtqueue 기반의 킥 메커니즘으로 backend와 frontend가 통신한다. 그런데 이때 virtqueue를 처리하는 주체는 QEMU에서 만든 유저 프로세스이기 때문에 다른 우선순위가 높은 작업들이 처리 될 때 까지 연기되며 실제 Host의 장치 드라이버를 사용하기까지 오랜 시간이 걸린다. 이것 뿐만아니라 장치를 에뮬레이션 하는 작업 또한 유저 스페이스에서 이뤄지기 때문에 커널내의 작업보다 미뤄게되고 실제로 장치를 사용하는 Native 드라이브와 통신하기 위해선 여러번 context switch가 일어나게돼 오버헤드가 발생한다.
그림 1. virtio 장치 구조
이런 오버헤드를 해결하기 위해 창안된 구조가 vhost다. vhost는 QEMU처럼 유저스페이스위에 돌아가는 virtqueue를 Host의 커널에서 직접 접근 할 수 있고 이를 바탕으로 backend 드라이버와 emulation 코드가 native driver가 있는 kernel 영역에서 동작하도록 한다. 이런 구조면 virtqueue로 주고 받는 통신을 qemu에서 처리할 필요가 없어 지연 될리가 없고 또한 이미 kernel내로 내려왔기 때문에 그림 1 처럼 장치 에뮬레이션을 하기 위해 번거롭게 여러번 context switch를 할 필요도 없다.
그림 2. vhost 구조
vhost를 사용한 대표적인 장치는 vhost-net, 네트워크다. 아무래도 네트워크를 사용하면 Host와 Guest가 패킷을 주고 받는 일이 많은데 이때 기존의 킥 매커니즘을 사용하면 오버헤드가 많아 이를 손보기 위해 가장 먼저 나온 것 같다.
그런데 몇몇 드라이버의 경우에는 user space에서 존재하는 드라이버를 사용하는 경우가 있다. 이때는 backend를 커널 내에서 돌리는 것보다 유저단에서돌아가야 하며 user space에서 돌아가는 드라이버 프로세스와 통신해야 한다. vhost-user는 이런 경우를 대비해서 만들어졌다. vhost의 구조는 그대로 따라가는 대신 user space에서 돌아가는 에뮬레이션 구조로 보면 된다
아래 참고사이트를 이용하면 이해하는데 훨씬 도움이 될 것 같다.
2. Vhost-User Feature for QEMU
'개발 > 가상화' 카테고리의 다른 글
kvm ioeventfd (0) 2018.08.11 kvm irqfd (1) 2018.08.11 virtio (0) 2018.07.08 VFIO, Passthrough (0) 2018.06.30 QEMU 성능 문제 - 개론 (0) 2018.05.30