为什么 DPDK VirtIO 只能跑到 40Gbps?—— 一次 KVM 虚拟交换机性能瓶颈定位全过程(下)
接上文为什么 DPDK VirtIO 只能跑到 40Gbps—— 一次 KVM 虚拟交换机性能瓶颈定位全过程上-CSDN博客七、Split Virtqueue为什么一个队列要维护三张环定位到 Virtqueue 之后我们继续深入分析。很多开发者第一次看到 VirtIO 的数据结构都会疑惑为什么普通网卡只有一个 Descriptor Ring而 VirtIO 却维护三张 Ring实际上在Split Virtqueue中真正的数据结构包括Descriptor Table Available Ring Used Ring三者职责完全不同。整体关系如下Guest Driver │ ▼ Descriptor Table 描述Buffer地址 │ ▼ Available Ring 告诉Host哪些Descriptor可以用了 │ ▼ Host(vhost) 处理数据 │ ▼ Used Ring 告诉Guest哪些Descriptor已经处理完成这里最重要的一点是Descriptor Table 本身不会通知任何人。真正负责发布消息的是avail-idx以及used-idx直到这里。我们才真正理解为什么上一篇 Memory Ordering 会如此重要。VirtIO 的整个同步机制本质上也是先构造对象再发布 Index。八、为什么小包性能下降如此明显继续分析 Perf。我们发现64Byte包CPU大量时间花在virtqueue_notify() ↓ eventfd_write() ↓ KVM ↓ VM Exit为什么假设Burst只有1 Packet流程Guest ↓ Descriptor ↓ avail-idx ↓ Kick ↓ VM Exit ↓ Host 处理 ↓ Notify ↓ VM Entry ↓ 继续一次Packet。一次VM Exit。一次VM Entry。CPU大量时间浪费在虚拟化切换。而1500Byte情况不同。虽然Packet数量减少。但是每个Packet携带的数据更多。最终100Gbps对应PPS大幅下降。例如包长PPS(约)64Byte148.8 Mpps512Byte24 Mpps1500Byte8.1 Mpps也就是说VirtIO真正限制的是PPS。不是Gbps。九、Event IndexVirtIO 最大的优化之一Linux VirtIO 后来增加了Event Index很多人觉得只是一个Flag。实际上它改变了整个Notification模型。传统模式每次 avail ↓ KickHost不停收到Notify。CPU不断VM Exit Event Index则变成Burst 32 Packet ↓ 一次 KickHost收到一次Notification。继续处理32 个Descriptor。CPU VM Exit次数下降几十倍。很多云厂商VirtIO性能能够突破80Gbps。最重要原因之一就是Event Index。十、Packed Virtqueue 为什么越来越流行虽然Split Virtqueue已经使用很多年。但是越来越多的新平台开始默认Packed Virtqueue。原因只有两个字Cache。Split模式需要CPU不停访问Descriptor ↓ Available Ring ↓ Used Ring三个不同区域。CPUCache不断Miss。Packed则把Descriptor状态直接放在同一结构。例如Descriptor Flags Wrap CounterCPU几乎连续访问内存。Cache命中率显著提高。不仅减少Cache Miss。同时减少Memory Barrier。因此新版本VirtIO几乎全部推荐Packed。十一、DPDK vhost-user 为什么还能继续优化很多人认为开启vhost-user性能已经最佳。实际上DPDK还做了很多优化。例如批量处理Descriptor。不是1 Packet ↓ 1 Descriptor而是Burst32 ↓ 32 Descriptor随后统一更新used-idx统一Kick。这样Notification次数再次下降。DPDKlibrte_vhost还会结合批量收发、cache-friendly 的描述符遍历以及尽可能减少 Guest/Host 间同步次数从而降低控制路径开销。十二、问题最终是如何解决的最终整个系统进行了如下优化①开启Packed Virtqueue。②开启Event Index。③Burst由16 ↓ 32④Guest开启Multi Queue。⑤Host每个Queue绑定独立PMD。再次测试结果如下优化前优化后38Gbps91GbpsCPU 48%CPU 63%VM Exit 极高下降约70%Notify 极频繁显著减少可以看到CPU反而更忙。但是吞吐提升超过2 倍。真正说明以前CPU不是处理Packet。而是浪费在Notification。十三、生产环境有哪些经验经过这次故障。团队总结了几条经验。① 不要只盯着 PMDVirtIO瓶颈很多发生在控制路径。不是DMA。不是Descriptor。而是Notification。② PPS 比 Gbps 更重要很多100G测试都是1500Byte。实际上真正决定VirtIO性能的是PPS。尤其64Byte。③ Event Index 建议开启如果业务允许批量发送。Event Index收益非常明显。不过也要注意批量通知会增加一定的数据包完成延迟因此需要根据业务对时延和吞吐的要求进行权衡。④ 优先使用 Packed Virtqueue对于支持 VirtIO 1.1 及以上的平台Packed Virtqueue 通常能带来更好的缓存局部性和更低的同步开销是值得优先考虑的选择。⑤ Host 和 Guest 要共同优化VirtIO不是Host一个人的事情。Guest、Burst、Queue、Affinity。都会影响最终性能。总结回到文章开头的问题为什么 DPDK VirtIO 只能跑到 40Gbps很多团队最初都会怀疑PMD 不够快RSS 不均衡Descriptor 太少HugePage 配置错误CPU 性能不足。但真正的问题往往隐藏在更深的地方。在 VirtIO 架构中数据真正走的是共享内存而性能瓶颈常常来自控制路径——Descriptor 发布、Kick、Notify、Event Index、VM Exit 等同步机制。尤其是在 64Byte 小包场景下PPS 极高每一次 Notification 的成本都会被无限放大。当通知过于频繁时CPU 花费的大量时间并不是转发数据而是在 Guest、KVM、vhost-user 和 Host 之间不断切换。因此一个高性能的 VirtIO 系统不只是需要优秀的 DPDK 数据平面更需要合理设计通知机制、队列模型和批处理策略。真正理解 Virtqueue 的工作原理之后再去分析 vhost-user、Packed Virtqueue、vDPA甚至硬件 VirtIO 加速就会发现它们都在围绕同一个目标进行优化减少同步减少通知减少切换让 CPU 更多时间用于真正的数据转发而不是控制路径。

相关新闻

如何配置Shipper实现安全的蓝绿部署:7步避免生产环境灾难

如何配置Shipper实现安全的蓝绿部署:7步避免生产环境灾难

如何配置Shipper实现安全的蓝绿部署:7步避免生产环境灾难 【免费下载链接】shipper Kubernetes native multi-cluster canary or blue-green rollouts using Helm 项目地址: https://gitcode.com/gh_mirrors/sh/shipper Shipper是一款基于Kubernetes的多集群…

2026/7/17 9:25:47阅读更多 →
为什么 DPDK VirtIO 只能跑到 40Gbps?—— 一次 KVM 虚拟交换机性能瓶颈定位全过程(上)

为什么 DPDK VirtIO 只能跑到 40Gbps?—— 一次 KVM 虚拟交换机性能瓶颈定位全过程(上)

一、一个令人困惑的现网问题某云计算厂商上线了一套基于 DPDK KVM 的高性能虚拟交换平台。整体网络架构如下:┌──────────────┐│ Physical NIC ││ Intel E810 │└──────┬───────┘│DPDK vSwitch│vhost-user│QEMU/KVM│VirtI…

2026/7/17 9:25:47阅读更多 →
Pyfakefs核心原理揭秘:如何在内存中构建虚拟文件系统

Pyfakefs核心原理揭秘:如何在内存中构建虚拟文件系统

Pyfakefs核心原理揭秘:如何在内存中构建虚拟文件系统 【免费下载链接】pyfakefs Provides a fake file system that mocks the Python file system modules. 项目地址: https://gitcode.com/gh_mirrors/py/pyfakefs Pyfakefs是一个强大的Python库&#xff0c…

2026/7/17 9:20:46阅读更多 →
open-saas 企业级微服务架构深度解析:从单体到模块化的演进之路

open-saas 企业级微服务架构深度解析:从单体到模块化的演进之路

open-saas 企业级微服务架构深度解析:从单体到模块化的演进之路 【免费下载链接】open-saas A 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing…

2026/7/17 10:20:57阅读更多 →
深入解析段错误(Segmentation Fault)的机制与调试技巧

深入解析段错误(Segmentation Fault)的机制与调试技巧

1. 段错误的底层硬件机制当程序访问无效内存地址时,现代CPU的MMU(内存管理单元)会触发缺页异常(Page Fault)。这个硬件级保护机制通过CR2寄存器记录违规地址,并向操作系统发送SIGSEGV信号(在Lin…

2026/7/17 10:20:57阅读更多 →
思源笔记块折叠功能终极指南:告别信息过载的7个实用技巧

思源笔记块折叠功能终极指南:告别信息过载的7个实用技巧

思源笔记块折叠功能终极指南:告别信息过载的7个实用技巧 【免费下载链接】siyuan A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. 项目地址: https://gitcode.com/GitHub_Trending…

2026/7/17 10:20:57阅读更多 →
QMCDecode技术解析:基于TEA算法的QQ音乐加密格式解密方案

QMCDecode技术解析:基于TEA算法的QQ音乐加密格式解密方案

QMCDecode技术解析:基于TEA算法的QQ音乐加密格式解密方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…

2026/7/17 10:20:57阅读更多 →
Intel i9-13900K与RTX 4090双系统安装实战指南

Intel i9-13900K与RTX 4090双系统安装实战指南

1. 硬件环境与系统选型考量 我最近在Intel i9-13900K NVIDIA RTX 4090的平台上折腾双系统安装,这套配置有几个特殊点需要注意:首先,13代酷睿的混合架构对Linux内核版本有要求(建议5.18);其次,4…

2026/7/17 10:20:57阅读更多 →
soild works制图建模

soild works制图建模

soild works气缸座拉伸切除soild works气缸座拉伸切除 2.1soild works 进入草图绘制soild works 进入草图绘制 sldprt绘制凸台-拉伸4(对应模型显示)soild works sldprt绘制凸台-拉伸4(对应模型显示) sldprt绘制镜向和异型孔向导soild works sldprt绘制镜向和异型孔向导 soi…

2026/7/17 10:15:56阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/16 8:28:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →