37. Vhost Library

37. Vhost Library

        vhost库实现了一个用户空间virtio net服务器,允许用户直接操作virtio ring。换句话说,它允许用户从VM virtio net设备接收/发送数据包。为了实现这一点,vhost库应该能够:

  • 访问客户内存:对于QEMU,这是通过使用-object memory-backend-file,share=on,...选项实现的。这意味着QEMU将创建一个文件作为客户RAM,share=on选项允许另一个进程映射该文件,这意味着它可以访问客户RAM。
  • 了解有关vring的所有必要信息:信息-如可用的戒指存储在哪里。Vhost定义了一些消息(通过一个Unix域套接字文件传递)来告诉后端所有需要知道如何操作vring的信息。
37.1. Vhost API Overview
        以下是一些关键的Vhost API函数的概述:
  • rte_vhost_driver_register(path, flags)
    该函数将一个vhost驱动程序注册到系统中。path指定了Unix域套接字文件路径。
        目前支持的标志是:
  1.  RTE_VHOST_USER_CLIENT            当给定此标志时,DPDK vhost- user将充当客户端。请参阅下面的解释。
  2. RTE_VHOST_USER_NO_RECONNECT       当DPDK vhost- user充当客户端时,它将持续尝试重新连接到服务器(QEMU),直到成功。
    在两种情况下是有用的:
    当QEMU尚未启动时;当QEMU重启时(例如,由于客户操作系统重启)。这个重新连接选项是默认启用的。但是,设置此标志可以关闭它。
  3. RTE_VHOST_USER_DEQUEUE_ZERO_COPY  当设置此标志时,将启用Dequeue zero copy。缺省情况下,它是禁用的。在设置此标志时,
                                                                               您可能想知道一些事实(包括限制):
    *零拷贝不利于小数据包(通常是在512以下的数据包大小);
    *零拷贝非常有利于VM2VM的情况。对于两个vm之间的iperf,性能提升可以超过70%(当TSO是使能时);
    *对于VM2NIC情况,nb_tx_desc必须足够小,如果不启用virtio间接特性时< = 64,如果启用了该特性时< = 128。
            这是因为当dequeue zero copy启用时,只有当相应的mbuf被释放时,guest Tx使用的vring才会更新。因此,nb_tx_desc必须足够小,
    以便PMD驱动程序能够及时地耗尽可用的Tx描述符和免费的mbufs。否则,客户端Tx vring就会被饿死。
    *客户内存应该以hugepage来支持,以获得更好的性能。使用1G的页面大小是最好的。
            当dequeue zero copy启用时,客户物理地址和主机物理地址映射必须建立。使用非大页意味着更多的页面片段。为了简单点,
    DPDK vhost对这些区段进行线性搜索,因此区段越少,我们得到映射的速度就越快。注意:我们可能在未来使用树搜索来加快速度。
  4. RTE_VHOST_USER_IOMMU_SUPPORT      当设置此标志时,将启用IOMMU支持。默认情况下,它是禁用的。
            启用此标志可以使用客户 vIOMMU来保护vhost不被访问内存(virtio设备不允许,当该特性被协商,并声明一个IOMMU设备时)。
            但是,该特性使能了vhost - user的reply - ack协议特性,在执行多队列时,该特性在Qemu v2.7.0- v2.9.0中实现。在声明多个队列时,
    使能这个标志在上面提到的Qemu版本中会导致阻塞。
  • rte_vhost_driver_set_features(path, features) 
            该函数设置vhost - user驱动程序支持的特性位。vhost- user驱动程序可能是vhost - user网络,也可以是其他什么,比如vhost -user SCSI。
  • rte_vhost_driver_callback_register(path, vhost_device_ops)
            这个函数注册了一组回调函数,让DPDK应用程序在某些事件发生时采取适当的操作。目前支持下列活动:
            *new_device(int vid) 当virtio设备准备就绪时,将调用此回调函数。vid是vhost设备ID。
            *destroy_device(int vid) 当一个virtio设备被暂停或关闭时,将调用此回调函数。
            *vring_state_changed(int vid, uint16_t queue_id, int enable) 当更改特定队列的状态时,将调用此回调函数,
                                                                                                                                                  例如启用或禁用某个队列的状态。
            *features_changed(int vid, uint64_t features) 在特性被更改时调用此回调。例如,VHOST_F_LOG_ALL在实时
                                                                                                                 迁移的开始/结束处被设置/清除。
            *new_connection(int vid) 这个回调是在有新的vhost - user套接字连接时调用的。如果DPDK充当服务器,
                                                                  那么在接收到destroy_connection 回调之前,该设备不应该被删除。
            *destroy_connection(int vid) 这个回调是在vhost - user套接字连接关闭时调用的。表明id 为vid的设备已不再使用,可以安全删除。
  • rte_vhost_driver_disable/enable_features(path, features))
            该函数禁用/启用某些特性。例如,它可以用于禁用合并缓冲区和TSO特性,这两个特性都是默认启用的。
  • rte_vhost_driver_start(path)
            这个函数触发了vhost - user协商。它应该在完成初始化vhost-user驱动程序后调用。
  • rte_vhost_enqueue_burst(vid, queue_id, pkts, count)
            传输(入列)count个数据包从主机到客户。
  • rte_vhost_dequeue_burst(vid, queue_id, mbuf_pool, pkts, count)
        接收(出队)来自客户的count数据包,并将它们存储在pkts中。

37.2. Vhost-user Implementations
        vhost用户使用Unix域套接字来传递消息。这意味着DPDK vhost- user实现了两个选项:
  • DPDK vhost-user作为服务器
    DPDK将创建一个Unix域套接字服务器文件,并监听前端的连接。注意,这是默认模式,也是DPDK v16.07之前的唯一模式。   
  • DPDK vhost-user作为客户端
    与服务器模式不同,此模式不创建套接字文件;它只是尝试连接到服务器(根据服务器创建的文件)。  
    当DPDK vhost- user应用程序重新启动时,DPDK vhost- user将尝试再次连接到服务器。这就是“重新连接”功能的工作原理。 
    !note
            *重连特性需要QEMU v2.7及其以上的版本支持。
            *在重新启动之前和之后,vhost支持的特性必须是完全相同的。例如,如果TSO被禁用,然后启用,什么都没生效,并且可能发生未定义的问题。
        无论使用哪种模式,一旦建立了连接,DPDK vhost- user将开始接收和处理来自QEMU的vhost消息。
        对于带有文件描述符的消息,文件描述符可以直接在vhost进程中使用,因为它已经被Unix域套接字安装了。
支持的vhost消息是:
  • VHOST_SET_MEM_TABLE
  • VHOST_SET_VRING_KICK
  • VHOST_SET_VRING_CALL
  • VHOST_SET_LOG_FD
  • VHOST_SET_VRING_ERR
        对于 VHOST_SET_MEM_TABLE消息,QEMU将在消息的辅助数据中为每个内存区域及其文件描述符发送信息。文件描述符用于映射该区域。
        VHOST_SET_VRING_KICK 作为将vhost设备放入数据平面的信号
        VHOST_GET_VRING_BASE 作为将vhost设备从数据平面移除的信号
        当套接字连接关闭时,vhost将破坏设备。
37.3. Vhost supported vSwitch reference
        要了解更多vhost的详细信息,以及如何在vSwitch中支持vhost,请参阅DPDK示例应用程序指南中的vhost示例。

猜你喜欢

转载自blog.csdn.net/shaoyunzhe/article/details/78922249