DPDK vhost库
原创翻译,转载请注明出处。
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消息:
- 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设备。
当socket连接关闭时,vhost会删除这个设备。
vhost支持vSwitch参考手册
参考DPDK Sample Application Guide。
DPDK vhost库的更多相关文章
- DPDK之(八)——vhost库
转:http://www.cnblogs.com/danxi/p/6652725.html vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队 ...
- DPDK LPM库(学习笔记)
1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配(LPM)表查找方法,该方法通常用于在IP转发应用程序中找到最佳路由匹配. 2 LPM API概述 LPM组件实例的主要配置参数是 ...
- DPDK Mempool 库原理(学习笔记)
1 前置知识点学习(了解) 从CPU到实际的存储节点,依据层级划分:Channel > DIMM > Rank > Chip > Bank > Row /Column 1 ...
- DPDK latencystats库使用方案
初始化 注意务必调用 rte_metrics_init /* init latency stats */ /* @TODO should we remove this in product env? ...
- DPDK架构与特点(转)
from:http://www.cnblogs.com/mylinuxer/p/4277676.html DPDK架构与特点 当年在某公司实习的时候,当时老大给了我一份DPDK的文档,说是将来很有用, ...
- 绝对干货!初学者也能看懂的DPDK解析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...
- 阅读 DPDK 中文论文两则
基于DPDK的高效数据包捕获技术分析与应用 本文应用场景 网络安全领域的数据包捕获技术,对系统有高性能需求,要在短时间内成功收集.分析.处理大量数据,实时捕获效率低下. 旧有传统数据包处理机制 BPF ...
- DPDK架构与特点
当年在某公司实习的时候,当时老大给了我一份DPDK的文档,说是将来很有用,熟悉DPDK对能力提高也有帮助,就试着翻译了 <Intel DPDK Getting Started Guide> ...
- dpdk对虚拟化的支持调研
目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...
随机推荐
- Spring-Day03-注解注入&AOP入门-作业
IOC(DI) —— 注解 注解入门: 在applicationContext.xml中引入context约束 打开spring-framework-4.2.4.RELEASE\docs\spring ...
- 2、开发环境搭建-window平台
一.搭建ReactNative环境 首先安装node.js和python2.xx版本,不要装python3.xx,这个官方是特别说明的,请注意.NodeJs官方下载:https://nodejs.or ...
- MyEclipse格式化JSP代码导致Java表达式<%= %>自动换行的解决办法
MyEclipse格式化JSP代码导致Java表达式<%= %>自动换行的解决办法: 可以将Java表达式<%= %>换成EL表达式.
- iptables应用
192.168.4.119 为本机的ip地址:每条链的规则是由上至下进行匹配,因此我们需要把范围小的规则放在上面以防被覆盖. 1)清空iptables默认规则,并自定义规则 [root@iptable ...
- centos7-mongodb3.4.6集群的搭建
0.需要环境 安装包:mongodb-linux-x86_64-3.4.6.tgz 安装路径:/usr/mongodb 服务器: 192.168.177.131/132/133 mongos 2000 ...
- Eclipse中各种文件的注释与取消注释的快捷键
Eclipse中各种文件的注释与取消注释的快捷键 Java文件: 注释和取消注释的快捷键都是:CTRL + / 或 Shift+Ctrl+C JS文件: 注释和取消注释的快捷键都是:CTRL + / ...
- webpack 4.14配置详解
1.安装nodejs 官网下载nodejs,安装时可能会爆 2503错误,解决办法是:使用管理员命令执行安装文件.cmd ->命令提示符(管理员)-> 输入: msiexec /packa ...
- 单调队列优化dp
洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...
- Hue 工具使用
Hue 是一个 Web 接口的 Hadoop 分析数据工具,由 Cloudra 公司开源 官方网址 Github 地址 -> 安装方法 文档地址 一.Build 1.ubuntu安装所需环境(以 ...
- 仿造vue-resource的formdata传对象
众插件不支持同步,也是没办法的事情,具体为啥就不分析了,确实搞不懂. 一直用vue-resource的post,觉得很舒服. 然,没办法只能仿造一个,自己提供一个同步方法 几个点先摆清楚 1. .th ...