Qemu-KVM 网络性能优化实践

news2025/1/21 0:54:10

背景

在做优化之前,腾讯云上使用的母机单队列,性能只有14w pps。

已有的多队列版本,在20w+ pps左右,不是很理想。

主要问题性能

1 . 单队列成为性能瓶颈

物理主机环境,使用多队列已经有多年。

而在公有云上,虚拟化的virtio-net长期使用的多队列。

有如下原因:

  • 早期的qemu-kvm版本只支持单队列。
  • 为了稳定性,友商如阿里云,virtio-net的网卡到2016年底,仍然是单队列。

2 . 多队列性能并不理想

引入网卡多队列,目的是充分利用SMP处理器的性能。

在物理母机上,多队列性能提升非常明显。

但是在虚拟机上,性能却没有得到明显提升。

已有的kvm-2.0版本,当时是20w pps左右,单队列能到14w pps。

Qemu-kvm多队列原理

上图是多队列的示意图。

和物理机上的多队列类似。

一个virtio-net的队列,对应一个虚拟cpu。

这样,避免了多个虚拟cpu使用同一个队列带来的竞争问题。

性能优化实践

云上Overlay网络的实现

腾讯云网络使用了overlay网络技术。

在用户看来,每个用户都是一个独立的网络,相互隔离。

具体实现如下:

由上图可见,数据包的流程为

  • 虚拟机向外发包,经过virtio-net网卡驱动外发(virtio-net前端)
  • Qemu实现的tun口(内核态)收到包后,交给网桥
  • 网桥上数据包会被VPC截获,实现overlay网络功能
  • 数据包经过处理后,交给GRE口,进行overlay封装
  • Gre口调用物理口的发包函数进行发送。

进来虚拟机方向的数据包处理流程相应反转即可。

初步分析

从上图可以看出,数据包是经过了一条较长的路径,最终从物理口发送出去。

其中每一个流程都是可以成为瓶颈。

于是,我们做了第一步,让虚拟机支持多队列。

虚拟机多队列的选择

两个方案:

  • 升级kvm-2.0
  • 在kvm-1.0上移植母机多队列

最终,我们选择了移植的方案,理由如下:

  • 腾讯云的物理服务器基本上都是kvm-1.0版本,这个版本是不支持多队列的。
  • 有kvm-2.0版本,但多队列性能提升并不明显。
  • 在kvm-1.0上,我们已经做了大量的工作,也经过了长期运营的检验。

多队列功能的移植

移植涉及到了qemu-kvm虚拟化的所有核心组件:qemu,libvirt,Linux内核。

移植过程的主要问题:

  • Patch非常多,Linux内核20+个patch,qemu 20+patch,libvirt patch相对少一点。
  • 要兼容旧的qemu和内核。三个组件存在混合部署的情况。
  • 热迁移要实现兼容。

最终,和yunfangtai一起,通过谨慎小心的移植,这些目标都实现了。

还有单队列性能瓶颈

多队列移植后,理论上也只能达到kvm-2.0的性能水平。实测也是如此,在20w pps左右。

当时业界Google的性能能达到40w pps。我们只有20w pps。

这其中存在着很大的提升空间。

Vpc overlay基本不配置规则的情况下,性能损失约10%。不是主要矛盾。

通过内核perf工具和流程分析,发现耗在spin_lock的cpu特别高。

主要是在dev_queue_xmit中加锁消耗的。

分析vpc的代码,发现GRE口实现,还是一个单队列网卡。

前面的并发处理,到了GRE口变成了独木桥,性能损失明显。

还是并发瓶颈

将vpc中的GRE虚拟口实现改为多队列之后,性能仍然没有太大的提升。

通过perf采样发现,spin_lock占用的cpu仍然很高,是最可疑的瓶颈点。

分析内核代码流程,最有可能的还是dev_queue_xmit中的队列锁。

这里存在这样一种情况,虚拟机选择队列后,经过一层层选择,最终到物理队列时,会有多个虚拟队列选中同一个物理网卡队列的情况。

问题基本定位清楚,需要做如下修改:

  • 虚拟机virtio-net后端的tun实现,要保持虚拟机选的队列。
  • Vpc中的gre口实现,不能修改队列映射关系
  • 物理口发包时,要保持映射关系不变。
  • 同时,多个虚拟机,要保证尽可能利用不同的物理队列,避免相互干扰。

以上修改做完后,性能有了明显提升,达到了业界第一梯队Google GCE的水平。实现了本身的突破。

其他优化

  • Qemu自身队列长度限制位256,修改为1024,在大流量下减少丢包。
  • 后端tun网卡队列长度优化。

展望

Virtio-net的性能优化,按目前的vhost-kernel框架下,潜力已经很小。

后续方向:

  • 硬件offload方案

如智能网卡方案,将vpc部分逻辑offload到服务器之外的设备上。

  • Dpdk+vhost-user方案

提升母机发包引擎的性能,同时poll mode能减少虚拟机发包的负担。

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

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习常见损失函数总结+Pytroch实现

文章目录一、引言二、损失函数1.均方差损失(Mean Squared Error Loss)2.平均绝对误差损失(Mean Absolute Error Loss)3.交叉熵(Cross Entropy Loss)(1)信息论中的熵a.熵b.相对熵&…

苹果系统(MacOS)无法下载Android SDK或下载缓慢解决办法

SDK管理器一般会在安装完Android Studio 的时候就弹出来.如果当时给关闭了或者是后续想找的话,Command, 或者通过菜单打开偏好设置以后 即可找到Android SDK的设置.与Jetbrains家族的产品方式一致.也可以直接在首屏页面上点More Actions 会出来SDK Manager 然后点击EDIT 找到缺…

DVWA靶场通关实战

DVWABrute Force(暴力破解)LowMediumHighImpossibleCommand Injection(命令行注入)LowMediumHighImpossibleCSRF(跨站请求伪造)LowMediumHighImpossible截至2022.11.24,DVWA共有十四个模块&…

TPS7A3301RGWR稳压器 AK4493EQ音频DAC,电路原理图

TPS7A33系列线性稳压器是负电压(–36V),超低噪声(16μVRMS,72dBPSRR)线性稳压器,能够为最高1A负载供电。TPS7A33系列产品装有一个补偿金属氧化物半导体(CMOS)逻辑电平兼容使能引脚(EN),此引脚允许可由用户定…

【MM小贴士】采购信息记录与工厂的相关性

【业务背景】在SAP的组织架构中,信息记录是一个非常重要的数据。这里面涉及到两个主数据:供应商主数据&物料主数据。 供应商主数据是一个集团性的主数据,无论哪个公司,哪个工厂,都用的同一个供应商代码&#xff0…

数仓开发之DWS层(二)

目录 五:用户域用户注册各窗口汇总表 5.1 主要任务 5.2 思路分析 5.3 图解 5.4 ClickHouse建表语句 六:交易域加购各窗口汇总表 6.1 主要任务 6.2 思路分析 6.3 图解 6.4 ClickHouse建表语句 七:交易域支付各窗口汇总表 7.1 主要任…

AppAnalytics设备的分析服务

AppAnalytics设备的分析服务 EmbarcaderoAppAnalytics是一项针对移动、桌面和可穿戴设备的分析服务。它允许您跟踪和测量应用程序的使用频率、运行的平台、客户使用的功能、查找和记录崩溃等。它通过从最终用户获取匿名使用统计数据,帮助您了解用户行为。AppAnalyti…

应届生如何做好一份简历?

找工作是痛苦的,尤其是投简历的过程。 下面分享下自己最近投简历的一些感悟。 一定要避免的错误 在投简历的过程中一定要避免如下几个主要错误: 一份简历打天下就当前的经济形势,我相信大多数人找工作都是海投,但是在海投的过程中…

靠这一份面试文档,我花了2个通宵看完,最终拿到阿里offer

Java基础部分 请你描述JDK、JRE、JVM的关系!如果main方法被声明成private会怎样?&和&&的区别!char型变量中能否存储一个中文汉字,why?a、a的区别!ab、aab的区别!浮点型计算为什么会…

Web(六)CSS3语法-CSS样式规则

第1关&#xff1a;CSS基础知识 第2关&#xff1a;初识CSS 编程要求 请在右侧编辑器中的Begin - End区域内补充代码&#xff0c;具体要求是&#xff1a; 1.按照要求的效果在标签中运用CSS样式&#xff0c;编辑唐诗“静夜思” 2.标题文本“静夜思”采用<h1>标签作用&am…

【前端】HTML认知

一、基础认知 1.1基础概念铺垫&#xff08;了解&#xff09; 1.1.1认识网页&#xff08;了解&#xff09; 问题1&#xff1a;网页由哪些部分组成&#xff1f; 文字、图片、音频、视频、超链接 问题2&#xff1a;我们看到的网页背后本质是什么&#xff1f; 前端程序员写的…

(02)Cartographer源码无死角解析-(29) LocalTrajectoryBuilder2D::AddRangeData()→多雷达数据时间同步

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

uni-app 超详细教程(从菜鸟到大佬)

一&#xff0c;uni-app 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手…

基于51单片机温度火灾烟雾报警器程序仿真资料

资料编号&#xff1a;190 下面是该资料仿真演示视频&#xff1a; 190-基于51单片机温度火灾烟雾报警器(仿真源程序全套资料)功能介绍&#xff1a; 采用51单片机作为主控CPU&#xff0c;采用ds18b20来采集温度&#xff0c;采用MQ2来采集烟雾浓度&#xff0c;使用ADC0832来进行…

(十一)Java算法:计数排序(详细图解)

目录一、前言1.1、概念1.2、算法步骤二、maven依赖三、流程解析3.1、计数流程图3.2、计数数组变形3.3、排序过程四、编码实现一、前言 1.1、概念 计数排序&#xff1a;核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序&#xff0c;计…

[附源码]Python计算机毕业设计Django财务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

DEJA_VU3D - Cesium功能集 之 087-完美状态栏组件

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(尽可能把代码简洁一些)。博文内容…

MacBookPro M2芯片下如何搭建React-Native环境

MacBookPro M2芯片下如何搭建React-Native环境目录软件下载环境配置目录 写在最前&#xff1a;整体流程直接看的rn中文网的搭建开发环境&#xff1a;https://www.react-native.cn/docs/environment-setup 软件下载 1、xcode 2、android studio / vscode 环境配置 1、jdk1.8…

快速上手 TypeScript

快速上手 TypeScript ypeScript 简称 TS &#xff0c;既是一门新语言&#xff0c;也是 JS 的一个超集&#xff0c;它是在 JavaScript 的基础上增加了一套类型系统&#xff0c;它支持所有的 JS 语句&#xff0c;为工程化开发而生&#xff0c;最终在编译的时候去掉类型和特有的语…

Metabase学习教程:仪表盘-2

在仪表板中链接筛选器 链接仪表板中的筛选器&#xff0c;根据另一个筛选器的当前选择限制一个筛选器中可用的选项&#xff08;内容联动&#xff09;。 我们先用一个问题设置一个简单的仪表板。这里的目标是设置一个带有两个链接过滤器的仪表板。每个筛选器根据另一个筛选器的…