1.简述

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

这样的架构称为UMA(Uniform Memory Access),直译为“统一内存访问”,这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即每个处理器核心共享相同的内存地址空间。但随着CPU核心数的增加,这样的架构难免遇到问题,比如对总线的带宽带来挑战、访问同一块内存的冲突问题。为了解决这些问题,诞生了NUMA。

2.NUMA 基本框架

NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存访问”。这种构架下,不同的内存器件和CPU核心从属不同的 Node,每个 Node 都有自己的集成内存控制器(IMC,Integrated Memory Controller)。在 Node 内部,架构类似SMP,使用 IMC Bus 进行不同核心间的通信;不同的 Node 间通过QPI(Quick Path Interconnect)进行通信:

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

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

3.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
  • CPU 被分成 node 0 和 node 1 两组(这台机器有两个 CPU Socket)。
  • 一组 CPU 分配到 96 GB 的内存(这台机器总共有 192GB 内存)。
  • 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

其他操作:

root@ubuntu:~# numactl -h
numactl: invalid option -- 'h'
usage: numactl [--all | -a] [--interleave= | -i <nodes>] [--preferred= | -p <node>][--physcpubind= | -C <cpus>] [--cpunodebind= | -N <nodes>][--membind= | -m <nodes>] [--localalloc | -l] command args ...numactl [--show | -s]numactl [--hardware | -H]numactl [--length | -l <length>] [--offset | -o <offset>] [--shmmode | -M <shmmode>][--strict | -t][--shmid | -I <id>] --shm | -S <shmkeyfile>[--shmid | -I <id>] --file | -f <tmpfsfile>[--huge | -u] [--touch | -T]memory policy | --dump | -d | --dump-nodes | -Dmemory policy is --interleave | -i, --preferred | -p, --membind | -m, --localalloc | -l
<nodes> is a comma delimited list of node numbers or A-B ranges or all.
Instead of a number a node can also be:netdev:DEV the node connected to network device DEVfile:PATH  the node the block device of path is connected toip:HOST    the node of the network device host routes throughblock:PATH the node of block device pathpci:[seg:]bus:dev[:func] The node of a PCI device
<cpus> is a comma delimited list of cpu numbers or A-B ranges or all
all ranges can be inverted with !
all numbers and ranges can be made cpuset-relative with +
the old --cpubind argument is deprecated.
use --cpunodebind or --physcpubind instead
<length> can have g (GB), m (MB) or k (KB) suffixes

4.测试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%

5.Linux 的 NUMA 策略

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

6.参与讨论

【协议森林】NUMA基本知识相关推荐

  1. 协议森林06 瑞士军刀 (ICMP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 到现在为止,我们讲解了网络层中最重要的IP协议(参考协议森林).IP协议的一个重要补充是是ICMP ...

  2. ipsec协议_网工知识角轻松学网络|三分钟了解PPPOE协议

    学网络,就在IE-LAB 国内高端网络工程师培养基地 PPPOE( Point-to-PointProtocol Over Ethernet)以太网上的点对点协议,是将点对点协议(PPP)封装在以太网 ...

  3. 协议森林08 不放弃 (TCP协议与流通信)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. TCP(Transportation Control Protocol)协议与IP协议是一同产生的 ...

  4. ftp协议是一种用于_______的协议_网工知识角|快速理解FTP和TFTP的区别,实用收藏...

    点上方蓝字关注公众号,坚持每天技术打卡 学网络,就在IE-LAB 国内最著名的高端网络工程师培养基地 FTP和TFTP的区别是什么 CCNA零基础入门必学 FTP(FileTransfer Proto ...

  5. 协议森林13 9527 (DNS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 在周星驰的电影<唐伯虎点秋香>中,周星驰饰演的主角一进入华府,就被强制增加了一个代号9 ...

  6. 协议森林01 邮差与邮局 (网络协议概观)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟 ...

  7. SIP协议(基础技术知识)

    SIP协议(基础技术知识) SIP(Session InitiationProtocol)协议是Internet多媒体通信和控制协议体系的一部分,该协议族包括会话描述协议(SDP).会话发布协议(SA ...

  8. 协议森林14 逆袭 (CIDR与NAT)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了IPv4地址的耗 ...

  9. 协议森林05 我尽力 (IP协议详解)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在粗略了解了IP接力和IP地址后,我们再反过来,看一看IP协议的具体细节和设计哲学 ...

  10. 协议森林10 魔鬼细节 (TCP滑窗管理)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流"通信中,我们建立了滑窗(sliding w ...

最新文章

  1. nginx thinkphp 配置pathinfo
  2. Web前端技术分享:什么是块元素?什么是行内元素?
  3. 洛谷 - P4568 [JLOI2011]飞行路线(分层图最短路)
  4. AUTOSAR从入门到精通100讲(二十一)-AUTOSAR通信篇—IpduM模块
  5. 关于团队开发项目的想法
  6. Android 8.0系统源码分析--开篇
  7. react 设置背景图片 (等比例显示,不拉伸)
  8. Windows服务器nginx多个二级域名配置多端口无效问题的解决方案
  9. java 环境变量 ln s_java的环境变量
  10. 阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型
  11. AWVS 10.5 配置选项
  12. PE安装Win10纯净版教程【附Win10企业版/专业版/64/32位系统下载地址以及系统激活工具和解压软件安装包】
  13. 作业调度系统--SGE和PBS的使用方法
  14. 英文字体“磅”(Point)和中文字号的关系
  15. C# winform表格datagridview行高自动设置问题
  16. ctf赛题上传一个php木马,从一道CTF题学习PHP反序列化漏洞
  17. 基于MMS街景的导航数据采集方法研究
  18. 第5篇 熊猫烧香逆向分析(下)
  19. vue报错 ‘Cannot find module ‘D:\nodejs\node_modules\npm\bin\npm-cli.js‘
  20. 教你用微信H5牛牛来玩微信小游戏“跳一跳”

热门文章

  1. 链表:判断链表是否有环以及找入口
  2. OSChina 周五乱弹 —— 买个 6s 送老师
  3. 人形AI捉迷藏惊煞网友:飞檐走壁纯靠自学,表情丰富还会合作
  4. 首台纯电动跑车Battista将全球首发,加速性能超过F1赛车
  5. lettuce学习笔记
  6. 【布局优化】基于粒子群算法求解集线器位置分配问题附matlab代码
  7. 关于Assert.assertEquals报错的处理
  8. 移动平台处理器(不断更新中)
  9. 找不到虚拟机监控程序,请启用虚拟机监控程序支持(打开Windows Sandbox提示)
  10. 如何挑选合适的海外HTTP代理?海外IP哪家强