看见新力量NO.13|独家专访车麦&超电创始人孙泽锋
06-18
numatune是什么? numatune 是 libvirt 的一个参数,可在 numa 架构主机上使用,用于控制来宾机器的内存访问策略。使用方法如下,参考libvirt文档
interleave:通过轮询的方式在多个指定节点上分配内存。首选:首先在指定节点上分配内存。
如果内存不足,允许在其他节点上分配内存。了解了 numatune 之后,我们将讨论 numatune 的影响以及哪些场景需要使用 numatune。
从libvirt和redhat的文档来看,numatune会对虚拟机的性能产生大约10%甚至更多的影响。高影响力,为了评估 numatune 的影响,我们进行了详细的测试。
redhat 文档 将 vCPU pinning 与 numatune 结合起来可以避免 NUMA 缺失。 NUMA 未命中对性能的影响非常显着,通常会导致性能下降 10% 或更高。
vCPU pinning 和 numatune 应一起配置。测试环境虚拟机配置:cpu:32c 内存:GB 网络方式:DPDK虚拟机CPU分为两个节点,分别绑定到主机的两个节点
性能对比.png 从测试结果来看,numatune对虚拟机的性能影响非常大。接下来我们分析一下为什么会有这么大的影响。
分析对内存带宽的影响如此之大。猜测是跨numa访问导致的。
使用intel-cmt-cat查看内存分布情况。 numa miss.png 从上图可以看到,流测试时,从CPU访问了远程内存,即从CPU的node0绑定了主机的node0,但是访问的内存是在主机的numa1上级。
因为内存的跨numa访问,导致CPU性能大幅下降,这个很容易理解。为什么会出现跨numa访问?从qemu的源码来看,主要完成从内存绑定的代码位于hostmem.c的host_memory_backend_memory_complete函数中。
if (mbind(ptr, sz, 后端->策略, maxnode ? 后端->host_nodes : NULL, maxnode + 1, flags)) { if (后端->策略 != MPOL_DEFAULT || errno != ENOSYS) { error_setg_errno(errp) ,errno,“无法将内存绑定到主机 NUMA 节点”);返回; } }#endif /* 在实例化 NUMA 策略后预分配内存。 * 这是保证内存分配时指定的 NUMA 策略所必需的。
*/ if (backend->prealloc) { os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz, smp_cpus, &local_err); if (local_err) { 转到输出; mbind函数首先设置NUMA内存的访问策略,然后调用prealloc进行内存预分配。如果没有设置numatune,backend->policy为默认值MPOL_DEFAULT,表示内存分配在当前分配的逻辑cpu节点对应的NUMA上。
即如果当前程序运行在node1上,则从机的所有节点都会在numa1上分配内存。 。
系统范围的默认策略在触发分配的 CPU 的节点上分配页面。对于 MPOL_DEFAULT,nodemask 和 maxnodearguments 必须指定空节点集。
如果设置了numatune,您将看到更多qemu参数host-nodes= 1,policy=preferred,执行backend->policy为MPOL_PREFERRED,内存将首先从host_nodes分配。 numatune.png 接下来的 prealloc() 函数是根据上面设置的 numa 策略进行预分配。
从上面可以看出,当使用hugetlbfs来prealloc()内存时,numatune可以达到numa透传的目的。哪些场景需要添加numatune?上面提到,如果使用hugetlbfs,则需要numatune为虚拟机预先分配内存。
没有使用内存预分配,但是当使用vfio+透明大页时,也可能会出现numatunevfio过程中需要使用内存的情况。设置内存亲和性,如果没有numatune,也会出现跨numa访问的问题。
稍后会有更详细的分析。在其他情况下,添加numatune的效果并不明显。
在其他情况下,虽然有mbind操作,但没有预分配。 ,最终分配内存时,仍然会优先分配距离最近的numa中的内存。
特别感谢 munger Jiang 的这篇文章。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-18
06-18
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用