随着qemu2.1的发布,可以看到,qemu支持了vhost-user。从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢?并且这个特性带来了怎样的改进?
在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是非常一个不错的选择。
但是,e1000网卡上也包含了复杂的io端口,寄存器,缓存配置,虚拟机每次收发包都会引起更多的io和mmio操作,使得虚拟机频繁的陷出,最终导致网络性能不佳。
为了解决性能问题,IBM在2005年提出了virtio, 虚拟机中的半虚拟化前端驱动和主机上的后端服务简单的使用virtqueue共享队列交换数据,大幅的减少了e1000模拟时复杂的io操作,从而可以较大程度的提升虚拟网络性能。
作为对比,从下面简单的iperf测试中,我们就能看出两者的性能差距:
With virtio
1
2
3
4
5
6
7
|
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
Client
connecting
to
virtio
,
TCP
port
5001
TCP
window
size
:
16.0
KByte
(
default
)
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
[
3
]
local
10.0.1.172
port
54168
connected
with
10.0.1.33
port
5001
[
3
]
0.0
-
10.0
sec
1.34
GBytes
1.15
Gbits
/
sec
|
Without virtio
1
2
3
4
5
6
7
|
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
Client
connecting
to
novirtio
,
TCP
port
5001
TCP
window
size
:
16.0
KByte
(
default
)
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
[
3
]
local
10.0.1.172
port
34414
connected
with
10.0.1.13
port
5001
[
3
]
0.0
-
10.0
sec
375
MBytes
315
Mbits
/
sec
|
vhost技术对virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以再内核态得到处理。
virtio的io路径
vhost的io路径
vhost将部分virio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能, 下面的网络延时测试可以看出vhost的优势:
随着技术的发展,将网络数据放入用户态处理将可以得到更灵活的形式。在原有的vhost架构中,进行了改动,增加了 一种新的vhost-backend,叫做vhost-user。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
+
--
--
--
--
--
--
--
-
+
--
--
--
+
--
+
--
--
--
--
--
+
--
+
|
+
--
--
--
+
+
--
--
--
--
--
+
|
|
user
|
|
|
|
|
|
space
|
|
|
guest
|
|
|
|
|
|
|
|
|
+
-
+
--
--
--
-
+
|
qemu
|
|
+
-
+
--
--
--
+
|
|
|
snabb
|
|
|
|
|
virtio
|
|
|
|
|
|
|
|
|
driver
|
|
|
+
--
--
--
--
-
+
+
--
--
--
+
+
-
+
--
-
++
--
-
+
|
|
|
|
|
|
|
^
|
|
|
|
|
v
|
|
v
|
|
+
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
+
--
+
--
--
-
+
|
nic
+
+
--
--
--
--
--
--
--
--
--
--
--
-
+
kvm
.
ko
|
|
+
--
-
+
+
--
+
--
--
-
+
|
kernel
|
+
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
|
vhost-user的io路径
vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。从图上可以看到vhost-backend从原来咋kernel中的vhost-net 变成了用户空间的snabbswitch。 snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。
snabbswitch主要使用了下面的技术来提高性能
值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。
使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到nic的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。
版权属于: 云计算技术分享交流
原文地址: http://t.51gocloud.com/?p=402
转载时必须以链接形式注明原始出处及本声明。