NUMA详解
目录
NUMA简介
NUMA开启与关闭
查看系统是否支持
关闭方法
numactl --hardware介绍
没有安装numactl工具下查看NUMA架构节点数:
查看每个NUMA节点的CPU使用情况:
看每个NUMA节点的内存使用情况:
查看NUMA下指定进程的运行情况
创建新进程时,指定NUMA的相关属性
新进程在指定节点上运行
新进程在所有节点上运行
NUMA简介
Numa(Non-Uniform Memory Access)是一种计算机架构,它允许多个处理器通过共享内存来访问系统的物理内存,但是不同的内存区域可能由不同的处理器处理,这种内存访问方式被称为“非一致性内存访问”。在这种架构中,每个处理器都有自己的本地内存,但它们可以访问其他处理器的内存。这种架构可以提高多处理器系统的性能,并使系统更具可扩展性。

在Numa系统中,每个处理器有一个本地内存子系统,每个本地内存子系统都连接到一个全局内存交换网络。当处理器需要访问内存时,它们可以通过本地内存子系统直接访问本地内存,或者通过全局内存交换网络来访问远程内存。由于本地内存访问速度更快,因此在处理器需要访问本地内存时,它们会尽可能使用本地内存。
Numa架构通常用于高性能计算领域,例如科学模拟和数据分析等领域,以及大型企业服务器等需要高度可扩展性和性能的领域。
NUMA开启与关闭
查看系统是否支持
在大多数情况下,Numa是在硬件级别上实现的,并且通常无法通过软件直接开启或关闭。因此,如果你要使用Numa架构,你需要选择支持Numa的硬件。在现代的多处理器系统中,大多数服务器和工作站都支持Numa。
但是,在某些情况下,操作系统可能会使用不同的策略来管理内存访问,这可能会影响Numa性能。在Linux操作系统中,你可以使用numactl命令来管理Numa策略和配置。例如,可以使用numactl命令将进程绑定到特定的处理器和内存节点,以最大化Numa性能。可以使用以下命令来检查系统是否支持Numa:
$ numactl --hardware
如果系统中没有安装 numactl 工具,需要先安装该工具。在大多数 Linux 发行版中,可以使用以下命令进行安装:
sudo apt-get install numactl # Ubuntu/Debian
sudo yum install numactl # CentOS/Fedora
如果系统支持Numa,它将输出每个处理器和内存节点的详细信息。如果系统不支持Numa,则该命令将输出错误消息。
关闭方法
默认情况下在支持NUMA的硬件上,NUMA是开启的,有时 NUMA 会因为跨区域访问内存,导致速度变慢,因此可以通过 grub.conf 文件修改内存参数 numa=off,关闭该功能。
numactl --hardware介绍
[root@zyq ~]# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
node 0 size: 261726 MB
node 0 free: 119515 MB
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
node 1 size: 262144 MB
node 1 free: 118662 MB
node distances:
node 0 1 0: 10 21 1: 21 10
以上输出显示当前系统中有两个节点,分别是节点0和节点1。节点0具有16个物理CPU核心(编号为0到15和32到47),内存大小为261726 MB,可用内存大小为119515 MB。节点1具有与节点0相同数量的物理CPU核心,内存大小为262144 MB,可用内存大小为118662 MB。
表中最后三行的数字表示两个节点之间的距离,这是访问跨节点内存的相对延迟或成本的一种度量。在这种情况下,从节点0到节点0的距离为10,这意味着访问同一节点上的内存比访问另一个节点上的内存更快,后者的距离为21。类似地,从节点1到节点0的距离为21,而从节点1到节点1的距离为10。
没有安装numactl工具下查看NUMA架构节点数:
lscpu | grep numa -i
[secure@zyq ~]$ lscpu | grep numa -i
NUMA node(s): 2
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63
[secure@bj05-compute-10e33e16e229 ~]$
查看每个NUMA节点的CPU使用情况:
[secure@zyq ~]$ numastat -cPer-node numastat info (in MBs):Node 0 Node 1 Total---------- ----------- -----------
Numa_Hit 7216207925 10168038929 17384246853
Numa_Miss 0 0 0
Numa_Foreign 0 0 0
Interleave_Hit 440 437 876
Local_Node 7216168500 10167963974 17384132473
Other_Node 39425 74955 114380
以下是每个统计量的含义:
- Numa_Hit:表示进程成功从该节点的本地内存中获取的内存总量(单位为MB)。
- Numa_Miss:表示进程无法从该节点的本地内存中获取所需内存的总量(单位为MB)。
- Numa_Foreign:表示由于数据已从本地节点迁移而进程在远程 NUMA 节点上访问的内存总量(单位为MB)。
- Interleave_Hit:表示进程从多个节点交错分配的内存中获取的总量(单位为MB)。
- Local_Node:表示进程在每个节点的本地内存中使用的总量(单位为MB)。
- Other_Node:表示在该节点上分配了内存,但无法确定该内存被哪个节点使用,这可能是由于内存映射不完全或跨节点的共享内存导致的。
- Node 0:表示第一个NUMA节点的总内存使用情况(单位为MB)。
- Node 1:表示第二个NUMA节点的总内存使用情况(单位为MB)。
- Total:表示所有节点的总内存使用情况(单位为MB)。
numastat -c命令的输出表示的是自系统启动以来的历史内存使用情况
该输出表明:
- 进程所有访问基本都在在本地节点上完成的,只有很少量内存访问不能确定是否为跨CPU访问。
看每个NUMA节点的内存使用情况:
[secure@zyq ~]$ numastat -mPer-node system memory usage (in MBs):Node 0 Node 1 Total--------------- --------------- ---------------
MemTotal 384921.56 386909.59 771831.15
MemFree 29070.13 31174.23 60244.37
MemUsed 355851.43 355735.36 711586.79
Active 3402.52 4861.70 8264.22
Inactive 1912.20 1788.92 3701.12
Active(anon) 3268.76 4442.04 7710.80
Inactive(anon) 372.28 811.39 1183.66
Active(file) 133.76 419.67 553.43
Inactive(file) 1539.93 977.54 2517.46
Unevictable 897.04 417.89 1314.93
Mlocked 897.04 417.89 1314.93
Dirty 0.04 0.05 0.08
Writeback 0.00 0.00 0.00
FilePages 3111.70 4089.79 7201.49
Mapped 94.89 375.35 470.24
AnonPages 2887.79 2681.98 5569.77
Shmem 1434.30 2680.70 4114.99
KernelStack 18.70 21.51 40.20
PageTables 18.21 20.61 38.83
NFS_Unstable 0.00 0.00 0.00
Bounce 0.00 0.00 0.00
WritebackTmp 0.00 0.00 0.00
Slab 491.14 548.34 1039.48
SReclaimable 181.18 133.42 314.61
SUnreclaim 309.96 414.92 724.88
AnonHugePages 2170.00 1902.00 4072.00
ShmemHugePages 0.00 0.00 0.00
ShmemPmdMapped 0.00 0.00 0.00
HugePages_Total 345088.00 344064.00 689152.00
HugePages_Free 219136.00 145408.00 364544.00
HugePages_Surp 0.00 0.00 0.00
[secure@bj05-compute-s6-10e33e18e78 ~]$ free -gtotal used free shared buff/cache available
Mem: 753 687 58 4 7 56
Swap: 0 0 0
MemFree显示每个节点当前可用的内存。
查看NUMA下指定进程的运行情况
numastat -p <pid>
其中,<pid> 是要查看的进程 ID。该命令将显示指定进程在每个节点上的 CPU 使用情况。以下是一个kvm虚拟机进程示例输出:
[root@zyq ~]# numastat -p 4080714Per-node process memory usage (in MBs) for PID 4080714 (qemu-kvm)Node 0 Node 1 Total--------------- --------------- ---------------
Huge 16384.00 0.00 16384.00
Heap 77.62 0.00 77.62
Stack 0.91 0.00 0.91
Private 204.70 35.27 239.96
---------------- --------------- --------------- ---------------
Total 16667.22 35.27 16702.48
[root@bj05-compute-s6-10e33e18e78 ~]#
该输出表明,进程的主要 CPU 使用量在节点 0上,而在其他节点上几乎没有 CPU 使用量。
numastat命令本身并不知道该进程是qemu-kvm进程。输出中显示的进程名称是由操作系统内核提供的,通过查询进程的PID获取。在该输出中,操作系统内核提供了PID为4080714的进程的相关信息,并将其标记为qemu-kvm进程。因此,numastat命令只是输出了该进程在 NUMA 节点上的内存使用情况,并没有直接提供关于该进程的详细信息,如进程名称、用户、进程状态等等
创建新进程时,指定NUMA的相关属性
新进程在指定节点上运行
要在创建进程时指定NUMA相关信息,可以使用numactl命令的--membind和--cpunodebind选项。--membind选项用于将进程的内存绑定到指定的NUMA节点,而--cpunodebind选项用于将进程的CPU绑定到指定的NUMA节点。
例如,要将一个名为myprog的进程绑定到NUMA节点0上的内存和CPU,可以使用以下命令:
numactl --membind=0 --cpunodebind=0 ./myprog
这将创建一个进程,它的内存和CPU都绑定在NUMA节点0上。可以根据需要将--membind和--cpunodebind选项设置为不同的NUMA节点编号。
新进程在所有节点上运行
要将进程绑定到所有的CPU和内存上,您可以使用numactl命令的--interleave=all选项。这将使操作系统在所有NUMA节点之间交错分配内存,从而使进程能够在所有的NUMA节点上运行。
以下是一个使用numactl命令将进程绑定到所有CPU和内存上的示例:
numactl --interleave=all ./myprog
这将创建一个进程,它的内存将被交错分配到所有的NUMA节点上,从而使进程能够在所有的NUMA节点上运行。CPU将被自动绑定到系统中可用的所有CPU上。
需要注意的是,将进程绑定到所有的CPU和内存上可能会影响性能,因为在NUMA节点之间交错分配内存可能会导致额外的内存访问延迟。因此,在使用--interleave=all选项时,需要谨慎考虑其对性能的影响,并进行必要的基准测试和优化。
相关文章:
NUMA详解
目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数: 查看每个NUMA节点的CPU使用情况: 看每个NUMA节点的内存使用情况: 查看NUMA下指定进程的运行情况 创建…...
H68K在Armbina系统下开AP
背景需求替代路由器,网上找了一大堆都不行 最后成功开启了AP 参考了两篇文章, 一篇是如何创建热点, 一篇是如何开启5G 树莓派4B创建5Ghz WiFi热点 – 风声 https://www.hncldz.com/2020/02/01/%e6%a0%91%e8%8e%93%e6%b4%be4b%e5%88%9b%e5%bb%ba5ghz-wifi%e7%83%ad%e7%82%b…...
还不懂Redis?看完这个故事就明白了!
还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…...
Haproxy负载均衡集群
1.Haproxy支持四层和七层 2.haproxy常用的调度算法? 3.LSV/NGINX/HAPROXT的区别? 4. 5.Haproy负载均衡部署 实验需求 利用Haproxy的运用配置出负载均衡调度器,以此来调用两台Nginx服务器进行工作 实验所需组件 Haproxy服务器:192…...
17.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度
说明书 MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度 关键词:碳捕集 虚拟电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》完全复现 仿真平台:…...
企业数字化管理中,数据治理到底怎么“治”
随着信息化、数字化的理念、技术及其应用在社会的方方面面进行扩散,数据的规模和丰富程度已经达到了一个新的高度,所以当下如何更进一步利用好数据,充分发挥数据的价值,将其真正变为高质量的数据资产成为了企业要面对的重要问题&a…...
《HelloGitHub》第 85 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …...
自动驾驶人机交互HMI产品技术方案
1. 概述 1.1 目的 本文档描述集卡自动驾驶系统中HMI产品的技术方案,设计人员遵循本方案进行设计,为项目开发实施提供技术方案保障。 1.2 范围 本文档适用于HMI产品项目。本文档用于指导HMI产品项目的UI、前端开发过程。 1.3 术语与缩写 术语/缩写 描述 HMI...
开发感悟20230426
一、element-ui样式设置 1. 可以直接在css中写个样式文件,把对应的类名改写样式,然后在main.js中引用,可以覆盖上面的,如果想给element-ui设置样式,不用设置deep了 2.可以直接修改引入的element-ui的样式,…...
C和C++的区别
C和C的区别 1、面向对象编程:C是面向对象的语言,而C语言则不支持面向对象编程。C提供了类、对象、封装、继承、多态等面向对象的特性,使得程序结构更加清晰、可读性更强。2、模板:C提供了模板的特性,使得程序员可以通…...
【力扣-141】 环形链表 + 【力扣-142】 环形链表 II
🖊作者 : Djx_hmbb 📘专栏 : 数据结构 😆今日分享 : 霍桑效应(霍索恩效应) : 是指那些意识到自己正在被别人观察的个人具有改变自己行为的倾向。 霍桑效应告诉我们:从旁人的角度,善意的谎言和夸奖真的可以造就一个人&a…...
云计算:优势与未来趋势
文章目录 前言一、云计算的优势1. 降低IT成本2. 提高工作效率3. 提高业务的可靠性和稳定性4. 提升安全性 二、未来发展趋势1. AI与云计算的融合2. 边缘计算的发展3. 多云的趋势4. 服务器和存储的创新 三、 行业应用案例1.金融行业2.医疗保健行业3.教育行业4.零售和物流行业 四、…...
Linux namespace
前言 从《initrd&init进程》可知,我们通过ssh连接linux服务器,其实主是linux启动一shell进程与我们做交互。而Linux又是多租户的,这使用得用户与用户间产生了,资源的争抢。 如何隔离资源,且让用户都无法察觉&…...
第十三章 移动和旋转(上)
移动和旋转是游戏对象最频繁地操作。我们上个章节简单介绍了Cube的移动和旋转。移动是修改transform的position属性,旋转是修改transform的eulerAngles(欧拉角)属性,两者属性值均可以使用Vector3向量来实现。需要大家注意的是&…...
视频文件切片
1.为什么网络点播系统使用m3u8更有优势?为何点播要用M3U8来搞?存成一个文件不更好吗? 一个MP4文件可能几百M或几个G,如果读取整个MP4文件的信息并且需要下载一段内容,首次打开播放超慢(加载时间长)。如果把…...
维生素的缺乏与生理功能,是否需要补充维生素【持续学习】
health & nutrition 学习自河南大学丁勇老师:https://space.bilibili.com/510028707 去医院查体内维生素缺啥:营养科或内科开单子 直接门诊查个维生素就可以。9项不到600块 正常吃饭,保湿和防晒 伤口愈合慢——蛋白质,vc 干燥…...
CUDA下载,以及下载GPU版本的pytorch
一、下载anaconda 因为这步我之前就下好了,主要参考这个链接:史上最全最详细的Anaconda安装教程 二、下载CUDA 1.首先观察自己需要什么版本的CUDA,以及是否安装过CUDA 先cmd,输入命令 nvidia-smi结果如下,所以我们…...
学习笔记:c存储类
✨博文作者:烟雨孤舟 💖 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 文章目录 目录 文章目录 简介 auto 存储类 register 存储类 static 存储类 extern 存储类 总结 简介 存储类定义 C 程序中变量/函数的的存储位置…...
236. 二叉树的最近公共祖先【190】
难度等级:中等 上一篇算法: 103. 二叉树的锯齿形层序遍历【191】 力扣此题地址: 236. 二叉树的最近公共祖先 - 力扣(Leetcode) 1.题目:236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点…...
即时配送,即时很重要!商家能不能盈利,“快”是源头
“家里水果没有了,选几样叫个跑腿送来吧。” “现在得囤点布洛芬了,我从网上下单。” “同城配送真是太及时、太方便了。” 最近一段时间,如果要问有什么产业突然兴起的话,即时零售无疑是市场最受欢迎的产业。甚至有种说法&…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
