NUMA那些事儿

news2024/11/15 15:35:51

NUMA——Non Uniform Memory Access,中文为非统一内存访问,在NUMA出现之前,内存的控制器是包含在北桥芯片中的,所有内存由北桥统一管理,因此可以保证访问内存的一致性。随着CPU架构的不断迭代和演进,核数越来越多,对数据吞吐、性能的需求增加,内存的控制器(IMC)也被集成到了CPU中,从此北桥芯片也就消失在主板上。因此产生了NUMA,即:每个Node 节点下都与自己专属的内存(local),如果访问其他Node节点下的内存,就为远端内存(remote)

科普:当前我们Purly平台(skylake、Cascade lake、Cascade lake R)单个CPU上IMC的数量为2个,每个IMC控制3个channel,每个channel又分为2个DIMM。这里的DIMM就是实际对应的物理插槽。蓝色部分代表CPU(里面包含多个物理核心+cache+IMC等物理结构)、双向剪头代表channel共6个,绿色代表内存条,单个CPU最大支持12条(每个channel拓展2个DIMM,分为主和副,每个DIMM可插一个内存条),占用的channel数量越多,内存吞吐越大,直至占用所有的主DIMM,则能发挥出CPU全部的性能。

图中两个物理CPU之间使用Intel UPI/QPI进行数据交换等通信,UPI/QPI是CPU之间唯一的高速通路,注:跨UPI/QPI会造成一定的访问时长增加(ns级别)相关原文链接参考: QPI/UPI

那么自从有了NUMA后,Linux系统内默认的内存分配方案就是“优先请求当前运行程序CPU的本地内存,如果申请本地内存时出现内存不足则会通过跨UPI/QPI的方式访问,另外一颗CPU下挂载的内存,那么这个时候会增加访问延迟;当我们关闭NUMA的时候那么系统会允许我们在两个物理CPU下挂载的所有内存进行交叉访问,当然这个结果一定会比我们访问本地内存时间要长,但还是要低于跨UPI/QPI时访问时间”我们可以通过一个简单的测试工具来实验一下。

测试环境:Centos 7.3、内核3.10.514

测试配置:Intel(R) Xeon(R) Silver 4214 CPU @ 2.20GHz * 2 + 8*16G-2666MHz Memory

测试工具:MLC-3.9(Memory Latency Check)

测试命令:./mlc --latency_matrix

测试结果:

(1) NUMA Enabled:

NUMA Node(ns)01
079.8136.2
1136.479.7

(2)NUMA Disabled:

NUMA Node(ns)0
0120.8

同时最近在做数据库测试的时候发现:相同的workload,在256G内存和在128G内存上数据库数据导出时长不同,内存使用量约为30G,且256G内存导出时间要远大于128G导出时间”,通过监控查看有数据导出时CPU、Memory、NVMe占用率,结果发现128G内存占用率已经接近70%,而256G内存占用率还不到50%,在这台128G内存机器上查询内存命中率。

numastat 可以看到如下两个数据,第一个是numa_hit:预期的内存在这个节点上成功分配;第二个是指:在这个节点上分配内存,但进程使用了不同的节点。通过上图我们看到了在这台128G内存机器上出现了大量的numa_miss,顾名思义就是产生大量的跨UPI/QPI调用远端内存,因此导致了相同的压力(内存需求30G)在128G和256G内存机器上的差异。

 

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

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

优化:关闭NUMA(优点:减低跨NUMA访问时长,缺点:没有local内存概念,所以本地内存不存在低访问时长的优势)

在不改变内存容量的前提下如何优化呢?基于此做了一个实验,用数据库中的Demo多次进行测试:

这里有个有意思的问题:就是当NUMA:enabled时出现numa_miss时其实整体的运行时间还是会低于NUMA:Disabled;就是因为大量的内存还是优先访问本地,出现少量的miss还不足以导致整体运行时间增加,但如果数据量占用内存过大,或者原本本地内存被各种服务占用,本地内存不够,但remote内存过剩时,可以通过绑定Node节点的方式提高程序运行效率(numactl -N 【socket ID】 -m 【memory ID】)。

可用如下命令查看每个Node内存占用率:

[root@localhost ~]# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35
node 0 size: 130669 MB
node 0 free: 112885 MB
node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45 46 47
node 1 size: 131072 MB
node 1 free: 102788 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10 

 原文链接:https://zhuanlan.zhihu.com/p/371184288 

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

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

相关文章

Elasticsearch与Kibana安装

现有环境 windows docker ubuntu Elasticsearch安装 安装包下载 ES不同平台、版本下载路径:Download Elasticsearch | Elastic 本文演示用linux # 启动ubuntu环境,开放端口9200、9300、5601 docker run -name es -p 9200:9200 -p 9300:9300 -p 5…

指夹式血氧饱和检测仪方案分析

指夹式心率血氧饱和度方案的测量原理是根据血红蛋白(Hb)和氧合血红蛋白 (HbO2)在红光和近红光区域的吸收光谱特性为依据,运用Lambert Beer定律建立数据处理经验公式,采用光电血氧检测技术结合光电容积脉搏波描记(PPG)技术&#xf…

化工制造行业数字化升级案例—基于HK-Domo商业智能分析工具

案例背景导读 世伟洛克(Swagelok)是全球领先的流体系统解决方案的开发商和制造商,为包括科研、仪表、制药、油气、电力、石化、代用燃料和半导体等在内的各个行业提供产品、组装和服务。世伟洛克通过独立的销售和服务中心网站进行运营&#x…

使用 Typescript 封装 Axios

对 axios 二次封装,更加的可配置化、扩展性更加强大灵活 通过 class 类实现,class 具备更强封装性(封装、继承、多态),通过实例化类传入自定义的配置 创建 class 严格要求实例化时传入的配置,拥有更好的代码提示 /*** param {AxiosInstance…

C语言习题练习8--二进制操作符

IO型--从main函数开始写,要写输入、计算、输出 接口型--不需要写主函数,默认主函数是存在的,你只需要完成函数就行 一、二进制中1的个数 (12条消息) C语言丨关键字signed和unsigned 的使用与区别详解_Emily-C的博客-CSDN博客_signed unsi…

【笔记】samba shell 脚本 离线安装 - Ubuntu 20.04

前言 按照官网调试代码、网上各种步骤来走(还收费)都不行 结果发现是防火墙问题 公司服务器安装的ufw使用失效,导致端口号放行添加失败 换用firewall-cmd成功 现在免费放下代码,气死他们收费的 目录 ├── home│ ├── k…

linux备份mysql8.0数据库脚本

文章目录环境要求步骤1、创建一个.sh文件编写shell脚本2、添加定时任务环境要求 linux系统,安装了mysql8.0 步骤 1、创建一个.sh文件编写shell脚本 创建文件的命令: vim ***.shshell文件文件参考自文章 链接 export LANGen_US.UTF-8 #注意&#xf…

测试开发技术:Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

十五、Lua 协同程序(coroutine)的学习

Lua 协同程序(coroutine) 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。 协同是非常强大的功…

2646-61-9, 脯氨酰内肽酶(PEP)底物: Z-GPLGP-OH

编号: 160473中文名称: 脯氨酰内肽酶(PEP)底物:Z-Gly-Pro-Leu-Gly-ProCAS号: 2646-61-9单字母: Z-GPLGP-OH三字母: Cbz-Gly-Pro-Leu-Gly-Pro-COOH氨基酸个数: 5分子式: C28H39O8N5平均分子量: 573.64精确分子量: 573.28等电点(PI): -pH7.0时的…

Arduino程序设计(三) 光照采集 + 温度采集

光照采集 温度采集前言一、光敏电阻检测环境光二、DS18B20检测环境温度总结参考文献前言 本文主要介绍两种常见的传感器采集环境参数,即光照传感器和温度传感器。光照传感器采用光敏电阻GL3516(5-10K)检测环境光。温度传感器采用DS18B20检测…

2022Q3家电行业高增长细分市场分析(含热门品类数据)

2022年,在大环境的影响下,大众消费偏好更趋于理性化、追求高性价比,不少行业增速有所放缓,在此背景下,2022年Q3季度中,消费市场中仍有一些高增长概念涌现。 在家电行业中,我们发现了3个高增长品…

【重识云原生】第六章容器基础6.4.9.5节——端点切片(Endpoint Slices)

1 EndpointSlice特性 Kubernetes v1.21 [stable] 端点切片(EndpointSlices) 是一个新 API,它提供了 Endpoint API 可伸缩和可拓展的替代方案。EndpointSlice 会跟踪 Service Pod 的 IP 地址、端口、readiness 和拓扑信息。 在 Kubernetes v…

一文看懂页面置换算法

页面置换算法分为两类 1、局部页面置换算法 最优页面置换算法(OPT、optimal)先进先出算法(FIFO)最近最久未使用算法(LRU,Least Recently Used)时钟页面置换算法(Clock)最不常用算法…

【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项

文章目录题目描述思路分析bug记录:"error: >> should be > > within a nested template argument list"代码题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个MN字符矩阵,以及一个字符串S,找到在矩阵中所…

给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件

文章目录一、前言二、发现提交的临时文件三、去掉临时文件的方法3.1 添加.gitignore3.2 删除临时文件缓存3.3 添加后的效果一、前言 最近维护代码过程中,发现某APP代码库里被提交了许多临时文件,而这些临时文件每次都会变化,所以导致每次修改…

为什么要写单测

一、什么是单元测试 “在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最…

大屏经典组件:“无限滚动” 从分析到开发

📖阅读本文,你将 理解大屏 “无限滚动组件” 的开发思路跟随作者,一步步完成一个高性能 “无限滚动组件” 的开发收获一份该实现的粗糙源码。 一、无限滚动:事件/告警 的有力帮手 1.1 为什么需要滚动列表 大屏之所以 “炫酷” …

稳压二极管稳压电路如何设计

在一些电流不大的地方,一般毫安级别,有时候我们可以利用稳压二极管去设计一个我们需要的电压。 大家可以看下稳压二极管的伏安曲线 在反向电压下,尽管电流在很大的范围内变化,而稳压二极管两端的电压却基本上稳定在击穿电压附近&a…

[附源码]java毕业设计旅游产品销售管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…