转:http://www.cnblogs.com/danxi/p/6652725.html

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

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

vhost API概述


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

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

    当QEMU还没有启动时
    当QEMU重启时(比如客户操作重启了)
    重连选项默认是开启的。然而,这个flag会让它关闭。

  • 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大小是最好的。当出队零拷贝开启了,客户物理内存地址和主机物理地址的映射必须建立好。使用非巨页内存意味着非常多的页分段。

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

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

  • 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会删除这个设备。

DPDK之(八)——vhost库的更多相关文章

  1. DPDK vhost库

    原创翻译,转载请注明出处. vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队列.换句话说,它让用户可以从VM virtio网络设备读取或写入 ...

  2. 译文:ovs+dpdk中的“vHost User NUMA感知”特性

    本文描述了"vHost User NUMA感知"的概念,该特性的测试表现,以及该特性为ovs+dpdk带来的性能提升.本文的目标受众是那些希望了解ovs+dpdk底层细节的人,如果 ...

  3. [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载

    1.  修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...

  4. ovs+dpdk numa感知特性验证

    0.介绍 本测试是为了验证这篇文章中提到的DPDK的NUMA感知特性. 简单来说,在ovs+dpdk+qemu的环境中,一个虚拟机牵涉到的内存共有三部分: DPDK为vHost User设备分配的De ...

  5. DPDK在OpenStack中的实现

    随着云计算与大数据的快速发展,其对数据中心网络的性能和管理提出了更高的要求,但传统云计算架构存在多个I/O瓶颈,由于云平台基本上是采用传统的X86服务器加上虚拟化方式组建,随着40G.100G高速网卡 ...

  6. oracle 在C# 中调用oracle的数据库时,出现引用库和当前客户端不兼容的问题解决方案

    oracle 在C# 中调用oracle的数据库时,出现引用库和当前客户端不兼容的问题解决方案 解决方案 1.直接引用  Oracle.ManagedDataAccess.Client.dll动态库即 ...

  7. [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理

    [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理   Introduction to DPDK: ...

  8. Linux平台上DPDK入门指南

    1. 简介 本文档包含DPDK软件安装和配置的相关说明.旨在帮助用户快速启动和运行软件.文档主要描述了在Linux环境下编译和 运行DPDK应用程序,但是文档并不深入DPDK的具体实现细节. 1.1. ...

  9. DPDK编程指南 2.概述

    本章节给出了DPDK架构的一个全局概述. DPDK的主要目的就是为数据面快速报文处理应用程序提供一个简洁完整的框架.用户可以通过代码来理解其中使用的一些技术,构建自己的应用程序或添加自己的协议栈.Al ...

随机推荐

  1. ASP.Net请求处理机制初步探索之旅 - Part 3 管道(转)

    开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...

  2. 学习使用turtlebot2——调试Hokuyo激光雷达(型号UST-10LX)

    目标 在ROS上调试使用Hokuyo激光雷达传感器 配置情况     电脑使用Ubuntu 14.04版本,ROS为 Indigo,激光雷达为Hokuyo(型号UST-10LX,网口型接口)   如果 ...

  3. java 集合类复习(未完结)

    JAVA常用数据结构及原理分析(面试总结) https://blog.csdn.net/qq_29631809/article/details/72599708 java 中几种常用数据结构   ht ...

  4. JS产品分类列表练习

    CSS: ;;} ul,li{list-style: none;} body{color: #666;background: #f5f5f5;} a{text-decoration: none;col ...

  5. 快压、360压缩、WinRAR关于打开快压通过超高压缩比压缩后的文件不兼容的问题

    今天接收了同事发过来的一个压缩文件,用360压缩打开和用WinRAR打开压缩文件,傻眼了,这发的是什么鬼压缩包.压缩包的文件大小有27533KB,用360压缩工具解压查看只有121.5kb,而且完全没 ...

  6. HTML(form标签)、CSS

    一.表单标签<form> 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互. 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含t ...

  7. PHP获取与操作php.ini文件的几个函数示例

    php有一套设置和获取配置信息的函数,用于设置与修改相关参数信息.   1.ini_get()获取配置参数,ini_set()设置配置参数 <?php 2.ini_get_all()获取所有配置 ...

  8. 聊天软件项目TCP升级版

    //聊天软件项目TCP升级版 import java.io.*; import java.net.*; class TcpClient2 { public static void main(Strin ...

  9. 浅谈WebService SOAP、Restful、HTTP(post/get)请求

    http://www.itnose.net/detail/6189456.html 浅谈WebService SOAP.Restful.HTTP(post/get)请求 2015-01-09 19:2 ...

  10. 前端 and css小技巧

    随意更改网页 重新格式化代码,解决缩进问题 https://q1mi.github.io/PythonBlog/post/about_frontend/ css margin: 0 auto 居中 文 ...