[qemu] 在前端驱动使用virtio的情况下,如何让后端使用vhost-user [未解决]

本文探讨了QEMU如何使用vhost-user实现高性能网络通信。通过用户态驱动与前端virtio结合,利用MSIX技术优化中断处理。并通过具体配置示例及实验步骤,尝试在dpdk虚拟机环境中部署验证。

首先,如果你更关心原理和知识,请读读这个 http://chuansong.me/n/2186528 (值得细细的逐字读)。

在<<深入浅出dpdk>>中提到,vhost-user(用户态驱动)配合前端virtio(这就是传说中的半虚拟化)性能最佳。

我们的目标是:qemu如何使用vhost-user

一,man qemu

其中涉及到的一个名称MSIX(https://en.wikipedia.org/wiki/Message_Signaled_Interrupts)(没细看,简单的说就是PCIE很牛逼的中断 特性/技术)。

二,在man中,我们找到了这个例子

 qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
                   -numa node,memdev=mem \
                   -chardev socket,path=/path/to/socket \
                   -netdev type=vhost-user,id=net0,chardev=chr0 \
                   -device virtio-net-pci,netdev=net0

根据以上的例子猜测这个原理是这样的:host有一个net0,然后通过pci设备把net0注册给了guest里的pci网卡设备。他们在host的操作系统层面上是通过socket也就是chr0进行进程间通讯的(通讯的两个进程分别是qemu程序和用户态网卡驱动)。除了通讯呢,还与数据交换,这个交换通过hugepage完成,这个hugepage实际上是host层面上的,所以需要在host里设置hugepage然后给guest使用。

基于猜测,可以分成,内存和网卡两个部分分别对这个想法进行印证。

三,网卡部分

我们已dpdk虚拟机作为实验的对象(又是他,倒霉的虚拟机小d  - -!)

[tong@T7 dpdk]$ qemu-system-x86_64 -chardev socket,id=chr0,path=./sock,server
QEMU waiting for connection on: disconnected:unix:./sock,server
qemu-system-x86_64 -enable-kvm \
        -m 2G -cpu Nehalem -smp cores=2,threads=2,sockets=2 \
        -numa node,mem=1G,cpus=0-3,nodeid=0 \
        -numa node,mem=1G,cpus=4-7,nodeid=1 \
        -drive file=disk.img,if=virtio \
        -chardev socket,id=chr0,path=./sock \
        -netdev vhost-user,id=net0,chardev=chr0 \
        -device virtio-net-pci,netdev=net0 \
         &

命令都不对,始终不能成功,本地socket要等待链接才能继续。最终想了办法如上操作,结果第一个命令的qemu启动了,第二个却没有启动。

 悬而未决,现不弄了。。。

转载于:https://www.cnblogs.com/hugetong/p/5904799.html

### vhost-user 使用 Unix Domain Socket 共享内存实现 IPC 原理 #### 1. vhost-user 的基本概念 vhost-user 是一种基于 virtio 协议的接口设计,旨在通过用户空间驱动程序加速虚拟化网络设备的数据传输效率。它利用了 Unix Domain Socket (UDS) 来建立控制通道,并通过共享内存来完成数据平面的高效交互。 在 vhost-user 中,控制消息通过 UDS 发送至 QEMU 或其他前端组件,而实际的数据交换则依赖于预先分配并映射到双方地址空间中的共享内存区域[^1]。 --- #### 2. Unix Domain Socket 在 vhost-user 中的作用 Unix Domain Socket 提供了一种高效的进程间通信机制 (Inter-Process Communication, IPC),其特点在于低延迟高性能。相比于传统的 TCP/IP 栈,UDS 不涉及复杂的网络协议栈操作,因此更适合本地通信场景。 具体来说,在 vhost-user 架构下: - **Socket 创建与绑定**:需要先创建一个监听型 Unix Domain Socket server,用于接收来自客户端(通常是 QEMU)的连接请求。 - **消息传递**:一旦建立了连接,两端可以通过该 socket 进行控制命令的收发,例如队列配置、状态同步等。 由于 UDS 支持文件描述符传递功能,这使得它可以方便地将共享内存区域的相关元信息(如 fd)从一方传送到另一方[^2]。 --- #### 3. 共享内存的设计与应用 为了提升数据面性能,vhost-user 利用了共享内存技术让前后端能够直接访问相同的缓冲区,从而减少不必要的拷贝开销。以下是其实现的关键环节: ##### (1)共享内存初始化 - 后端(如 DPDK-based 应用)会准备一块连续的大页内存作为环形缓冲区(ring buffer),并通过 mmap() 映射到自己的地址空间。 - 接着,这块内存的信息会被封装成文件描述符并通过上述提到的 UDS channel 转交给前段(即运行在客户机内的 VirtIO 驱动层)。这样做的好处是可以确保两部分看到的是完全一致的内容视图。 ##### (2)内存布局约定 按照 virtio 规范定义的标准结构组织这些共享资源,主要包括以下几个组成部分: - 可用队列表(Available Ring) -使用队列表(Used Ring) - 描述符表(Descriptor Table) 每条记录都指向特定位置上的 I/O 数据片段,允许快速定位读写目标而不必额外解析头部字段。 ##### (3)同步机制保障一致性 尽管存在多个实体共同修改同一份存储单元的情况,但由于引入了锁或者无锁算法加以协调管理,故仍能维持良好的线程安全性水平。此外,借助事件通知设施(eventfd),还可以及时告知对方某些重要变化的发生时刻,比如新包到达或是旧包被消费完毕等等。 --- #### 4. 总结 综上所述,vhost-user 结合了 Unix Domain Sockets 共享内存的优势,既简化了复杂度较高的传统 PCI 设备模拟流程,同时也极大地提高了吞吐量表现。对于现代云环境下的大规模部署而言,这种方案无疑具有非常重要的实践意义。 ```python import os import socket def create_vhost_user_socket(path): """ 创建一个 Unix Domain Socket Server """ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: os.unlink(path) # 删除已存在的路径以防冲突 except OSError: pass sock.bind(path) sock.listen(1) print(f"Listening on {path}") conn, addr = sock.accept() return conn # 示例调用 conn = create_vhost_user_socket("/tmp/vhost.sock") print("Connection established.") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值