DPDK系列之十虚拟化vhost和virtio的数据交互

一、前后端的数据通信

在把虚拟化,虚拟化的方式介绍完成后,重点分析了半虚拟化的virtio,对进分成前后端两部分以及从后端发展到内核再发展到纯用户态也一路进行了分析。那么这就提出来了一个问题,在virtio中,数据是如何通信的,它们的框架流程是什么,有没有什么不同的?具体的性能如何,这都需要进一步的分析和说明。
在前面提到过前后端的驱动是通过virqueue传输数据结构抽象模型,其具体的实现为virtio_ring这个个体的数据类型。可以理解为数据队列和队列存储的具体数据类的关系。

二、virtio和vhost的通信

下面看一下virtio的IO路径传递过程,就可以清晰的看出其发展的过程,在virtio的标准中,一般来说是由Client(Guest)设置发送的数据(Tx),然后Kick(前端Client通知后端Host叫Kick)后端的host,然后陷出(从虚拟机进入 VMM,反之为陷入)KVM,KVM从内核态切换到切换到用户态的qemu进程,然后再将数据传递到tap设备;而由内核态控制的virtio-net前面和标准设计一致,只是在最后一步,不再由内核转到用户态,而是直接由vhost-net把数据传递给tap设备;而做为virtio-use则在用户态进程中通知vhost-backend(陷出前与前面两种均相同),将数据直接发送到nic设备。

下面的就具体的前后端后通信,看一下数据流动的过程:
1、Guest(qemu)创建共享内存,通知内核vhost-net或者通过Unix domain使用Socket与其它进程通信,即vhost-user。这里以后者为例
2、利用sendmsg/recvmsg传递文件描句柄,通过Guest创建共享内存,发送句柄到server,server通过内存映射直接操作(mmap,减少文件打开动作)
3、guest和Server通过数据结构virtio_ring共享内存,每一段是一个virtio_ring,可以有多段
4、Guest(Client)初始化共享内存virtio_ring
5、Guest发送virtio_ring的desc,avail,used地址给server,server通过mmap后,计算出Server端这些(desc,avail,used)地址进行数据读写(数据指针需要在client和Server地址转换)
6、读写操作:在Net通信中,一个发送tx,一个接收rx两个virtio_ring
7、共享内存保持有desc,avail,used等相关信息(包括avail->idx, used->idx等)
8、当Guest写数据时,数据放在virtio_ring的last_avail_idx中(last_avail_idx、last_used_idx在Guest和Server中不同,为链表的头尾),其将id增加到avail中并将shared.avail.idx++
9、Server接收信号通知即从last_avail_idx到avail->idx开始读取数据
10、Server端处理一条请求完成其last_avail_idx++, 同时插入 id 到 used中,used.idx表示最新的位置信息
11、Server通知client处理完成消息,client即可回收used的描述符
12、client通知server的过程(kick),Kickfd,callfd均为client创建,通过unix domain发送server
通过vhost-user技术,从虚拟机到host利用大页共享实现了数据的zero copy,而从host到nic也实现zero copy,这样,就进一步加快了数据的传输。

三、DPDK中的应用和优化

DPDK中由于只针对特定的NET设备,所以对相关的传输进行了进一步的优化即对网络发送包和发送过程中的支持。在DPDK的vhost-virtio中,为不同的用户场景提供了三种数据收发(Rx和Tx)路径。可合并路径(大数据包Rx / Tx设计)为专门的IO转发的向量路径,如未给参数,则默认为不可合并路径。
1、可合并路径
虚拟机将vring中的独立mbuf组织为一个链表,用来接收各种数据包。
2、向量路径
利用处理器中的单个指令,通过SIMD来处理收发数据,在只处理IO数据包转发这类数据时,性能会更优。
3、不可合并的路径
一种比较少使用的方式。

四、总结

从上面的分析可以看出virtio的技术的发展过程以及DPDK中对virtio的使用。经历的越多越会发现,其实技术的突破很少是一下子暴发式突破的,更多的是不断的积累各种技术,最后到达一个瓶颈后,才会有重大突破。很多技术都是在实践遇到各种问题后,不断的从这些具体问题入手,最后通过抽象、共用组合出一套新的技术框架来。
多看看一些牛人的框架,一定受益匪浅。要善于学习,善于借鉴。用其之长,而非其短。

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/129769738
今日推荐