DPDK vhost库

原创翻译,转载请注明出处。网络

 

vhost库实现了一个用户空间的virtio net server,容许用户直接处理virtio ring队列。换句话说,它让用户能够从VM virtio网络设备读取或写入数据包,为了达到这个目的,vhost库应该能够:session

  • 访问客户虚拟机内存,对于QEMU,这个是经过设置 -objectmemory-backend-file,share=on,...选项。这意味着QEMU将会在客户虚拟机的内存里建立一个文件,share=on 选项容许其余进程访问这个文件,也就意味着能访问客户虚拟机内存。
  • 知道vring全部必需的信息,如可用的ring存储在哪里,vhost定义了一些消息,经过Unix domain socket文件来通知后台全部的信息,这样就知道如何去处理这个vring了。


vhost API概述dom


rte_vhost_driver_register(path, flags) 这个函数主要是向系统注册vhost驱动,path 是指定Unix domain socket文件路径。
当前支持的flags有:socket

  • RTE_VHOST_USER_CLIENT DPDK 若是设置了这个值,vhost-user将会做为客户端,下面会有解释。
  • RTE_VHOST_USER_NO_RECONNECT 当DPDK vhost-user做为客户端的话,它会一直尝试重连服务端QEMU直到成功。这在下面2种状况下很是有用:

    当QEMU尚未启动时
    当QEMU重启时(好比客户操做重启了)
    重连选项默认是开启的。然而,这个flag会让它关闭。ide

  • RTE_VHOST_USER_DEQUEUE_ZERO_COPY 如何设置了这个值,出队零拷贝选项会被开启。默认是关闭的。这有一些事实(包括限制)你须要知道当你要去设置这个值的时候:

      零拷贝对小数据包是不友好的(典型是报文长度小于512)。
      零拷贝在VM2VM的状况下是很是好的。好比在2个VM之间运行iperf,在开启了TSO的状况下,提高到70%以上。
      对于VM2NIC的状况,nb_tx_desc必须足够的小,若是virtio间接特性没开启小于等于64,若是开启了,小于等于128.这是由于当出队零拷贝若是开启了的话,客户TX使用的vring,只有在对应的mbuf释放了才会更新。函数

     所以,nb_tx_desc必须是足够小,只有这样才能使PMD驱动及时的用完可用的Tx描述符和释放mbuf。不然,客户Tx vring会被饿死。
    性能

客户内存基于巨页内存会得到更好的性能。1G大小是最好的。当出队零拷贝开启了,客户物理内存地址和主机物理地址的映射必须创建好。使用非巨页内存意味着很是多的页分段。ui

为了简化处理,DPDK vhost使用了线性查找这些段,所以段越小,就能越快的获取到这个映射关系。舒适提示:未来会使用树查找来提速。

rte_vhost_driver_session_start()                                       这个函数启动vhost会话来轮询处理vhost消息。这是个无限循环,所以应该放到一个专用线程里来调用。
rte_vhost_driver_callback_register(virtio_net_device_ops)    这个函数注册一系列回调函数,使得DPDK应用程序在事件发生的时候调用合适的函数。当前支持以下事件:spa

  • new_device(int vid)

    这个回调是在有一个virtio网络设备处于就绪的时候调用,vid是这个virtio设备ID。线程

  • destroy_device(int vid)

    这个回调是在有一个virtio网络设备关闭(或者链接断开)的时候调用,vid是这个virtio设备ID。

  • vring_state_changed(int vid, uint16_t queue_id, int enable)

    这个回调是当指定的队列状态变化的时候(好比开启或中止)调用。

rte_vhost_enqueue_burst(vid, queue_id, pkts, count)                      发送(入队)count 个数量的数据包从主机到客户虚拟机。
rte_vhost_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count)     从客户虚拟机接收(出队)count个数量的数据包,并存储在pkts上。
rte_vhost_feature_disable/rte_vhost_feature_enable(feature_mask)  这个函数关闭或开启一些特性。举个栗子,它能关闭可合并缓冲区和TSO特性,默认这2个是开启的。

vhost-user的实现


vhos-user经过Unix domian socket来传递消息。这意味着DPDK vhost-user的实现有2个选项:
DPDK vhost-user做为服务端
DPDK 会建立一个Unix domain socket服务文件并在它上面监听链接。
注意:这是默认模式,在DPDK 16.07以后惟一的模式
DPDK vhost-user做为客户端
不像服务端模式,这个模式不建立socket文件,它只是尝试去链接服务端。
当DPDK vhost-user应用程序重启了,DPDK vhost-user会尝试从新链接服务端。这就是reconnect特性是怎样工做的。

注意:
    重连特性要求QEMU 2.7版本及以上。
    vhost支持的特性必须在重启先后都彻底一致。举个栗子,TSO关闭了而后开启,不会有任何做用并可能发生未知问题。

无论哪一种模式,一旦链接创建了,DPDK vhost-user将会启动接收并处理来自QEMU的vhost消息。
对于文件描述符的消息,文件描述符能够直接在vhost进程里,当它已经经过 Unix domain socket安装了。
支持以下的vhost消息:

  1. VHOST_SET_MEM_TABLE
  2. VHOST_SET_VRING_KICK
  3. VHOST_SET_VRING_CALL
  4. VHOST_SET_LOG_FD
  5. VHOST_SET_VRING_ERR


对于VHOST_SET_MEM_TABLE消息,QEMU会发送每个内存区域的信息而且它的文件描述符在这个消息的辅助数据里。这个文件描述就是用来映射这块内存区域的。

VHOST_SET_VRING_KICK用来做为信号将vhost设备放入到数据平面,VHOST_GET_VRING_BASE做为信号去数据平面删除vhost设备。
当socket链接关闭时,vhost会删除这个设备。

vhost支持vSwitch参考手册


参考DPDK Sample Application Guide。

相关文章
相关标签/搜索