虚拟化性能优化系列-numatune

news2025/7/18 15:15:48

numatune是什么

numatune是libvirt的一个参数,可以用在numa架构的host上,以控制子机的内存访问策略。

使用方法如下,参考libvirt文档

<domain> ... <numatune> <memory mode="strict" nodeset="1-4,^3"/> <memnode cellid="0" mode="strict" nodeset="1"/> <memnode cellid="2" mode="preferred" nodeset="2"/> </numatune> ... </domain>

numatune的mode选项有:

  1. strict:默认的策略,如果值指定的node上无法分配内存,则虚拟机分配内存失败,即无法启动
  2. interleave:通过轮询方式,在指定的多个node上分配内存
  3. preferred:优先在指定node上分配内存,如果内存不足,允许在其他node上分配内存

在了解了numatune之后,接下来我们将讨论numatune的影响以及哪些场景需要使用numatune

numatune对性能有多大影响

从libvirt和redhat的文档看,numatune会对虚拟机的性能大概会有10%或者更高的影响,为了评估numatune的影响,我们进行了详细的测试。

redhat文档

Combining vCPU pinning with numatune can avoid NUMA misses. The performance impacts of NUMA misses are significant, generally starting at a 10% performance hit or higher. vCPU pinning and numatune should be configured together.

测试环境

虚拟机配置:

cpu:32c

内存:128GB

网络方式:DPDK

虚拟机cpu分为两个node,并且分别绑定在host的两个node上

<cputune> <vcpupin vcpu="0" cpuset="1-22,49-70"/> …… <vcpupin vcpu="26" cpuset="25-46,73-94"/> </cputune>

物理机配置:

cpu:96c

内存:256GB

使用hugetlbfs,以实现子机DPDK

虚拟化方式:kvm(内核版本3.10.0-693)+qemu(2.6.0)

测试用例

CPU性能测试:speccpu2017 unixbench linpack

内存性能测试:stream mlc

测试结论

  1. speccpu测得fpspeed和fprate分别有12%和25%的提升
  2. stream测得内存带宽有78%以上的提升

性能对比.png

从测试结果看,numatune对虚拟机的性能有非常大的影响,接下来我们分析一下为什么会有这么大的影响。

分析

对内存带宽有如此大的影响,猜测应该是出现跨numa访问导致,用intel-cmt-cat看下内存的分布情况。

numa miss.png

从上图可以看到,在stream测试过程中,子机cpu出现了访问remote memory,即子机的cpu node0绑定在host的node0上,但是访问的内存却是在host的numa1上。因为内存的跨numa访问,导致cpu性能有大幅下降,就很容易理解了。

为什么会出现跨numa访问

从qemu的源码看,主要完成子机内存绑定的代码位于hostmem.c的host_memory_backend_memory_complete函数。

if (mbind(ptr, sz, backend->policy, maxnode ? backend->host_nodes : NULL, maxnode + 1, flags)) { if (backend->policy != MPOL_DEFAULT || errno != ENOSYS) { error_setg_errno(errp, errno, "cannot bind memory to host NUMA nodes"); return; } }#endif /* Preallocate memory after the NUMA policy has been instantiated. * This is necessary to guarantee memory is allocated with * specified NUMA policy in place. */ if (backend->prealloc) { os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz, smp_cpus, &local_err); if (local_err) { goto out; } }

mbind函数首先设置NUMA内存的访问策略,接着调用prealloc进行内存预分配。

如果没有设置numatune,backend->policy为默认值MPOL_DEFAULT,表示在运行当前分配逻辑cpu node对应的NUMA上分配内存,即如果当前程序运行的node1上,那子机所有的node都会在numa1上分配内存。

The system-wide default policy allocates pages on the node of the CPU that triggers the allocation. For MPOL_DEFAULT, the nodemask and maxnode arguments must be specify the empty set of nodes.

如果设置了numatune,看到qemu的参数会多出来host-nodes=1,policy=preferred,执行backend->policy为MPOL_PREFERRED,会优先从host_nodes上分配内存。

numatune.png

接下来的prealloc()函数就是按照上面的设置的numa策略,进行预分配。

从上文可以看到,在使用hugetlbfs进行prealloc()内存的情况下,numatune可以实现numa透传的目的。

哪些场景需要添加numatune

  1. 如上文介绍,如果使用hugetlbfs,对虚拟机进行内存预分配的情况需要使用numatune
  2. 没有使用内存预分配,但使用vfio+透明巨页,同样可能出现内存需要使用numatune vfio的流程中也会去设置内存亲和性,如果没有numatune,同样会出现跨numa访问的问题,后续会有更详细的分析
  3. 其他情况下,加numatune效果不明显

其他情况下,虽然有mbind操作,但因为没有预分配,最终分配内存时仍然优先在最近的numa分配内存

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

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

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

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

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

相关文章

多线程(1)

多线程 前言 &#xff1a; 上文主要了解到了进程&#xff0c; 那么为啥需要引入进程呢&#xff1f;   或者说为啥要有进程呢&#xff1f; 其实这里最主要的目的是为了解决 并发编程 这样的问题。 了解 &#xff1a;   这里 cpu 进入了多核心的时代&#xff0c;想要进一步提…

解决:给 VSCode 手动添加(解压压缩包)相关插件的问题

1、一般的添加方式为&#xff1a; 在 VSCode 里面扩展程序里面直接搜索添加即可&#xff1b; 2、如何手动添加一个 VSCode 相关插件&#xff1f; 其一、首先把相关文件解压&#xff0c;解压成一个文件夹&#xff1b; 其二、找到 VSCode 的 extensions 的地址并把 A 所述文件…

【Java 设计模式】创建者模式 之抽象工厂模式

抽象工厂模式1 概念2 角色3 甜品店案例3.1 类图3.2 实现4 优缺点1 概念 产品族&#xff1a;华为既有华为手机&#xff0c;也有华为电脑、华为平板&#xff0c;华为手机、华为电脑和华为平板属于一个产品族&#xff0c;因为他们都是华为品牌。产品等级&#xff1a;有华为手机&am…

骁龙咣咣咣三脚,再次改写格局

鱼羊 萧箫 发自 凹非寺量子位 | 公众号 QbitAI盆友们&#xff0c;骁龙&#xff0c;已经不再是以前那个骁龙了。就在大家吃瓜安卓新旗舰芯片谁家首发之际&#xff0c;骁龙峰会的绝对主角&#xff0c;却只差没把“时代变了”写在脸上&#xff1a;先是第一天直接挤爆AI牙膏管&…

创建Struts2项目并实现一个例子

文章目录一、创建Struts2项目二、struts2的一个例子一、创建Struts2项目 本人所用idea应用程序。以下全部内容&#xff0c;都是以idea为例 创建项目前&#xff0c;你需要下载Struts2所需要的jar包&#xff0c;你可以直接去官网下载&#xff0c;也可以点击https://pan.baidu.c…

LeetCode - 1419 数青蛙

题目来源 1419. 数青蛙 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串 croakOfFrogs&#xff0c;它表示不同青蛙发出的蛙鸣声&#xff08;字符串 "croak" &#xff09;的组合。由于同一时间可以有多只青蛙呱呱作响&#xff0c;所以 croakOfFrog…

基于蜻蜓优化算法的认知无线电网络的服务质量研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖 牛血清白蛋白&#xff08;BSA&#xff09;&#xff0c;是牛血清中的一种球蛋白&#xff0c;包含607个氨基酸残基&#xff0c;分子量为66.446KDa&#xff0c;可以提供PEG接枝修饰葡萄糖&#xff0c;葡萄…

独家 | 人工智能的记忆与泛化(附链接)

作者&#xff1a;Manuel Brenner 翻译&#xff1a;陈之炎校对&#xff1a;赵茹萱本文约4500字&#xff0c;建议阅读8分钟本文为你介绍了人工智能 记忆与泛化相关知识。标签&#xff1a;人工智能&#xff0c;记忆&#xff0c;泛化“对不可见数据的泛化能力是机器学习的核心。”当…

测试用例设计方法之场景设计法

基本流&#xff1a;采用直黑线表示&#xff0c;是经过用例的最简单的路径&#xff08;无任何差错&#xff0c;程序从开始直接执行到结束&#xff09; 备选流&#xff1a;采用不同颜色表示&#xff0c;一个备选流可能从基本流开始&#xff0c;在某个特定条件下执行&#xff0c;…

声明变量let和const

1.let的声明 JavaScript中用var关键字来声明变量&#xff0c;而在ES6中&#xff0c;还可以使用新增的let的关键字来声明变量。与var不同的是let声明的变量只能在代码块中有效。 {let a5;var b6;console.log(a);console.log(b);} 执行结果&#xff1a; 能正常输出&#xff0c;…

178:vue+openlayers 加载多种形式Esri地图

第178个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中绘制自定义图形,利用Geojson的writeFeatures,来生成geojson格式的数据,然后使用file-saver来导出geojson。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetM…

【论文阅读】半监督时序动作检测 Semi-Supervised Action Detection

文章目录1. Learning Temporal Action Proposals With Fewer Labels (ICCV 2019)论文目的——拟解决问题贡献——创新实现流程详细方法2. Self-Supervised Learning for Semi-Supervised Temporal Action Proposal (CVPR 2021)论文目的——拟解决问题贡献——创新实现流程详细方…

微服务之间,最佳的调用方式是什么?

在微服务架构中&#xff0c;需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式&#xff0c;一种是RPC方式&#xff0c;另一种是事件驱动&#xff08;Event-driven&#xff09;方式&#xff0c;也就是发消息方式。消…

多模态实战视频生成文本:基于VGG与LSTM实现图像对应的描述文本生成任务

任务描述:本教程将帮助你利用深度学习的方法为照片等图像自动生成文字描述,图像描述是结合计算机视觉与自然语言处理的综合任务,输入一幅图像, 输出一段描述该图像的文字,这一任务要求模型可以识别图片中的物体、理解物体间的关系,并用一句自然语言表达出来。 运行环境:在…

体系结构30_同步性能问题

栅栏&#xff08;barrier&#xff09;同步 栅栏强制所有到达该栅栏的进程进行等待&#xff0c;直到全部的进程到达栅栏&#xff0c;然后释放全部的进程&#xff0c;从而形成同步。 栅栏的典型实现是要用两个旋转锁&#xff1a;一个用来记录到达栅栏的进程数&#xff0c;另一个用…

Java 对象拷贝原理剖析及最佳实践

1 前言 对象拷贝&#xff0c;是我们在开发过程中&#xff0c;绕不开的过程&#xff0c;既存在于 Po、Dto、Do、Vo 各个表现层数据的转换&#xff0c;也存在于系统交互如序列化、反序列化。 Java 对象拷贝分为深拷贝和浅拷贝&#xff0c;目前常用的属性拷贝工具&#xff0c;包…

【外卖项目实战开发二】

文章目录1、完善登录功能问题分析代码实现2、新增员工需求分析数据模型代码开发3、员工信息分页查询需求分析代码开发4、启用/禁用员工账号需求分析代码开发代码修复5、编辑员工信息需求分析代码开发1、完善登录功能 问题分析 前面我们已经完成了后台系统的员工登录功能开发&…

zabbix集群搭建分布式监控的操作步骤

作用&#xff1a; 分担server的集中式压力解决多机房之间的网络延迟问题环境准备&#xff1a; 服务器1&#xff1a;zabbix-server 服务器2&#xff1a;zabbix-proxy 服务器3&#xff1a;zabbix-agent 关系&#xff1a;zabbix-agent发送数据到代理&#xff0c;代理汇总数据发送…

Linux多核运行机制(SMP)

一、Linux内核兼容多处理器要求 有多个 CPU 处理器 的 系统中 , Linux 内核需要处理的问题 : 1、公平共享 : CPU 的负载 , 需要公平地共享 , 不能出现某个CPU空闲 , 造成资源浪费。 2、可设置进程 与 CPU 亲和性 : 可以为 某些类型的 进程 与 指定的 处理器设置亲和性 , 可以针…