首页 > 其他分享 >什么是 NUMA

什么是 NUMA

时间:2024-10-10 10:21:36浏览次数:8  
标签:node numactl -- 什么 NUMA CPU 内存

什么是 NUMA?

早期的计算机,内存控制器还没有整合进 CPU,所有的内存访问都需要经过北桥芯片来完成。如下图所示,CPU 通过前端总线(FSB,Front Side Bus)连接到北桥芯片,然后北桥芯片连接到内存——内存控制器集成在北桥芯片里面。

这种架构被称为 UMA1(Uniform Memory Access, 一致性内存访问 ):总线模型保证了 CPU 的所有内存访问都是一致的,不必考虑不同内存地址之间的差异。

在 UMA 架构下,CPU 和内存之间的通信全部都要通过前端总线。而提高性能的方式,就是不断地提高 CPU、前端总线和内存的工作频率。

后面的故事,大部分人都很清楚:因为物理条件的限制,不断提高工作频率的路子走不下去了。CPU 性能的提升开始从提高主频转向增加 CPU 数量(多核、多 CPU)。越来越多的 CPU 对前端总线的争用,使前端总线成为了瓶颈。为了消除 UMA 架构的瓶颈,NUMA2(Non-Uniform Memory Access, 非一致性内存访问)架构诞生了:

  1. CPU 厂商把内存控制器集成到 CPU 内部,一般一个 CPU socket 会有一个独立的内存控制器。
  2. 每个 CPU scoket 独立连接到一部分内存,这部分 CPU 直连的内存称为“本地内存”。
  3. CPU 之间通过 QPI(Quick Path Interconnect) 总线进行连接。CPU 可以通过 QPI 总线访问不和自己直连的“远程内存”。

和 UMA 架构不同,在 NUMA 架构下,内存的访问出现了本地和远程的区别:访问远程内存的延时会明显高于访问本地内存。

NUMA 的设置

Linux 有一个命令 numactl3 可以查看或设置 NUMA 信息。

  • 执行 numactl --hardware 可以查看硬件对 NUMA 的支持信息:

# 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 16 17 18 19 20 21 22 23 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

node 0 size: 96920 MB

node 0 free: 2951 MB

node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

node 1 size: 98304 MB

node 1 free: 33 MB

node distances:

node   0   1

  0:  10  21

  1:  21  10

  1. CPU 被分成 node 0 和 node 1 两组(这台机器有两个 CPU Socket)。
  2. 一组 CPU 分配到 96 GB 的内存(这台机器总共有 192GB 内存)。
  3. node distances 是一个二维矩阵,node[i][j] 表示 node i 访问 node j 的内存的相对距离。比如 node 0 访问 node 0 的内存的距离是 10,而 node 0 访问 node 1 的内存的距离是 21。
  • 执行 numactl --show 显示当前的 NUMA 设置:

# numactl --show

policy: default

preferred node: current

physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

cpubind: 0 1

nodebind: 0 1

membind: 0 1

  • numactl 命令还有几个重要选项:
  1. --cpubind=0: 绑定到 node 0 的 CPU 上执行。
  2. --membind=1: 只在 node 1 上分配内存。
  3. --interleave=nodes:nodes 可以是 all、N,N,N 或 N-N,表示在 nodes 上轮循(round robin)分配内存。
  4. --physcpubind=cpus:cpus 是 /proc/cpuinfo 中的 processor(超线程) 字段,cpus 的格式与 --interleave=nodes 一样,表示绑定到 cpus 上运行。
  5. --preferred=1: 优先考虑从 node 1 上分配内存。
  • numactl 命令的几个例子:

# 运行 test_program 程序,参数是 argument,绑定到 node 0 的 CPU 和 node 1 的内存

numactl --cpubind=0 --membind=1 test_program arguments

# 在 processor 0-4,8-12 上运行 test_program

numactl --physcpubind=0-4,8-12 test_program arguments

# 轮询分配内存

numactl --interleave=all test_program arguments

# 优先考虑从 node 1 上分配内存

numactl --preferred=1

测试 NUMA

#include <sys/time.h>

#include <iostream>

#include <string>

#include <vector>

int main(int argc, char** argv) {

  int size = std::stoi(argv[1]);

  std::vector<std::vector<uint64_t>> data(size, std::vector<uint64_t>(size));

  struct timeval b;

  gettimeofday(&b, nullptr);

  # 按列遍历,避免 CPU cache 的影响

  for (int col = 0; col < size; ++col) {

    for (int row = 0; row < size; ++row) {

      data[row][col] = rand();

    }

  }

  struct timeval e;

  gettimeofday(&e, nullptr);

  std::cout << "Use time "

            << e.tv_sec * 1000000 + e.tv_usec - b.tv_sec * 1000000 - b.tv_usec

            << "us" << std::endl;

}

# numactl --cpubind=0 --membind=0 ./numa_test 20000

Use time 16465637us

# numactl --cpubind=0 --membind=1 ./numa_test 20000

Use time 21402436us

可以看出,测试程序使用远程内存比使用本地内存慢了接近 30%

Linux 的 NUMA 策略

Linux 识别到 NUMA 架构后,默认的内存分配方案是:优先从本地分配内存。如果本地内存不足,优先淘汰本地内存中无用的内存。使内存页尽可能地和调用线程处在同一个 node。

这种默认策略在不需要分配大量内存的应用上一般没什么问题。但是对于数据库这种可能分配超过一个 NUMA node 的内存量的应用来说,可能会引起一些奇怪的性能问题。

下面是在网上看到的的例子:由于 Linux 默认的 NUMA 内存分配策略,导致 MySQL 在内存比较充足的情况下,出现大量内存页被换出,造成性能抖动的问题。

  • The MySQL “swap insanity” problem and the effects of the NUMA architecture4
  • A brief update on NUMA and MySQL5

参考资料

  1. UMA(Uniform Memory Access, 一致性内存访问):https://en.wikipedia.org/wiki/Uniform_memory_access
  2. NUMA(Non-Uniform Memory Access, 非一致性内存访问):https://en.wikipedia.org/wiki/Non-uniform_memory_access
  3. numactl:https://linux.die.net/man/8/numactl
  4. The MySQL “swap insanity” problem and the effects of the NUMA architecture:http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
  5. A brief update on NUMA and MySQL:http://blog.jcole.us/2012/04/16/a-brief-update-on-numa-and-mysql/
  6. NUMA架构的CPU -- 你真的用好了么?:http://cenalulu.github.io/linux/numa/
  7. Thread and Memory Placement on NUMA Systems: Asymmetry Matters:https://www.usenix.org/conference/atc15/technical-session/presentation/lepers
  8. NUMA (Non-Uniform Memory Access): An Overview:https://queue.acm.org/detail.cfm?id=2513149
  9. NUMA Memory Policy:https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html
  10. What is NUMA?:https://www.kernel.org/doc/html/lat

标签:node,numactl,--,什么,NUMA,CPU,内存
From: https://blog.csdn.net/lwexin/article/details/142751315

相关文章

  • 最通俗理解python中的self究竟是什么?
    python中,self是一个类的方法(构造函数)中第一个参数,表示实例自身。简单来说,它让类的方法能够访问属于该实例的属性和方法。我们可以把self想象成你在类内部给实例(实参)的“自我指代”,表示这个实例“我自己”的什么什么性质。类比和形象解释:假设你有一张学生表,每个学生有自己......
  • 2024诺贝尔物理学奖,为什么颁给了人工智能
    瑞典皇家科学院当地时间10月8日宣布,将2024年诺贝尔物理学奖授予约翰·J·霍普菲尔德和杰弗里·E·辛顿,表彰他们在使用人工神经网络进行机器学习的基础性发现和发明。两位获奖者从20世纪80年代起就开展了与物理学相关的人工神经网络的重要工作。这让很多网友“满头问号”。诺贝尔......
  • 海豹06 DM-i试驾报告:我为什么会看中它,新车优缺点是什么?
    我的座驾,已经陪伴我四五年时光。随着智能化和配置的不断更新,我的爱车似乎逐渐显得有些落伍,因此,换车的念头不时在我心中浮现。海豹06DM-i恰好符合我的期待,早在它上市前,我便已经试驾过,对其颜值和驾控表现都颇为满意。新车上市后,比亚迪再次邀请我进行油耗体验,带着换车的目的,我对这次......
  • 小白科普:AI 到底是什么,终于有人讲清楚了
    本小册主要是针对AI初学者的小白用户,那么第一篇肯定就是给大家科普一下,到底什么是AI呢?AI是“人工智能”的缩写,它听起来好像很复杂,但其实它就像一个超级聪明的机器人朋友,可以帮助我们做很多事情哦!1.什么是AI?想象一下,如果你有一个机器人,它能够听懂你的话,帮你做作业,甚至和......
  • 学校想要手机序列号有什么用
    学校想要手机序列号有什么用学校想要手机序列号有什么用?有你的IMEI和手机号就可以翻译成MSISSD这个在基站那里可以监听你所有通信和短信截取你所有的通讯数据包,当然学校是没有能力破解的,从学校的权限看监听通话短信和破解你的通讯数据这不太可能,这是违法的,但是定位监控通信行......
  • 自学黑客技术,看这5本好书就够了!【自学黑客技术该看什么书】零基础入门到精通,收藏这篇
    想自学黑客技术,看这5本好书就可以了,直接给你省去2万块钱的学费!第一本,《黑客入门》不管你有没有基础,你都可以用这本书来打开黑客世界的大门,里面包含了各种新手应该掌握的技术和工具。第二本,《KaliLinux高级渗透测试》不会kali的黑客不是好黑客,卡里就像一个武器库,里面......
  • 探究AudioPolicyManager.cpp中的成员变量mAvailableOutputDevices/InputDevices是根据
    2024-09-2310:29:48.792286-445APM-AudioPolicyEnginepid-286Wframeworks/av/services/audiopolicy/enginedefault/src/Engine.cpp:getDeviceForStrategyInt:2782024-09-2310:29:48.792286-445AudioFlingerpid......
  • ChaosBlade 的应用场景有哪些?为什么需要
    ChaosBlade的应用场景主要集中在以下几个方面,它可以帮助开发人员和运维团队更好地了解和改进系统的稳定性、可靠性以及容错性:1.系统容错性测试:ChaosBlade可以模拟各种故障,如网络延迟、网络分区、系统资源耗尽等,从而测试系统在异常情况下的表现。这有助于发现系统中的潜在问题,......
  • 在K8S中,初始化容器(initcontainer)作用是什么?
    在Kubernetes(K8s)中,初始化容器(InitContainer)是一种特殊的容器,它在Pod的主容器启动之前运行,并执行一系列初始化任务。以下是关于初始化容器作用的详细解释:1.定义与特性定义:初始化容器是定义在Pod规格中的一个或多个容器,它们在Pod中的任何应用程序容器(即普通的容器)启动之前执行。......
  • 什么是字节码,JAVASE,Oracle JDK 总结
     JAVASE和JAVAEEJavaSE(JavaPlatform,StandardEdition):Java平台标准版,Java编程语言的基础,它包含了支持Java应用程序开发和运行的核心类库以及虚拟机等核心组件。JavaSE可以用于构建桌面应用程序或简单的服务器应用程序。JavaEE(JavaPlatform,EnterpriseEdition):Ja......