什么是 vhost-user

在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 kvm.ko 的交互只有一次用户态的切换以及数据拷贝。这个方案对于不同 host 之间的通信,或者 guest 到 host nic 之间的通信是比较好的,但是对于某些用户态进程间的通信,比如数据面的通信方案,openvswitch 和与之类似的 SDN 的解决方案,guest 需要和 host 用户态的 vswitch 进行数据交换,如果采用 vhost 的方案,guest 和 host 之间又存在多次的上下文切换和数据拷贝,为了避免这种情况,业界就想出将 vhost 从内核态移到用户态。这就是 vhost-user 的实现。

vhost-user 的实现

vhost-user 和 vhost 的实现原理是一样,都是采用 vring 完成共享内存,eventfd 机制完成事件通知。不同在于 vhost 实现在内核中,而 vhost-user 实现在用户空间中,用于用户空间中两个进程之间的通信,其采用共享内存的通信方式。

vhost-user 基于 C/S 的模式,采用 UNIX 域套接字(UNIX domain socket)来完成进程间的事件通知和数据交互,相比 vhost 中采用 ioctl 的方式,vhost-user 采用 socket 的方式大大简化了操作。

vhost-user 基于 vring 这套通用的共享内存通信方案,只要 client 和 server 按照 vring 提供的接口实现所需功能即可,常见的实现方案是 client 实现在 guest OS 中,一般是集成在 virtio 驱动上,server 端实现在 qemu 中,也可以实现在各种数据面中,如 OVS,Snabbswitch 等虚拟交换机。

如果使用 qemu 作为 vhost-user 的 server 端实现,在启动 qemu 时,我们需要指定 -mem-path 和 -netdev 参数,如:

$ qemu -m 1024 -mem-path /hugetlbfs,prealloc=on,share=on \
-netdev type=vhost-user,id=net0,file=/path/to/socket \
-device virtio-net-pci,netdev=net0

指定 -mem-path 意味着 qemu 会在 guest OS 的内存中创建一个文件,share=on 选项允许其他进程访问这个文件,也就意味着能访问 guest OS 内存,达到共享内存的目的。

-netdev type=vhost-user 指定通信方案,file=/path/to/socket 指定 socket 文件。

当 qemu 启动之后,首先会进行 vring 的初始化,并通过 socket 建立 C/S 的共享内存区域和事件机制,然后 client 通过 eventfd 将 virtio kick 事件通知到 server 端,server 端同样通过 eventfd 进行响应,完成整个数据交互。

几个例子

开源社区中实现了一个项目 Vapp,主要是用来测试 vhost-user 的 C/S 模式的,github 地址如下:

https://github.com/virtualopensystems/vapp.git

使用:

$ git clone https://github.com/virtualopensystems/vapp.git
$ cd vapp
$ make
// 运行 server 端
$ ./vhost -s ./vhost.sock
// 运行 client 端
$ ./vhost -q ./vhost.sock

通过以上步骤,就可以启动 vhost-user 的 C/S 模式。

另外还有例子就是集成在虚拟交换机 Snabbswitch 上的 vhost-user,通过以下方式获得 vhost-user 分支:

$ git clone -b vhostuser --recursive https://github.com/SnabbCo/snabbswitch.git
$ cd snabbswitch
$ make
测试:
$ sudo src/snabbswitch -t apps.vhost.vhost_user

还有例子就是 qemu 上的实现,这也是最原早的实现,同样通过以下方式来获得使用:

$ git clone -b vhost-user-v5 https://github.com/virtualopensystems/qemu.git
$ mkdir qemu/obj
$ cd qemu/obj/
$ ../configure --target-list=x86_64-softmmu
$ make -j

除此之外,还有很多的实现,如 OVS 和 DPDK 上都有实现,这实际上是集成了 vhost-user 的通用 API。

总结

virtio,vhost,vhost-user 是基于场景和性能而提出的三种 guest 和 host 之间的通信方案,三种方案,各有优劣。

vhost-user 用在很多数据面之上的进程间通信,效率高。

原文链接:https://cloud.tencent.com/developer/article/1075606

KVM中vhost-user简介(十三)相关推荐

  1. C#中的Dictionary简介

    C#中的Dictionary简介  http://www.cnblogs.com/ccczqh/archive/2011/01/04/1925852.html 简介 在C#中,Dictionary提供 ...

  2. NCBI中SRA数据库简介

    NCBI中SRA数据库简介 SRA数据库简介 SRA 数据库, 为Sequence Read Archive 的缩写.主要存储高通量测序的数据,来自四个测序平台,分别为: Roche_LS454,Il ...

  3. KVM中ioeventfd创建与触发的大致流程(十四)

    在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行.具体是如何建立这个ioeventfd的呢?流程理出来了 ...

  4. SAP HANA中的SLT简介

    SAP HANA中的SLT简介 目录 SAP系统和SAP HANA之间的SLT连接架构 在SAP源系统中配置SLT服务器 通过SLT将数据从SAP源导入至SAP HANA 非SAP系统和SAP HAN ...

  5. java 8 stream中的Spliterator简介

    文章目录 简介 tryAdvance trySplit estimateSize characteristics 举个例子 总结 java 8 stream中的Spliterator简介 简介 Spl ...

  6. 决策树编程python_Python如何制定决策:编程中的控制流简介

    决策树编程python by Ivan Leo 伊万·利奥(Ivan Leo) Python如何制定决策:编程中的控制流简介 (How Python makes decisions: an intro ...

  7. Linux中用户的简介与管理

    女主宣言 众所周知,linux是一个多用户.多任务的操作系统.那么linux是如何区分和认证用户的,系统对每个用户的授权是如何管理的,出现问题时是如何追朔每个用户在系统内的操作记录,这些就涉及到了li ...

  8. ASP.NET 程序中常用的三十三种代码(1)

    ASP.NET 程序中常用的三十三种代码(1) 1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open('*.ASPx ...

  9. python中set函数_python中set()函数简介及实例解析

    set函数也是python内置函数的其中一个,属于比较基础的函数.其具体介绍和使用方法,下面进行介绍. set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并 ...

  10. java spliterator_java 8 stream中的Spliterator简介

    java 8 stream中的Spliterator简介 简介 Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列. 只要用到stream的地方都需 ...

最新文章

  1. Django介绍和虚拟环境(django特点、MVC、MVT、Django学习资料)
  2. Error in Math.factor() : ‘sqrt’ not meaningful for factors
  3. [HTML/CSS]colum-gap属性
  4. CentOS6.6配置iptables
  5. 为什么要开这个博客?我在这个博客里写什么?
  6. foreach ($cc as $key = $item);$item加与不加的区别
  7. GitHub, Google Code, and other
  8. java主要内存区域_可能是把Java内存区域讲的最清楚的一篇文章
  9. 在.NET Core类库中使用EF Core迁移数据库到SQL Server
  10. 针对数据库连接池到DRDS连接探活的优化
  11. mysql操作符_MySql 中的=操作符
  12. Python操作数据库完成接口测试
  13. pypy mysql 兼容_PyPy运行Django+MySQL简单教程
  14. 【Visual Assist X】VAssistX的安装和使用
  15. 将一个 iOS 设备变成 iBeacon
  16. 复杂网络盘传播搜索关键字
  17. 修改bios密码 服务器,为BIOS设置密码让我们的系统更加安全
  18. 免费中通快递对接快递鸟单号查询接口对接方法
  19. win10系统安装Webloic12C操作方法
  20. 数据库基本术语DDL,DML, DCL

热门文章

  1. python3语法错误-python3中的def函数语法错误
  2. python装饰器类-基于类的python装饰器
  3. python与php8-详解Python中Unicode和utf-8
  4. 怎么自学python自动化测试-Python移动自动化测试面试 学习 教程
  5. python 打开文件-Python打开文件的方式
  6. python电脑上怎么下载-python下载文件的三种方法
  7. python基础第三章选择结构答案-Python days03-选择结构【if】
  8. python实训项目-Python开发基础-项目实训-在线投票系统.pptx
  9. python编程培训-马哥教育官网-专业Linux培训班,Python培训机构
  10. 学习python需要什么基础-学习Python需要哪些基础知识?