【协议森林】NUMA基本知识
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基本知识相关推荐
- 协议森林06 瑞士军刀 (ICMP协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 到现在为止,我们讲解了网络层中最重要的IP协议(参考协议森林).IP协议的一个重要补充是是ICMP ...
- ipsec协议_网工知识角轻松学网络|三分钟了解PPPOE协议
学网络,就在IE-LAB 国内高端网络工程师培养基地 PPPOE( Point-to-PointProtocol Over Ethernet)以太网上的点对点协议,是将点对点协议(PPP)封装在以太网 ...
- 协议森林08 不放弃 (TCP协议与流通信)
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. TCP(Transportation Control Protocol)协议与IP协议是一同产生的 ...
- ftp协议是一种用于_______的协议_网工知识角|快速理解FTP和TFTP的区别,实用收藏...
点上方蓝字关注公众号,坚持每天技术打卡 学网络,就在IE-LAB 国内最著名的高端网络工程师培养基地 FTP和TFTP的区别是什么 CCNA零基础入门必学 FTP(FileTransfer Proto ...
- 协议森林13 9527 (DNS协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 在周星驰的电影<唐伯虎点秋香>中,周星驰饰演的主角一进入华府,就被强制增加了一个代号9 ...
- 协议森林01 邮差与邮局 (网络协议概观)
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟 ...
- SIP协议(基础技术知识)
SIP协议(基础技术知识) SIP(Session InitiationProtocol)协议是Internet多媒体通信和控制协议体系的一部分,该协议族包括会话描述协议(SDP).会话发布协议(SA ...
- 协议森林14 逆袭 (CIDR与NAT)
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了IPv4地址的耗 ...
- 协议森林05 我尽力 (IP协议详解)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在粗略了解了IP接力和IP地址后,我们再反过来,看一看IP协议的具体细节和设计哲学 ...
- 协议森林10 魔鬼细节 (TCP滑窗管理)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流"通信中,我们建立了滑窗(sliding w ...
最新文章
- nginx thinkphp 配置pathinfo
- Web前端技术分享:什么是块元素?什么是行内元素?
- 洛谷 - P4568 [JLOI2011]飞行路线(分层图最短路)
- AUTOSAR从入门到精通100讲(二十一)-AUTOSAR通信篇—IpduM模块
- 关于团队开发项目的想法
- Android 8.0系统源码分析--开篇
- react 设置背景图片 (等比例显示,不拉伸)
- Windows服务器nginx多个二级域名配置多端口无效问题的解决方案
- java 环境变量 ln s_java的环境变量
- 阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型
- AWVS 10.5 配置选项
- PE安装Win10纯净版教程【附Win10企业版/专业版/64/32位系统下载地址以及系统激活工具和解压软件安装包】
- 作业调度系统--SGE和PBS的使用方法
- 英文字体“磅”(Point)和中文字号的关系
- C# winform表格datagridview行高自动设置问题
- ctf赛题上传一个php木马,从一道CTF题学习PHP反序列化漏洞
- 基于MMS街景的导航数据采集方法研究
- 第5篇 熊猫烧香逆向分析(下)
- vue报错 ‘Cannot find module ‘D:\nodejs\node_modules\npm\bin\npm-cli.js‘
- 教你用微信H5牛牛来玩微信小游戏“跳一跳”