当前位置:首页 > 报告详情

《基于io_uring和双virtqueue队列的virtio-blk数据通路加速方案》-孟繁瑞.pdf

上传人: 表表 编号:1152840 2026-02-14 21页 4.92MB

1、基于io_uring和双virtqueue队列Virtio-blk 数据通路加速方案阿里云基础软件-开发工程师孟繁瑞技术背景社区现状应用场景Vblk 直通Virtio-blk 直通设备双向命令的支持Ring Pair设计双 virtqueue 队列设计扩大并发度总结与展望技术路线上游贡献技术背景NVMe 支持 io_uring passthrough 能力通用字符设备接口新特性兼容较好,不需额外开发减少内核栈路径,有助于提升性能io_uring 提供伸缩性社区现状线上云盘场景,存在 virtio-blk 盘提供类似的接口,利用 io_uring passthrough 能力减少内核路径增强可扩

2、展性技术背景图片盘古存储架构,在神龙服务器上,基于SDK进行请求下发。经过virtio-blk层下发的请求,在后端(PoV Server)上重新拼接。整个过程,Virtio-blk 的协议格式被用作 RPC 通道SDK的请求下发转化为virtio-blk的读写应用场景技术背景SDK的请求下发转化为virtio-blk的读写:1、上层用户的每个读写,实际都对应了至少一次 write+read 行为。2、存在读写放大现象两类读写放大1、单个 I/O 的规格上限,可能发生的 bio_split()2、提前切分,额外的带宽开销 更灵活的数据通道 减少放大读写Virtio-blk 直通&双向命令Virt

3、io-blk 直通1、借助 io_uring passthrough 提供的 uring_cmd()接口,直通驱动层灵活用户态包装命令2、驱动侧包装命令,借助 request 队列管理命令3、缓冲区映射为bio4&5、blk-mq 机制管理和下发请求6、沿用 sgs virtio_desc 的接口下发至后端Virtio-blk 直通uring_cmd 用户态定义数据格式:out_hdr 内容直接拷贝至 virtio_blk_outhdrType 当前仅支持读写Sector 代表其实扇区Data:用户态缓冲区地址,或者 iovec 的首地址指针Data_len:用户态缓冲区长度,或者 iovec

4、 的向量长度Flag:用于表示当前是为向量请求,可扩展。双向命令:对双向命令解析时,根据 write_iov_count 区分读写缓冲区的数量。当前仅支持先写后读Virtio-blk 直通 创建/dev/vdXc0 通用字符接口 提供 uring_cmd 句柄 直通 virtio-blk 驱动层 复用 request 和 blk-mq 机制 Hctx 分发框架 请求管理机制 vbr sgs virtio descs 复用原有逻辑 iopoll 提供轮询方式Virtio-blk 双向命令支持思路核心:在 io_uring passthrough 路径上,原有结构体能否搭载两个方向的读写信息图片用

5、户态缓冲区 struct bio:走两次映射,通过 bio-bi_opf 来区分读写 每个双向命令,struct request 结构体中会包含一个 bio链表,总元素数为2 由于 bi_opf 相反,不会发生 merge 行为struct bio struct vbr:添加额外的 sgl_extra 链表指针两个链表指针保存读、写缓冲区信息。无需修改 virtqueue_add_sgs()接口Vring Pair 支持Vring Pair 支持技术背景:后端链路较长,传统的virtio_ring只有 I/O完成时才能回收 slot解决方案:利用两条Virtqueue队列,一条负责发送请求,一

6、条回收完成信息需要后端支持依赖设备驱动层的状态保存依赖设备驱动层管理DMA映射Vring Pair 支持1、根据 tag 定位请求信息2、indirect desc 保存进 L1 中(非必须)3、复用 ioprio 字段高16位4、保存 L1 指针,根据 tag 索引SQ下发Vring Pair 支持SQ回收1、后端收到请求,回填used_index通知前端不产生中断后端提供支持2、回收 desc slot3、indirect(L1区域)部分不释放请求尚未完成Vring Pa

word格式文档无特别注明外均可编辑修改,预览文件经过压缩,下载原文更清晰!
三个皮匠报告文库所有资源均是客户上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作商用。
1. **技术方案**:基于io_uring和双virtqueue队列的Virtio-blk数据通路加速,减少内核路径,提升性能与并发度。 2. **核心优化**: - 直通设计:通过`uring_cmd()`接口直通驱动,复用blk-mq机制,支持iopoll轮询。 - 双向命令:单个`struct request`含读写bio链表,避免读写放大。 - Ring Pair:双队列分离请求发送与回收,依赖后端支持tag索引,动态管理DMA映射。 3. **动态Request**:解耦Virtqueue深度与Request队列,预分配bitmap、动态分配request,节约内存支撑高并发。 4. **演进路线**:2024.9硬转队列(轻量化),2025.4/9合入ANCK主线,2026支持fixed buffer等。
**Virtio-blk加速?** **双队列如何提升性能?** **io_uring如何优化I/O?**
客服
商务合作
小程序
服务号
折叠